【自然语言处理2】分词
分词的评价标准:
中文分词面临的挑战
1. 缺少统一的分词标准
认知差异:不同人对于“什么是词”的界定存在主观差异,实验显示人工分词的认同率仅在0.76左右。
领域差异:不同专业领域对分词的粒度要求不同,导致标准之间存在矛盾甚至不一致。
2. 严重的歧义问题一句话往往存在多种合理的切分方式,主要分为三类:
交集型歧义:字词组合存在交叉重叠。例如“表面的”可切分为“表面/的”或“表/面的”。
组合型歧义:同一个词串在不同语境下词性或结构不同。例如“门把手”(名词)与“把手拿开”(动词+名词)。
真歧义:脱离上下文完全无法判定唯一意思的句子。例如“乒乓球拍卖完了”(球拍/卖完了 vs 球/拍卖完了)。
3. 新词识别(OOV)困难
动态演变:语言不断发展,专业领域新词和具有时效性、随意性的日常口语(网络用语)层出不穷。
边界难定:现有的无论是基于规则库、统计还是神经网络的方法,都很难准确界定未见过的新词边界,极易将其错误拆散(如前面的 OOV 召回率低的问题),从而丧失词汇的真实含义。
分词方法概述
1.基于词典的最长词汇匹配算法
2.基于统计:N元组概率语言模型分词,隐马尔可夫模型,条件随机场
3.基于深度神经网络:循环神经网络中文分词模型LSTM,LSTM+CRF,BiLSTM-CRF,LSTM-CNNs-CRF等;Transformer中文分词模型
基于词典的最长词汇匹配算法
包括前向、后向和双向最大匹配算法
1.正向最大匹配算法 (Forward Maximum Matching, FMM)
核心思路:从左向右扫描。
每次从句子的当前起始位置,截取长度为 $L$ 的子串。
将该子串去词典中查找。
如果找到了,说明这是一个词,将其切分出来,然后从这个词的下一个字开始,继续截取长度为 $L$ 的子串。
如果没找到,就把子串的最右边一个字去掉(长度减 1),再拿去词典中查找。
如此循环,直到找到词典中的词,或者子串长度变为 1(单字直接切分)。
FMM 示例演示:句子研究生命的起源,从左向右。
步骤 1:截取前 3 个字
研究生。查词典,有!切分出:研究生。剩余句子:命的起源。步骤 2:从
命开始截取 3 个字命的起。查词典,无。去掉右边一个字变命的。查词典,无。变单字命,切分出:命。剩余句子:的起源。步骤 3:从
的开始截取 3 个字的起源。查词典,无。变的起,无。变单字的,切分出:的。剩余句子:起源。步骤 4:截取 2 个字(因为只剩2个)
起源。查词典,有!切分出:起源。FMM 最终结果:
研究生 / 命 / 的 / 起源(这里产生了错误分词)。
2. 逆向最大匹配算法 (Backward Maximum Matching, BMM)
核心思路:从右向左扫描。
每次从句子的当前末尾位置向前,截取长度为 $L$ 的子串。
将该子串去词典中查找。
如果找到了,切分出该词,并从该词前面的一个字继续向左截取。
如果没找到,就把子串的最左边一个字去掉(长度减 1),再查找。
循环直到找到词,或长度变为 1。最后把结果倒序输出。
BMM 示例演示:句子研究生命的起源,从右向左。
步骤 1:截取最后 3 个字
的起源。查词典,无。去掉左边变起源。查词典,有!切分出:起源。剩余待处理:研究生命的。步骤 2:从
的向前截取 3 个字生命的。查词典,无。变命的,无。变单字的,切分出:的。剩余待处理:研究生命。步骤 3:从
命向前截取 3 个字究生命。查词典,无。变生命。查词典,有!切分出:生命。剩余待处理:研究。步骤 4:从
究向前截取 2 个字研究。查词典,有!切分出:研究。BMM 最终结果:
研究 / 生命 / 的 / 起源(分词正确)。
(注:统计表明,汉语中偏正结构较多,句子的核心通常在后面,因此 BMM 的切分准确率通常略高于 FMM。)
3. 双向最大匹配算法 (Bi-directional Maximum Matching, Bi-MM)
核心思路:将 FMM 和 BMM 的结果结合起来,通过一套启发式规则(消歧规则)来决定最终采用哪个结果。
常见的评判规则优先级如下(一步步向下比较,直到分出胜负):
词数越少越好:比较 FMM 和 BMM 结果的切分词汇数量,词数少的通常更合理(即分出的词越长越好)。
单字词越少越好:如果词数相同,比较两者分出的“单字”数量。单字越少的说明整体词汇意义更连贯,保留该结果。
默认选逆向:如果词数和单字数都完全一样,且切分结果不同,则默认选择 BMM(基于 BMM 统计表现更好的经验)。
Bi-MM 示例演示:
FMM 结果:
研究生 / 命 / 的 / 起源词数:4 个
单字词数:2 个 (
命,的)
BMM 结果:
研究 / 生命 / 的 / 起源词数:4 个
单字词数:1 个 (
的)
决策过程:两者的总词数相同(都是 4 个),进入第二规则;BMM 的单字词数(1个)小于 FMM(2个)。
Bi-MM 最终结果:选择 BMM 结果,即
研究 / 生命 / 的 / 起源。
优缺点
基于统计的确定性分词算法
这里的确定性,默认就是 基于词典 DAG 图 + N-Gram 语言模型的分词算法。
当一个句子 C 存在多种可能的切分方案时,如何选择最合理的一个?
贝叶斯公式转化:寻找最合理的切分方案,即寻找条件概率 P(S|C$ 最大的方案。通过贝叶斯公式
进行推导。
化简:对于同一个输入句子,分母 P(C) 是常数;而给定分词结果 S,它唯一确定还原为原始句子 C,所以 P(C|S) = 1。
最终目标:最大化 P(S|C) 等价于最大化该词序列本身的联合概率 P(S)。问题转化为了:如何计算一个词序列的概率?
为了计算,引入了马尔可夫假设(N元语法模型)。
一元模型 (Unigram,):假设词与词之间绝对独立。P(S) 简化为各个词概率的乘积:
。为了防止连续相乘导致浮点数下溢,通常取对数转化为加法:
。
二元模型 (Bigram):一元模型太粗糙,二元模型假设每个词的出现依赖于它前面的一个词。公式变为:
。考虑上下文(二元模型)能更准确地找出符合人类语言习惯的最大概率路径。
计算模型有了,但如果穷举所有可能的切分方式,计算量会随句子长度呈指数级爆炸。因此引入了图论和动态规划。
构建有向无环图 (DAG, 切分图):将句子中的每个字作为节点,如果两个节点之间构成词典中的一个词,就连一条有向边。边的权重就是该词由 N-Gram 模型算出的概率(或对数概率)。
动态规划寻路 (Viterbi 算法思想):
状态定义:
route[i]表示从第 i 个字符开始到句子末尾的最大概率。状态转移方程:
route[i] = max { logP(wij) + route[j+1] }。即当前节点的最优解,等于“当前词的概率”加上“剩余子串的最优解”的最大值。执行过程:从句子的末尾向前逆向遍历,记录每一步的最优决策,最后从头到尾回溯出最佳分词路径。
我们将“有意见分歧”标记为:1:有, 2:意, 3:见, 4:分, 5:歧(索引 1 到 5,终点为 6)。
我们需要填一张表route[1...6]。初始条件为route[6] = 0(到达终点,没有剩余概率)。
计算
route[5](从字符 5“歧”开始):只有一个词“歧”,路径概率为 logP(“歧”) + route[6] = logP(“歧”) + 0。(这里概率使用log来表示是为了简化概率的计算,log把乘法变加法,也防止乘法计算数值下溢)
计算
route[4](从字符 4“分”开始):有两个选择:
词“分” +
route[5]词“分歧” +
route[6]我们选其中概率最大的,记录下选的是哪个词。
计算
route[1](从字符 1“有”开始):这是最关键的一步,我们考察所有以“有”开头的词:
“有” +
route[2]“有意” +
route[3]“有意见” +
route[4]route[1] = max(logP(“有”) + route[2],logP(“有意”) + route[3],logP(“有意见”) + route[4])
当完成了所有route值的计算,现在表里存满了“最优解”。回溯就是把路径“连起来”:
从起点 1 出发:查看你在计算
route[1]时,选的是哪个词?假设选了“有意见”。跳转:因为选了“有意见”,词跨度是 3 个字,下一步直接跳到字符 $1+3=4$。
继续:查看
route[4]当初选了哪个词?假设选了“分歧”。跳转:跨度 2 个字,跳到字符 $4+2=6$。
结束:到达 6,路径搜索完成。最佳路径:
有意见 / 分歧。
为什么一定要“从后往前”算?
逆向动态规划:相当于在问“如果我站在位置 $i$,后面怎么走最顺?”。计算完
route[1]后,就知道了整个句子的最优概率。为什么要记录“决策”:在
route[i] = max{...}这一步,如果不记录下当时选了哪个词(比如是选了“有意”还是“有意见”),回溯时就不知道该往哪跳了。
为什么叫“确定性 (Deterministic)”?
这里的“确定性”并不是指“它的结果一定是对的”,而是指它的搜索空间是绝对确定的、由词典严格框死的。
候选项是确定的:算法第一步是查词典。只要词典里有这个词,它才有可能成为分词结果的一部分。如果词典里没有“大兴机场”,那么在生成的有向无环图(DAG)中,就绝对不可能出现代表“大兴机场”的节点。
切分边界是确定的:它是在一组“确定的合法词汇”中,利用 N-Gram 统计概率来挑出一条总分最高的路径(使用动态规划/Viterbi)。它的本质是路线选择。
所以,这套算法的完整描述应该是:“在确定的词典路径空间下,基于 N-Gram 统计概率进行消歧的分词算法”。
为什么 HMM 和 CRF 不叫“确定性分词”?
HMM 和 CRF 虽然也是基于统计的,但它们在学术体系中通常被归类为“基于序列标注的分词算法 (Sequence Labeling)”。
与 N-Gram 的核心区别在于:
它们的空间是开放的(非确定性的):HMM/CRF不需要事先查词典画一张图。它们是挨个看句子里的字,给每个字打上
B(词首)、M(词中)、E(词尾)或S(单字)的标签。一旦模型能够正确预测出这串标签序列(B-E-B-E),根据标签,我们只需在所有E或S后面加上一刀,原本的“分词”任务就自动完成了。所以,预测标签序列的过程,本身就是确定分词边界的过程。无中生有的能力:哪怕是一个字典里从来没出现过的新词(比如网友刚造出来的梗),只要模型根据上下文的统计特征觉得它是
B-M-E,它就能把这个词“凭空”切出来。
未登录词识别
词表大小的硬性限制: 在深度学习和 NLP 实践中,为了控制模型参数量和计算复杂度,通常只会保留最高频的几万个词。那些海量的低频词(长尾词)无法被纳入词表,它们在模型输入时会被统一替换为一个特殊的占位符
[UNK](Unknown)。后果:一旦变成[UNK],这个词本身包含的语义信息就彻底丢失了。专有名词与时效性: 绝大多数人名、地名、机构名(命名实体)都是低频词。此外,互联网每天都在批量制造新词(如“绝绝子”、“尊嘟假嘟”),旧词表永远跟不上新词产生的速度。
统计规律的残酷现实: 幻灯片引用了 MIT 的统计数据(也是著名的齐普夫定律 Zipf's Law的体现):即使你的训练语料达到了惊人的 1000 万词,字典大小扩充到 10 万,新词出现的比率依然停留在 10% 左右,呈现出一条无法降到 0 的长尾曲线。这意味着永远无法通过“穷举”来构建一个完美的词典。
既然不能依赖现成的词典,那我们能不能从一段完全陌生的生语料中,自动把那些“长得像词”的字符串给揪出来?这就是基于统计的新词发现。
它的核心思想是:一个字串如果真的成了一个“词”,那么它在统计上必然会表现出两种极端的特质:内部抱团,外部自由。
特质一:内部凝固度 (PMI - 点间互信息)
直观理解:如果 x 和 y 是一个词的两个部分,那么它们应该总是“粘”在一起出现。比如“电影”和“院”,它们在一起出现的概率,应该远远高于它们各自独立出现概率的乘积。
数学度量:点间互信息 (Pointwise Mutual Information)
P(x,y):x 和 y 在语料库中连在一起出现的概率。
P(x)P(y):假设 x 和 y 是完全独立的两个字,它们碰巧挨在一起的理论概率。
结论:如果 PMI 的值很高(大于某个阈值),说明 x 和 y 是“非偶然”地结合在一起,它们的凝固度很强,极有可能是一个词。相反,像“的电影”,虽然经常出现,但因为“的”和“电”各自出现的频率都很高,它们的 PMI 值会很低,说明只是碰巧挨着的。
特质二:自由运用程度 (信息熵 Entropy)
直观理解:一个真正的词,不仅内部要紧密,它在句子中应该能灵活运用,能够和各种不同的词搭配。
反例:假设我们通过 PMI 发现“清华大”这个字串凝固度很高。但如果我们去语料库里看,“清华大”的后面永远只跟着一个字:“学”。这意味着“清华大”本身并不完整,它不自由,所以不能算作一个词。
正例:“清华大学”后面可以接“的教授”、“在海淀”、“是一所”,它后面接的字五花八门。
数学度量:左右信息熵
信息熵在信息论中代表“混乱度/丰富度”。
左邻熵 (Left Entropy):这个字串左边出现的字的丰富程度。
右邻熵 (Right Entropy):这个字串右边出现的字的丰富程度。
公式:
。我们取左右邻熵的最小值作为这个词的自由度。
结论:如果一个字串不仅内部凝固度高,而且它的左边和右边都能接各种各样杂七杂八的字(左右熵都很大),那么我们就非常有信心地认定:这是一个独立的新词!
分词工具
jieba 设计了四种分词模式,这本质上是为了在准确率 (Precision)和召回率 (Recall)之间做权衡,以适配不同的下游任务:
精确模式:力求将句子无歧义地切开,适合作为文本分析、特征提取的标准输入。
全模式:追求极致的召回率,把所有可能的词都扫描出来。这会产生大量冗余和歧义,一般不直接用于语义理解。
搜索引擎模式:这是在构建信息检索 (IR) 或 RAG 系统的文档向量化阶段非常关键的模式。它在精确切分的基础上,对长词再次进行切分。
工程意义:如果使用精确模式,
西安电子科技大学会作为一个整体被存入倒排索引。此时用户如果搜索短语西安,可能会因为词不匹配而导致召回失败。搜索引擎模式通过切分出西安、电子等粒度,有效提升了长尾查询的召回率。
Paddle 模式:引入深度学习(双向 GRU 网络),这弥补了纯词典或传统 HMM 模型在上下文理解上的不足,提升了对新词的识别能力。
通用分词器的一个致命弱点:跨领域性能衰减。在专业领域表现不佳
比如在“会计经济法”这一专业领域的测试。可以看到,像 jieba、LTP 这样的通用分词器,在该领域的未登录词(OOV)率高达 31% 左右。
症结所在:通用分词器的内置词典是基于新闻、百科等开放域语料训练的。当它们面对法律文书中的专业法条、特定的法理概念,或者是医疗、金融等垂直领域的行话时,往往会将其错误拆散。
实践指导:在构建特定领域的智能系统(如法律文档阅读理解或摘要提取)时,直接开箱即用通用分词器是不可行的。通常必须介入挂载领域专属的业务词典(强规则干预),或者使用该领域的专业语料对深度学习模型进行微调,以压降 OOV 错误对下游任务(如知识图谱实体抽取、向量检索)造成的级联破坏。
思考
问题一:在大量文本的 NLP 任务中,是否可以忽略少量歧义带来的影响?
回答:不能一概而论,这完全取决于“下游任务的性质”。
可以忽略的情况(宏观/统计驱动型任务):在诸如文本分类、情感分析、主题模型等任务中,少量的分词歧义通常可以被忽略。因为这类任务依赖的是全局特征的统计分布(如词袋模型)或深层语义向量(如 BERT 的 Sentence Embedding)。在海量数据的冲刷下,个别词切错造成的“噪音”会被模型自身的鲁棒性吸收,不会对最终的宏观分类结果产生决定性影响。
不可忽略的情况(微观/精度驱动型任务):在信息抽取(实体识别/关系抽取)、知识图谱构建、法律文书分析、机器翻译或智能问答(QA / RAG)中,歧义绝对不可忽略。在这些场景下,一个实体的边界切分错误(例如把法条中的“原告”和后续动词切混,或者人名切错),会导致特征提取彻底失败,进而引发严重的错误级联(Error Propagation),直接摧毁整个句子的结构树或推理链条。
问题二:“研表究明”这种汉字乱序会不会影响中文分词?
回答:会产生显著影响,且是对不同时代的分词技术进行了一次“降维打击”。
问题这句话本身就巧妙地应用了乱序(“研表究明”)。人类能够顺畅阅读,是因为人类大脑具备自上而下的全局预测和脑补纠错能力。但对于机器而言:
对传统规则/词典分词(如最大匹配):灾难性打击。词典里有“研究表明”,但绝对没有“研表究明”。基于词典的方法会瞬间失效,将其切碎成单字(“研/表/究/明”),导致严重的词义丢失。
对传统统计分词(如 HMM / N-Gram):严重干扰。N-Gram 极度依赖局部的词汇共现频率。汉字乱序破坏了原本的高频转移概率,会导致模型算出极低的概率路径,从而切出错误的结果。
对深度学习模型(如 BiLSTM-CRF / Transformer):具有一定的抵抗力,但仍有影响。带有自注意力机制(Self-Attention)的深度学习模型,由于能够捕获全局字符级的上下文特征,它能“看到”这句话里包含了“研、究、表、明”这几个字,即使顺序错了,其输出的深层语义向量仍然会非常接近正确语序的向量。因此,深度学习分词器对这类乱序现象的容错率最高,表现最接近人类的认知。
问题三:可以从哪些方面来对专业领域新词发现任务进行评价?
回答:专业领域的新词发现评价体系,应该从“内在指标(Intrinsic)”和“外在指标(Extrinsic)”两个维度结合来进行。
1. 内在评价(关注新词发现算法本身的质量):
OOV Recall(未登录词召回率):最核心的指标。模型到底成功找出了多少原本不存在于通用词典中的专业新词。
Precision(新词准确率):模型找出来的“新词”,有多少是真正有意义的专业词汇?(防止模型为了提高召回率,把“的地得”和乱码也当成新词切出来,即防止过度切分)。
统计学验证基准:即提到的,设定阈值来检验提取出的新词的内部凝固度(PMI)和自由运用程度(左右信息熵)是否达标。
2. 外在评价(关注新词对下游工程任务的增益):这是工业界最看重的评价方式。不单独评估新词对不对,而是看把它加入词库后,系统整体性能变好了没有。
信息检索/搜索引擎评估:将新词引入倒排索引后,专业长尾词汇的搜索召回率(Recall@K)是否提升?
序列标注任务评估:将含有新词的分词结果输入到命名实体识别(NER)或自动摘要抽取模型中,观察最终 F1 分数是否提高。如果新词发现做得好,下游的实体边界识别往往会得到显著改善。
