[汉字拼音库的制作]3000汉字 拼音 符号库
[摘 要]我使用了输入法生成器利用他的逆转化得到了一个纯文本的库。对于只用每个汉字的拼音来说这些词组是没有用的。于是开始找原因,是打开的方式不对?换成随机的还是二进制的?中国的字有三个多音字的啊?于是编了一个程序测一下最多的多音字。
[关键词]汉字拼音库 输入法 输入法生成器 VB 多音字
[中图分类号]TP[文献标识码]A[文章编号]1007-9416(2010)02-0056-03
日前,笔者编了一个查寻的程序,查寻时得输入一个库中有的记录,如果库中没有,那查寻结果就什么也没有了。例如:库中有一个王小树的记录,在查寻时,一定要输入“王小树”,如果输成“王晓树”则找不到“王小树”的记录。为了能实现不论你输什么样的“王晓竖”都能找到“王小树”的记录,我制作了一个汉字的拼音库,呵呵,当然不是先把字典拿来,照着字典一个一个打进去,那样得把我累死,就是累死也不能保证完全正确。制作方法如下:
首先,我使用了输入法生成器利用他的逆转化得到了一个纯文本的库。Winxp的输入法生成器在附件中就能找到,Win2000的输入法生成器在系统盘:\Program Files\Windows NT\Accessories,文件名是:Imegen.exe。执行这个文件,界面如图1。
在逆转换中选择打开文件选择一个拼音输入法码表我选的是系统盘下:\WINNT\system32中的WINPY.MB,如图2。
点逆转换,E:\WINNT\system32\WINPY.TXT这个文件就生成了。(也可以生成到别的地方,用别的文件名)用记事本打开如下:
[Description]
Name=全拼
MaxCodes=12
MaxElement=1
UsedCodes=abcdefghijklmnopqrstuvwxyz
WildChar=?
NumRules=3
[Rule]
ca4=p10+p20+p30+p40
ce2=p10+p20
ce3=p10+p20+p30
[Text]
啊a
阿a
呵a
吖a
……
下面就是汉字拼音库了,汉字后面跟的是这个字的拼音,这下好了吧,把[Text]上面的内容del了,形成文件1.txt,这个字库就能用了吧?没那么简单,还有麻烦事呢。继续往下看这个文件发现如下内容:
不识大体bushidati
不失时机bushishiji
不识时务bushishiwu
不失为bushiwei
不适应bushiying
不使用武力bushiyongwul
……
这些都是拼音输入法中的词组,对于只用每个汉字的拼音来说这些词组是没有用的。于是得删去库中所有词组。
当然也不能人为去删了,为此,我认为用VB的文件操作可以解决这个问题。于是打开VB,在Form1上添加了一个按钮,在按钮的单击事件中填加入下代码:
Private Sub Command1_Click()
Dim a As String * 100
‘定义一个长一点的字符串,用来读出每条记录。
Dim b, c As String
‘定义要用到的中间变量
Dim i As Integer
‘定义循环变量
Dim L, k As Integer
‘定义一个用长度变量,一个汉字数变量
Open "F:\汉字\1.txt" For Input As #1
‘打开刚才删完的字库
Open "f:\汉字\2.txt" For Output As #2
‘打开要生成的新的字库
Do While Not (EOF(1))
‘1号文件结束了处理也就完成了
Input #1, a
‘读出一条记录
b = Trim (a)
‘剪除记录前后的空格
L = Len(b)
‘测量记录的长度
k = 0
‘汉字数归零
For i = 1 To L
‘遍历记录字符串
c = Mid(b, i, 1)
‘在记录中从头至尾取单个字符
If Not (Asc(c) >= 0 And Asc(c) 本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文 Next
Close #2
‘读完了就关上,这是个优点
For i = 1 To 27901
‘工作开始了,遍历每个记录
If a(i) <> " " Then
‘如果记录不是一个空格进行如下操作,空格下面程序
‘形成的。以代表这个记录已处理完毕
For m = 0 To 16
‘b数组与c数组清空
b(m) = ""
c(m) = ""
Next
b(0) = Right(a(i), Len(a(i)) - 1)
‘取出记录后面的注音
b(0) = Trim(b(0))
‘以防有空格,先剪一下
k = 1
‘证明有至少有一个注音了
For j = i + 1 To 27901
‘遍历本记以后的记录,查找相同的汉字记录
If Left(a(i), 1) = Left(a(j), 1) Then
‘如果汉字相同,哪么进行如下操作
b(k) = Right(a(j), Len(a(j)) - 1)
‘取出汉字后面的注音
b(k) = Trim(b(k))
‘以防万一,剪除前后空格
k = k + 1
‘数组下一成员
a(j) = " "
‘记录清空,用一空格代替
End If
Next
k = 0
‘k在以上表示共有一个汉字的几个记录,下面代
‘表共有几个读音
For m = 0 To 16
‘本循环为c数组赋值
If b(m) <> "" Then
‘b数组成员如不为空,证明有注音
If InStr(b(m), " ") <> 0 Then
‘如果b数级成员有空格,证明有两个注音
c(k) = Left(b(m), InStr(b(m), " ") - 1)
‘有两个注音就分赋于两个
c(k + 1) = Right(b(m), Len(b(m)) - InStr(b(m), " "))
‘c数组成员
k = k + 2
Else
c(k) = b(m)
‘有一个注音就赋于一个c数组成员
k = k + 1
End If
End If
Next
For m = 0 To 16
‘两个循环嵌套用来清除c数组中值相同
For n = m + 1 To 16
‘的成员
If c(m) = c(n) Then c(n) = ""
‘值相同的去掉
Next
Next
For m = 1 To 16
‘这个循环把所有拼音加在一起
If c(m) <> "" Then c(0) = c(0) & " " & c(m)
Next
Print #3, Left(a(i), 1) & c(0)
‘给新文件添加数据
End If
Next
Close
‘完成后要关闭所有文件
End Sub
程序编完后,(当然不是一次完成的,中途还改了语法错误)运行,机器象死了一样,我等了好久,(其实也没有多久才几分钟),程序运行完毕,找到新生成的库文件00.txt,打开一看如下:
啊a e
阿a e
呵a ha he ke
吖a ya
嗄a sha xia
腌a yan
锕a ke
�a ke
�aes
……
再查一下“呵”字,只找到一次,找一下“哪”字,“哪na nai ne nei nuo”也只找到一次,注音确实不少,如果再标上一二三四声,还真说不定有八个读音呢。(我打开金山词霸,发现“哪”有五个读音)。
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文