# <center>拼音输入法实验报告
<div style="text-align:right">
<font style="font-size:20px;">
计94 周䶮 2019011301
</font>
</div>
## 一、程序运行方法
### 基于 zhihu 语料库的字二元拼音输入法
如果没有装有python环境,可运行可执行文件运行。在根目录下依次执行以下操作:
```
cd bin
pinyin xxx yyy
```
其中 xxx 表示输入文件的路径,yyy 表示输出文件的路径。若不指定(即无这两个参数),则使用程序默认的路径。默认路径中,输入文件在input文件夹中,输出文件在reslut文件夹中。示例:
```
pinyin ../input/input_py.txt ../result/output.txt
```
(暂不支持路径中包含不存在的文件夹)
或者如果装有python环境,建议直接使用python运行。在根目录下依次执行以下操作:
```
cd zhihu
python pinyin.py xxx yyy
```
其中 xxx 表示输入文件的路径,yyy 表示输出文件的路径。若不指定(即无这两个参数),则使用程序默认的路径。其中,指定的路径相对路径、绝对路径均可。(暂不支持路径中包含不存在的文件夹)
### 基于 sina 语料库的字二元拼音输入法
仅支持 python 运行。
```
cd sina
python pinyin.py xxx yyy
```
其中 xxx 与 yyy 的含义与上一部分相同
### 准确率计算
在根目录下进入 calcu 文件夹
```
cd calcu
```
有两个python脚本可以执行以计算整准确率
```
python calcu.py xxx
```
执行上述命令以计算 result 文件夹下所有结果文件的句**句准确率**。其中,xxx 表示标准答案文件的路径。不添加则使用默认答案文件。结果输出在当前目录下。
或者:
```
python calcu_char.py
```
执行上述命令以计算 result 文件夹下所有结果文件的**字准确率**。其中,xxx 表示标准答案文件的路径。不添加则使用默认答案文件。结果输出在当前目录下。
## 二、基本思路和实现过程
基础功能版本的拼音输入法,采用字二元模型。
### 字二元模型
字二元模型是以字为单位,并假设某个字出现的概率仅取决于前一个字的模型。 字二元模型下,后验概率被定义为:
$$
P(w_i|w_{i-1})=\frac{w_iw_{i-1}出现的次数}{w_{i-1}出现的次数}
$$
其中,字以及字的组合出现的次数从预训练得到的语料库中获取。 而每句话第一个字, 做如下补充定义:
$$
P(w_1|w_0)=\frac{w_1出现的次数}{语料库总字数}
$$
那么,使用字二元模型求解拼音输入法的目标就是,求使得长为 n 的字符串的如下评分:
$$
\sum_{i=1}^{n}P(w_i|w_{i-1})
$$
最大的一个。
### 语料库
语料库的选取上,起先选取了课程的 sina 语料库,后采用了自己爬取的 zhihu 语料库
### Viterbi算法
动态规划算法。
<img src="https://img.wzf2000.top/image/2021/04/06/image-20210406210816260.png" alt="image-20210406210816260" style="zoom:50%;" />
如图。对于每个读音 $s_i$ ,其在拼音汉字表中对应的汉字有 $k_i$ 个,每个字对应一个节点,这个节点储存算到该字为止的最优分数,以及该分数对应的路径(字符串)。对于这 $k_i$ 个节点,分别根据上一层算得的分数 $w$ 来递推得到该节点的分数 $w_{i, 1}, w_{i, 2}, ... , w_{i, k_i}$ 。重复以上过程,直至到最后一个拼音 $s_n$ ,再从最后一层节点中取出分数最大的,其分数便对应全局的最高分,
### 注意点
#### 平滑
为了防止出现 $P(w_i|w_{i-1})=0$ 的情况,导致概率计算无效化,需要在分数的计算上作平滑处理。
用如下替换(线性插值平滑):
$$
P(w_i|w_{i-1}) \rightarrow \lambda P(w_i|w_{i-1}) + (1-\lambda)P(w_i)
$$
即可规避这样的问题。其中,$\lambda$ 为一个接近1(小于1)的参数,其选取影响到最后拼音输入法的准确率,是需要进行调参的重点对象。
## 三、实验效果
### 准确率
基于 zhihu 语料库的字二元拼音输入法,可以在课程群中给的测例上做到82.6%的子准确率,以及38.1%的句准确率。在实际实验中,一些具体的实例如下:
### 好的例子
- ren gong zhi neng dao lun hen you yi si
人工智能导论很有意思
- qing hua da xue shi shi jie yi liu da xue
清华大学是世界一流大学
- shen du you xian sou suo xu yao si kao
深度优先搜索需要思考
- wo men yao ai xi shi jian jiu xiang ai xi zi ji de sheng ming yi yang
我们要爱惜时间就像爱惜自己的生命一样
- jing ji jian she he wen hua jian she tu chu le shi ba da jing shen de zhong yao xing
经济建设和文化建设突出了十八大精神的重要性
- hu lian wang hai neng gou cheng wei tu shu chuan bo de ping tai
互联网还能够成为图书传播的平台
- shi qi zhang pai ni neng miao wo
十七张牌你能秒我
- qian fang gao neng fei zhan dou ren yuan qing kuai su che li
前方高能非战斗人员请快速撤离
- xiao chu kong ju de zui hao ban fa jiu shi mian dui kong ju
消除恐惧的最好办法就是面对恐惧
分析:由于用的是知乎上爬取的中文文本,因此在语言使用风格上大概是近十年的风格,在一些新颖的搭配上表现较好。
### 坏的例子
- yi zhi ke ai de da huang gou
**一直**可爱的大黄狗(**一只**可爱的大黄狗)
分析:同音字问题,一只、一直都是高频词,分数相近,较难辨认。
- ta shi wo de mu qin
**他**是我的母亲 (**她**是我的母亲)
分析:同音字,在语义上的分辨难以在字二元模型上体现。
- shang hai zi lai shui lai zi hai shang
上**孩子**来**说**来自海上 (上**海自**来**水**来自海上)
分析:词语分割,上海、孩子都是高频词,分数相近,难以辨认;多音字,在我的模型中没有处理。
- shi jie qi xiang zu zhi jin tian fa biao sheng ming
世界**奇想阻止**今天**发飙升名**(世界**气象组织**今天**发表声明**)
分析:同音词语,较难辨认
- qiang lie qian ze di lie she hui fen zi
强烈谴责**的裂**社会分子(强烈谴责**低劣**社会分子)
分析:多音字,”的“字有”di“读音,出现频率过高。
- wo he peng you men zheng zai wu you wu lv de wan shua
我和朋友们正在无忧无虑**的**玩耍(我和朋友们正在无忧无虑**地**玩耍)
分析:同音字,”的“”地“”得“在不引入外部知识的情况下实在难于区分。
### 缺陷分析
如上例子可见,有以下几个问题:
1. 语料库仍不够大、不够完善,部分常用词的频率低于一些奇怪的搭配,与真实使用时的词频有略微的偏差
2. 同音字词频率相近,在一些情况下容易辨认错
3. 多音字的问题没有解决,一些高频字有一些不常用读音,会带来极大的困扰
4. 字二元模型中,一个字之后前后两字有关联,无法通过整句语境来很好地决定用词。同音、近义的词语(如他她它、的地得)在不引入外部知识的情况下难以准确区分。
## 四、参数选择
不同模型下的字准确率:
![image-20210407011728837](https://img.wzf2000.top/image/2021/04/07/image-20210407011728837.png)
其中,文件名中的数字表示平滑参数 $\lambda$ ;zhihu / sina 表示该模型基于的语料库。(nbest在后面一章节会提到)
可以看到,$\lambda=0.999985$ 或 $0.999988$ 时字准确率最高。
不同模型下的句准确率:
![image-20210407011959508](https://img.wzf2000.top/image/2021/04/07/image-20210407011959508.png)
可以看到,$\lambda=0.999988$ 时句准确率最高。
因此,采用 $\lambda=0.999988$ 为最终的平滑参数。
## 五、扩展功能
### (1) n-best
对于普通的 viterbi 算法,只能得到全局分数最高的 **1个** 句子作为最终结果。而�
评论0
最新资源