数学之美 —— 阅读笔记(二)
中文分词
中文不同于西方语言,词与词之间没有明显的分界,所以需要先对句子进行分词才能进一步进行自然语言处理。为了完成这个任务,最容易想到的方法就是“查字典”,即从左向右扫描并匹配最长的词。但这种方法太过简单,后来发展出了一种最少词的分词理论来对“查字典”方法进行补充,然而对于有歧义的句子,这种补充也无能为力。
“北京大学生”
“北京大学 - 生”
“北京 - 大学生”
那么借鉴之前提到的统计模型,利用统计语言模型分词可以用几个数学公式简单概括:假定一个句子 S 可以有以下几种分词方法
其中每个元素都是汉语中的一个词,如果 A1,A2,...,Ak 是最好的分词结果,那么必定满足
讲到现在,我们可以将所有分词方案枚举出来然后计算其统计概率,最后选取概率最大的那一种输出。但一旦句子较复杂,这种策略的计算量会变得很大。后面会提到一种 维特比算法 来进行快速查找。
虽然西方语言不需要这样的分词系统,但其手写体的识别可以使用这种分词策略,因为其手写体的空格不是很清楚
分词的一致性
需要指出的是,语言学家对词语的定义不完全相同,有些词可以继续拆分。那么一个折中的方法是先作为一个长词进行处理,然后对这个长词内部再分词。一般来讲,根据不同的应用分词的颗粒度大小不同。例如,在机器翻译中,颗粒度应该大一些,而语音识别或搜索引擎中颗粒度相对要小一点。一个简单的例子,“清华大学” 我们可以将它作为一个整体,也可以把它分开成 “清华” 和 “大学” ,但在搜索引擎内如果用户搜索 “清华” 而找不到 “清华大学” 肯定是有问题的,可见对于不用的应用领域对分词粒度的大小要求是不同的。虽然可以对不同的应用构造不同的分词器,但这样做的效率不高。所以考虑让分词器支持不同层次的分词。它的基本方法是:
- 基于一个 基本词表 和一个 复合词表 建立语言模型 L1 L2;
- 首先以字串为输入,通过基本词表的模型 L1 先输出小粒度的分词结果(词串);
- 将小粒度的词串输入 L2 模型进行大粒度的分词;
其中分词的程序本身是一样的,改变了的只有输入和词表。这样做的依据在于首先基本词比较稳定,都是不能再分的基本单位,而分词方法又是一个已解决的问题,所以除了增加一些未登录词以外没什么需要研究的内容了。
分词的准确性
分词的不一致性可以分为 错误 和 粒度不一致 两种,其中 错误 又分为两类。一类是 越界型错误,例如把 “北京大学生” 分为了 “北京大学 - 生”;另一类是 覆盖型错误,比如把人名分成了若干个单字。这些错误是需要通过改进分词器来解决的。
而对于粒度的错误,需要做的其实是尽可能地丰富各种复合词。
隐马尔可夫模型
自然语言是人类通信的媒介和工具,如果将自然语言处理回归到通信系统中的解码问题时,很多现在的问题就能解决了。
通信中的解码就是根据接收到的信号
o1,o2,...
还原出发送的信号
s1,s2,...
。那么用概率论的语言来描述就是在已知
o1,o2,...
的情况下,求令条件概率
P(s1,s2,...|o1,o2,...)
达到最大的那个发送的信息串
通过贝叶斯公式再对上面的公式进行变换;当信息 o1,o2,... 已经产生,那么 P(o1,o2,...) 就可以忽略了,即将公式简化为
马尔可夫链
随机过程中各个状态的概率分布,只与它的前一个状态有关,即 P(st|s1,s2,...,st−1)=P(st|st−1) 。满足这个 马尔可夫假设 的随机过程即为 马尔可夫过程(马尔可夫链)
隐马尔可夫模型 是马尔可夫链的一个扩展:任一时刻
t
的状态
基于马尔可夫假设和独立输出假设,我们可以计算出某个特定的状态序列和产生输出符号的概率
上面的这个公式,如果从通信的角度观察,其实是这样的
三个基本问题
正如在隐马尔可夫模型的专题笔记中提到的,这三个问题分别是:
- 如何计算特定输出序列的概率;
- 给定输出序列,找最可能的状态序列;
- 如何训练参数;
前两个问题的答案分别是:
- 前向-后向算法(Forward-Backward);
- 维特比算法(Viterbi Algorithm);
至于第三个问题,参考我隐马尔可夫模型的笔记。(笔记之后放出来)