两个py文件,一个是利用文本训练并保存,另外一个是拼音转汉字,基于隐马尔可夫模型HMM,拼音输入法可以按注音符号与汉语拼音两种汉字拼音方案分成两大类。汉语拼音输入法的编码是依据汉语拼音方案(汉字的读音)进行输入的一类中文输入法。早期只有全拼这种方式,即完全依照汉字的整个音节来输入。随着技术的发展,拼音输入法不仅可以简拼还出现了一种只需两键就能输入整个音节的双拼方案。具体代码和文件在我上传的资源中有,链接失效可以自己去找一下:https://download.csdn.net/download/qq_35293120/12016653。
如果对您有帮助希望您点个赞或者收藏一下,感谢~
一、内容
实现一个简单的汉语拼音输入法,即实现从拼音(全拼)到汉字(字串)内容的转换, 可以将 input.txt 中用空格隔开每个音的多行拼音串转换成汉字串并写入 output.txt 中。
二、思路
-
- Train
每个拼音对应多个汉字,构造 table,并对每个汉字进行编号记入 mapping。马尔科夫过程是状态间的转移仅依赖于前 n 个状态的过程,这里只考虑前一个状态的影响。遍历语料库,统计训练文本中每一个字出现的次数记入 num,统计拼音对应的每一个字和前面的一个汉字同时出现次数记入 matrix,这里 matrix 是由汉字两两组合构建的 6763*6763 的稀疏矩阵。
-
- IME
一个马尔科夫过程是状态间的转移仅依赖于前 n 个状态的过程,这里只考虑二元,即仅依赖前一个汉字。可观察的参数就是拼音,每个拼音都对应多个汉字,隐含的参数就是汉字。 某个汉字的初始概率定义为:汉字的初始概率 p1=该汉字在训练文本中出现次数/训练的所有汉字出现的总次数。发射概率定义为:上一个拼音对应文字 k 到下一个拼音对应文字 j 的发射概率 p2=文字 k 出现的次数/汉字 k 出现次数。第 j 个文字的最优解即为使得 P 取得最大值时的文字(定义 P=上一个拼音对应汉字 k 初始概率p1*上一个拼音对应文字 k 到下一个拼音对应文字 j 的发射概率 p2,同时第一个拼音对应汉字 P 取初始概率 p1 即可)。
三、实现
-
- 实现
将 table.txt 中的拼音和汉字存为 table,给汉字编号存为汉字到编码的映射 mapping,存入文件中。计算 mapping 长度 length,初始化 num[length]全部为 0 用来记录每个汉字出现的次数,声明 matrix[length][length]用来记录两个字前后出现的次数。对于训练使用文本,导入 re 库,使用中文正则表达式匹配指定的中文字符串,训练部分关键代码如下。
另外考虑到一行只有一个汉字的情况,只需要该字 num 增加。
之后开始训练,并将结果保存到文件中。这里在网上学习到使用 npy 文件可以有效加快读取速度,故在此进行训练多使用 npy 文件保存。另外 matrix 是个稀疏矩阵,因此只需要将非零值以及其行列号保存到文本中。
根据训练数据,循环求得该拼音对应的每个汉字的初始概率以及该拼音对应的每个汉字 和前面拼音对应汉字共有的发射概率,相乘求得 P,取得最大值计入 probs 列表,由此找到上一个汉字影响下此拼音对应汉字的最优解,最后将对应汉字存入 finalres,最后将结果写入 output.txt。
另外注意测试中发现 qv,xv 在 table 中没有对应拼音需要转换。
之后可以执行 ime.py 文件,将 input.txt 中用空格隔开每个音的多行拼音串转换成汉字串并写入 output.txt 中,并进行测试分析。
最后利用 pyinstaller 将 ime.py 生成一个可执行的 exe 文件。
四、测试与性能分析
运行结果的效果依赖于训练文本内容,尝试在训练文本中自己加入足够数量“计算机系”内容后,输出结果就由原来的“籍酸丌籍洗”变成了“计算机系”。测试的输入文本见 input.txt,结果如下表:
中雨来了各有前途的家和严格审核借款人还款能力从严防控信贷风险 离婚一年内贷款人贷款案二套房执行根据今年的政府工作报告 取消和听证的涉及个人等事项的行政事业性收费包括 中俄侦查船在韩国甫紧盯梢美航母 美军方称不承认中国东海防空识别区主场作战的中国队率先发起进供 古代职人从东非杞园后一路走到了地球上所有大陆 中国国家队战胜韩国国家对 轻人介会了 | 终于来了个有前途的家伙严格审核借款人还款能力从严防控信贷风险 离婚一年内贷款人贷款按二套房执行根据今年的政府工作报告 取消或停征的涉及个人等事项的行政事业性收费包括 中俄侦察船在韩国附近盯梢美航母 美军方称不承认中国东海防空识别区主场作战的中国队率先发起进攻 古代智人从东非起源后一路走到了地球上所有大陆 中国国家队战胜韩国国家队 情人节快乐 |
根据测试结果发现,以下短语没出现任何文字错误:今天也是好天气,不存在的,两会在北京召开,虽然已经解决了建立新积分方法的首要问题,中央已经决定了,乖乖站好,这个世界太乱,明明是我先来的,严格审核借款人还款能力,从严防控信贷风险,离婚一年内贷款人贷款按二套房执行,根据今年的政府工作报告,中俄侦察船在韩国附近盯梢美航母, 美军方称不承认中国东海防空识别区,主场作战的中国队率先发起进攻。
这些短语有个显著特点,就是跟新闻报道有关的话或者平时比较常用的口头语,而一些 特定场所用语和专有名词则误差较大,如“几乎处处收敛函数列的控制收敛定理”输出成“几 乎处处受连寒暑烈的控制熟练丁力”,因为这句是数学用语,与训练文本中关联度小因此误 差也比较大,还有特定场合的“情人节快乐”翻译成“轻人介会了”。另外,这些词语的训 练也受到二元模型的限制。
同时,因为训练时都是整句话的文本,因此一些短语误差较大,如“香香鸡”翻译成“想 象级”。
输出语句 | 真实语句 |
可测寒暑的有限可嘉兴 | 可测函数的有限可加性 |
轻人介会了 | 情人节快乐 |
为了验证以上分析,又拿以下跟新闻有关的例子进行测试,结果如下,可看到“据报道” 的第一个文字出现了错误,这和第一个汉字只根据出现次数统计而不受前面汉字影响有关。
我们的目标是全面建成小康社会 | 我们的目标是全面建成小康社会 |
五、总结分析
经过测试,基本实现了拼音转汉字的功能,同时使用 npy 文件减少了可执行程序运行时间。经过此次作业,加深了对隐马尔可夫模型的理解。在测试中总结问题主要有以下三点:
训练集小,训练样本少,不全面,几乎全都是利用新浪新闻文本进行训练,不具有代表 性。新闻常用的长句子和词语正确率远大于其他场景的词语或者句子。
对于 input 文本中每次出现的第一个拼音寻找汉字时,根据初始概率即根据该汉字出现次数来决定,如果添加一个对于出现在词(句)首的文字次数的统计或者可以提高正确率。 同时也受到二元模型限制,只受到前面一个字的影响。
因为只考虑前面一个汉字对后面汉字的影响,因此可能转移矩阵某处值为 0,但是两个可能经常相差一两个字出现,比如经常在同一个成语中不在相邻位置出现,因此造成一些训 练样本中出现较少的成语和短语误差较大。