中文分词
1、中文分词研究背景及意义
- 和大部分西方语言不同,书面汉语的词语之间没有明显的空格标记,句子是以字串的形式出现。因此对中文进行处理的第一步就是进行自动分词,即将字串转变成词串。 比如“中国建筑业呈现新格局”分词后的词串是 中国/建筑业/呈现/新/格局。
- 为什么中文分词如此重要呢,是因为它是处理中文的语义分析、文本分类、信息检索、机器翻译、机器问答等问题的基础。如果分词效果不好,很有可能会严重影响到后续的研究。 因为中文存在交集歧义,组合歧义,无法在句子中解决的歧义,具有未登录词等等特征,使得中文分词很难。
歧义类型 | 分词结果 1 | 分词结果 2 |
---|---|---|
交集歧义 | 研究/生命/的/起源 | 研究生/命/的/起源 |
组合歧义 | 他/从/马/上/下来 | 他/从/马上/下来 |
无法在句子中解决的歧义 | 南京市/长江大桥 | 南京市长/江大桥 |
未登录词 | 拜登/和/特朗普/通话 | 拜登/和/特朗/普通话 |
颗粒选择 | 联想公司 | 联想/公司 |
2、中文分词主要方法
-
中文分词根据实现特点大致可分为两个类别:基于词典的分词方法、基于统计的分词方法。
-
__ 基于词典的分词方法 __:基于词典的分词方法首先会建立一个充分大的词典,然后依据一定的策略扫描句子,若句子中的某个子串与词典中的某个词匹配,则分词成功。 常见的扫描策略有:正向最大匹配、逆向最大匹配、双向最大匹配和最少词数分词。
- 正向最大匹配
- 对输入的句子从左至右,以贪心的方式切分出当前位置上长度最大的词,组不了词的字单独划开。其分词原理是:词的颗粒度越大,所能表示的含义越精确。
- 逆向最大匹配
- 原理与正向最大匹配相同,但顺序不是从首字开始,而是从末字开始,而且它使用的分词词典是逆序词典,其中每个词条都按逆序方式存放。在实际处理时,先将句子进行倒排处理,生成逆序句子,然后根据逆序词典,对逆序句子用正向最大匹配。
- 双向最大匹配
- 将正向最大匹配与逆向最大匹配组合起来,对句子使用这两种方式进行扫描切分,如果两种分词方法得到的匹配结果相同,则认为分词正确,否则,按最小集处理。
- 最少词数分词
- 即一句话应该分成数量最少的词串,该方法首先会查找词典中最长的词,看是不是所要分词的句子的子串,如果是则切分,然后不断迭代以上步骤,每次都会在剩余的字符串中取最长的词进行分词,最后就可以得到最少的词数。
- 正向最大匹配
-
总结:基于词典的分词方法简单、速度快,效果也还可以,但对歧义和新词的处理不是很好,对词典中未登录的词没法进行处理。
-
__ 基于统计的分词方法 __: 基于统计的分词方法是从大量已经分词的文本中,利用统计学习方法来学习词的切分规律,从而实现对未知文本的切分。随着大规模语料库的建立,基于统计的分词方法不断受到研究和发展,渐渐成为了主流。 常用的统计学习方法有:隐马尔可夫模型 (HMM)、条件随机场 (CRF) 和基于深度学习的方法。
- HMM 和 CRF
- 这两种方法实质上是对序列进行标注,将分词问题转化为字的分类问题,每个字有 4 种词位 (类别):词首 (B)、词中 (M)、词尾 (E) 和单字成词 (S),例如:我 (S) 喜 (B) 欢 (E) 计 (B) 算 (M) 机 (E)。由字构词的方法并不依赖于事先编制好的词典,只需对分好词的语料进行训练即可。当模型训练好后,就可对新句子进行预测,预测时会针对每个字生成不同的词位。其中 HMM 属于生成式模型,CRF 属于判别式模型。
- 基于深度学习的方法
- 神经网络的序列标注算法在词性标注、命名实体识别等问题上取得了优秀的进展,这些端到端的方法也可以迁移到分词问题上。与所有深度学习的方法一样,该方法需要较大的训练语料才能体现优势,代表为 BiLSTM-CRF。
- HMM 和 CRF
-
总结:基于统计的分词方法能很好地处理歧义和新词问题,效果比基于词典的要好,但该方法需要有大量人工标注分好词的语料作为支撑,训练开销大,就分词速度而言不如前一种。在实际应用中一般是将词典与统计学习方法结合起来,既发挥词典分词切分速度快的特点,又利用了统计分词结合上下文识别生词、自动消除歧义的优点。
3、jieba 分词全流程介绍
- jieba 分词主要通过词典来进行分词及词性标注,两者使用了一个相同的词典。jieba 虽然使用了 HMM 来进行新词发现,但分词的结果优劣很大程度上取决于词典。
- DAG (有向无环图)
- 整体工作流程
- 精确模式与全模式:
- 搜索引擎模式:
- 精确模式与全模式:
- HMM
- HMM 示意图
- HMM 模型的三个基本假设如下:
- 有限历史性假设:
- P(Status[i]|Status[i-1],Status[i-2],… Status[1]) = P(Status[i]|Status[i-1])
- 齐次性假设 (状态和当前时刻无关):
- P(Status[i]|Status[i-1]) = P(Status[j]|Status[j-1])
- 观察值独立性假设 (观察值只取决于当前状态值):
- P(Observed[i]|Status[i],Status[i-1],…,Status[1]) = P(Observed[i]|Status[i])
- 有限历史性假设:
- HMM 联合概率函数
- HMM 的典型模型是一个五元组:
- StatusSet: 状态值集合
- 为 (B, M, E, S): {B:begin, M:middle, E:end, S:single}。分别代表每个状态代表的是该字在词语中的位置,B 代表该字是词语中的起始字,M 代表是词语中的中间字,E 代表是词语中的结束字,S 则代表是单字成词。
- 示例:给/S 你/S 一个/BE 隐马尔科夫链/BMMMME 的/S 例子/BE 。/S
- ObservedSet: 观察值集合
- 为所有汉字 (东南西北你我他…),甚至包括标点符号所组成的集合。
- 状态值也就是我们要求的值,在 HMM 模型中文分词中,我们的输入是一个句子 (也就是观察值序列),输出是这个句子中每个字的状态值。
- InitStatus: 初始状态分布
- TransProbMatrix: 转移概率矩阵
-
- 【有限历史性假设】
- 转移概率是马尔科夫链。Status(i) 只和 Status(i-1) 相关,这个假设能大大简化问题。所以,它其实就是一个 4x4(4 就是状态值集合的大小) 的二维矩阵。矩阵的横坐标和纵坐标顺序是 BEMS x BEMS。(数值是概率求对数后的值)
- EmitProbMatrix: 发射概率矩阵
-
- 【观察值独立性假设】
- P(Observed[i], Status[j]) = P(Status[j]) * P(Observed[i]|Status[j])
- 其中,P(Observed[i]|Status[j]) 这个值就是从 EmitProbMatrix 中获取。
- StatusSet: 状态值集合
- Viterbi 算法
- 假设上图为"小王子"的分词示例
- S、E 代表开始和结束,我们需要找到从 S 到 E 的最大概率路径
- 中间的矩阵行数等于状态数,列数等于句子长度,矩阵对应位置保存到该节点的最大概率和实现这个概率时上一列节点的状态。
- HMM 示意图
- 百度 LAC
- 其它分词器
- StanfordNLP
- 哈工大 LTP
- 复旦 NLP
- Ansj
- IK Analyzer
4、分词在搜索中的应用
-
jieba
-
算法实现
- 基于前缀词典进行扫描,对句子中汉字所有的可能情况构成有向无环图 (DAG)
- 基于动归查找最大路径,找出基于词频的最大切分组合
- 对于未登录词,采用基于字粒度的 HMM + viterbi 进行处理
-
分词方式
- 精准匹配
jieba.lcut('中国科学院计算所') Out[13]: ['中国科学院', '计算所']
- 词性标注
import jieba.posseg as pseg Out[17]: [pair('我', 'r'), pair('爱', 'v'), pair('北京', 'ns'), pair('天安门', 'ns')]
- 搜索分词 (粒度较细,该方法适合用于搜索引擎构建倒排索引)
jieba.lcut_for_search('中国科学院计算所') Out[12]: ['中国', '科学', '学院', '科学院', '中国科学院', '计算', '计算所']
-
自定义能力
- 自定义词典、词性
# 单词 词频 词性 创新办 3 i
- 目前我们只增加了词表,对于词频我们并没有设置,可以基于统计的方法来开发自定义的 tf-idf 文件来优化分词效果
- 对于未登录词 (新词发现), 我们是可以基于自己的语料来训练 HMM 的状态转移矩阵来优化的
-
其他开源工具 (均三年以上不更新)
- 百度 LAC、HanLp、清华 THULAC、北大 pkuseg
-
中文分词未来的展望
- 被应用于各种词嵌入工具,Word2vec、Glove、ELMO、BERT, 但也逐渐的被代替 (基于字符/单字), 强依赖中文分词的场景也逐渐的减少
-
-
IK 分词器 (构建索引及搜索)
- IK 分词器是基于正向匹配的分词算法
- LetterSegmenter(字母分词器),CN_QuantifierSegment(量词分词器),CJKSegmenter(中日韩分词器)
- IK 分词器,基本可分为两种模式 (粒度),一种为 smart 模式,一种为 max 模式
- max 就是把每种可能的分词结果都给出
- smart 就是需要在这几种分词模式中,寻找一种认为最合理的分词方式
- IK 分词器的主要逻辑
- 词典:原理为前缀树的存储方式,实现为数组 + map
- 词的匹配:对输入的字符逐字的和字典进行匹配
- 消除歧义:通过词典匹配出来的切分方式会有多种,寻找最合理的一种方式 (词元个数越少越好、路径跨度越大越好、逆向切分概率高于正向切分、词长越平均越好、词元位置权重比较)
- 遗留的问题
- smart 分词的结果并不是 max 的子集,官方推荐用 max 建立索引,用 smart 来搜索,但可能会导致两端对不齐的情况
- smart 分词的结果并不是 max 的子集,官方推荐用 max 建立索引,用 smart 来搜索,但可能会导致两端对不齐的情况
- 相关性优化
- 搜索的目的是要理解用户搜索意图,准确衡量 query 与物料之间的相关程度。其中,query 与物料的相关性 (不单单是文本相似度) 计算是最重要的环节 (“全准优新”)
- 文本误匹配:
- 分词错误造成的误匹配
- 召回时,为了更多的物料能被召回,query 可能会被拆成更细的粒度进行检索,但就会带来准召之间的博弈,例如"北京银行"是想寻找与该公司有关的信息,但"北京"和"银行"可能会分别匹配到相关的物料
- 语义偏移:query 与物料字面匹配,但主要意图在语义上不相关,例如:“字节”-“字节码”, “一点点”-“每天成长一点点”
- 搜索相关性技术
- 基于文本匹配的方法:基于 TF-IDF、BM25 等 Term 匹配来计算文本相似度。优点实现简单、速度快,缺点为泛化性较差,无法处理一词多义或者多词一义的问题,很难避免漏匹配和误匹配的情况
- 基于表示的语义匹配模型:基于表示方法分别学习 query 和 doc 的语义向量表示,再基于两个向量计算相似度,DSSM
- 基于交互的语义匹配模型:基于交互的方法不直接学习 query 和 doc 的语义表示向量,而是基于基础信号为两者建立交互,最终通过分类计算相关性得分,ESIM