第2次课-分词
https://zhuanlan.zhihu.com/p/109054674
在做文本处理的时候,首先要做的预处理就是: 分词
无论是英文还是中文,分词的原理都是类似的。
简单而言,汉语自动分词就是让计算机系统在汉语文本中的词与词之间自动加上空格或其他边界标记。
(自动分词是一个没有明确定义的问题。)
1.分词中的基本问题
分词中涉及到三个基本问题:分词规范、歧义切分和未登录词的识别。
1.分词规范
没给出规范。
当我们在衡量一个分词模型的好坏时,我们首先需要确定一个统一的标准,即所谓Golden Data,大家所有的模型都在统一的数据集上进行训练和评测,这样比较才会具有可参考性。
2.歧义切分
汉字串AJB称作交集型切分歧义,如果满足AJ、JB同时为词(A、J、B分别为汉字串)如,大学生(大学/学生)
汉字串AB称作多义组合型切分歧义,如果满足A、B、AB同时为词。如,起身(他|站|起|身|来/明天|起身|去北京)
想要正确的做出切分判断,一定要结合上下文语境,甚至韵律、语气、重音、停顿等。
3.未登录词
未登录词,一种是指已有的词表中没有收录的词,另一种是指训练语料中未曾出现过的词。通常情况下未登录词和OOV是一回事,我们这里不加以区分。
- 新出现的普通词汇,一般对于大规模数据的分词系统,会专门集成一个新词发现模块
- 专有名词
- 专业名词和研究领域名称,这个在通用分词领域出现的情况比较少
- 其他专用名词,包含其他新产生的电影、书籍等等。
经过统计汉语分词出现问题更多是由于未登录词造成的,那么分词模型对于未登录词的处理将是衡量一个系统好坏的重要指标。
2.常用的汉语分词方法
基于词典的分词方法
有文献介绍了16中不同的分词方法,包括正向最大匹配法(forward maximum matching method,FMM),逆向最大匹配法(Backward maximum matching method,
有文献介绍了16中不同的分词方法,包括正向最大匹配法(forward maximum matching method,FMM),逆向最大匹配法(Backward maximum matching method,BMM),双向扫描法等。这些方法基本上都是在上世纪80年代左右提出来的,大多数都是基于词表(词典)进行的。
基于字的分词方法
基于字的分词方法将分词过程看作是字的分类问题,其认为每个字在构造一个特定词语时都占据着一个确定的构词位置(词位)。这种方法最早由薛念文等人于基于字的分词方法将分词过程看作是字的分类问题,其认为每个字在构造一个特定词语时都占据着一个确定的构词位置(词位)。这种方法最早由薛念文等人于2002年提出,并在各种分词大赛上取得了不错的成绩,尤其是对未登录词问题的处理,召回率一直很高。
一般情况下,我们认为每个字的词位有4种情况:B(Begin)、E(End)、M(Middle)、S(Single),那么我们对于一个句子的切分就可以转为对句子中每个字打标签的过程,举个例子:
- 自然语言处理/可以/应用/在/诸多/领域。
- 自B 然M 语M 言M 处M 理E 可B 以E 应B 用E 在S 诸B 多E 领B 域E。
正向最大匹配思想MM
从左向右取待切分汉语句的m个字符作为匹配字段,m为大机器词典中最长词条个数。
查找大机器词典并进行匹配。若匹配成功,则将这个匹配字段作为一个词切分出来。
若匹配不成功,则将这个匹配字段的最后一个字去掉,剩下的字符串作为新的匹配字段,进行再次匹配,重复以上过程,直到切分出所有词为止。

我是中国人。
正向:我/是/中国/人
逆向:我/是/中/国人
南京市长江大桥
假设南京市 是一个词
正向:南京市 长江 大桥
逆向: 南京市 长江 大桥
假设南京市不是一个词
正向:南京 市 长江 大桥
逆向:南京 市 长江 大桥
我在学生物
正向:我 在 学生 物
逆向: 我 在 学 生物
正向最大匹配(forward maximum matching method,FMM)
maxlength = 5
问题:
1.效率慢
2.没有考虑到词频,只要在字典中就行
反例:
我在学生物:我/在/学生/物/
南京市长江大桥:南京市/长江/大桥/
逆向最大匹配RMM
我在学生物:我/在/学/生物
双向最大匹配法
是将正向最大匹配法得到的分词结果和逆向最大匹配法的到的结果进行比较,从而决定正确的分词方法。
它是基于词典的,所以分词效果的好坏很大程度上取决于词典本身的精确程度。
接下来看一下基于统计的方法。
n-gram
N-gram模型是一种语言模型(Language Model,LM),语言模型是一个基于概率的判别模型,它的输入是一句话(单词的顺序序列),输出是这句话的概率,即这些单词的联合概率(joint probability)。
N-gram本身也指一个由NNN个单词组成的集合,各单词具有先后顺序,且不要求单词之间互不相同
特点是我们获得的信息越多,预测越准确。
假设一个字符串s由m个词组成,因此我们需要计算出P(w1,w2,⋯,wm)的概率



求使得这个句子发生的概率最大的分词方式?
词频指的文档中的 还是预料中的?
词频的话,只能尽可能把语料库弄得大一些。词频是一个比较大的语料库中统计出来的。
不知道哪三个要统计,所有的可能都要统计,代价高。
数据下溢用log概率 解决.
前缀词典
3.中文分词工具
jieba(github有)要安装
jieba的工作先要读字典
jieba分词对已收录词和未收录词都有相应的算法进行处理,其处理的思路很简单,当然,过于简单的算法也是制约其召回率的原因之一。
其主要的处理思路如下:
- 加载词典dict.txt
- 从内存的词典中构建该句子的DAG(有向无环图)
- 对于词典中未收录词,使用HMM模型的viterbi算法尝试分词处理
- 已收录词和未收录词全部分词完毕后,使用dp寻找DAG的最大概率路径
- 输出分词结果
语料库中所有的词语被用来做两件事情:
- 对词语的频率进行统计,作为登录词使用
- 对单字在词语中的出现位置进行统计,使用BMES模型进行统计,供后面套HMM模型Viterbi算法使用。
统计后的结果保存在dict.txt中,摘录其部分结构如下:
上访 上访 212 v
上访事件 3 n
上访信 3 nt
上访户 3 n
上访者 5 n
上证 120 j
上证所 8 nt
上证指数 3 n
上证综指 3 n
上诉 187 v
上诉书 3 n
上诉人 3 n
上诉期 3 b
上诉状 4 n
上课 650 v
语料库是什么,为什么优质的不好找?
为什么JB分词会有这样的表现?(看上面的分词方法)
jieba分词主要是基于统计词典,构造一个前缀词典;然后利用前缀词典对输入句子进行切分,得到所有的切分可能,根据切分位置,构造一个有向无环图;通过动态规划算法,计算得到最大概率路径,也就得到了最终的切分形式。
实例讲解
1.离线统计的词典形式:,每一行有三列,第一列是词,第二列是词频,第三列是词性。
2.前缀词典构建
首先是基于统计词典构造前缀词典,
3.有向无环图构建
然后基于前缀词典。
DAG在分词中的应用很广,无论是最大概率路径,还是其它做法,DAG都广泛存在于分词中。因为DAG本身也是有向图,所以用邻接矩阵来表示是可行的,但是jieba采用了Python的dict结构,可以更方便的表示DAG。最终的DAG是以{k : [k , j , ..] , m : [m , p , q] , …}的字典结构存储,
4.最大概率路径计算
用动态规划从后往前算,不难。
本次课讲到最大概率路径计算 之前,后面数学比较多,代码比较多
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!