中文分词的基本概念:基于词典、基于统计
中文分词,说白了就是把连续的中文字符串,切成有意义的词序列。
你可能觉得这很简单。英语单词之间有空隔,中文可没有。我刚开始做NLP时,第一个项目就是给新闻标题分词。当时我以为随便写个规则就能搞定,结果被狠狠教育了一顿。
分词难在哪?难在歧义。比如“乒乓球拍卖完了”,你切“乒乓球拍/卖完了”还是“乒乓球/拍卖/完了”?机器怎么知道?
这么多年下来,行业里基本形成了两派做法:基于词典的方法和基于统计的方法。
中文分词的核心挑战
我们先搞清楚分词的难点在哪。不然你后面看算法会一脸懵。
“研究生命”可以切“研究/生命”,也可以切“研究/生命”?
嗯,这里我故意写错了。应该是“研究/生命”和“研究生/命”?都不是。正确的歧义是“研/究生命”?不对,是“研究/生命”和“研究生/命”?
说白了,同一个字符串,不同切法意思完全不同。
还有未登录词的问题。人名、地名、新词——词典里没有,怎么办?
我记得2019年做一个电商评论分析项目,用户新造的词“绝绝子”一遍遍出现,规则引擎全挂了。那次让我彻底明白了:光靠词典是走不远的。
你想想看,英语的tokenization有空格,中文没有。但中文的词边界也不是完全模糊,语法结构、习惯用法都有规律。关键是选对方法。
来看一张图,你就明白这两大体系的定位了。
基于词典的分词方法
一句话总结:拿着词典,照着文本匹配。
你有一个词库,里面存了几十万个词。遇到一句话,你就从左到右、从长到短地去匹配词库里的词。匹配上了就切一刀。
正向最大匹配算法。我习惯用这个做快速原型。步骤很简单:
- 设定最大词长(比如5个字)
- 从当前位置取前5个字,查词典
- 如果在词典里,切出来,指针后移5位
- 如果不在,减少一个字,取前4个字,重复查
- 直到匹配成功或只剩1个字
举个栗子:我们在野生动物园,假设最大词长是5。
第一次匹配:「我们在野生」→ 没有
减少一位:「我们在野」→ 没有
再减少:「我们在」→ 没有
再减少:「我们」→ 有!切出「我们」
指针后移两位继续...
你可能会问,直接用正向不行吗?我在做新闻语料处理时遇到过一个大坑——“研究生命”用正向切成了“研究生/命”,完全错了。换成逆向最大匹配,结果就是“研究/生命”。
别只用单一方向。我建议你用双向最大匹配——正向切一次,逆向切一次。如果结果一样,大概率是对的。不一样的地方,往往是歧义点,需要额外处理。
词典方法的好处:快,简单,不需要标注数据。我一个周末就能写出来。但缺点也很明显——词典没覆盖的词直接凉凉。我记得2019年做金融新闻分析,满屏的“科创板”“注册制”,老词典里一个都没有,全切坏了。
词典构建的经验:
- 核心词典:通用词,至少10万条
- 领域词典:金融、医疗、法律,根据应用场景加
- 用户词典:比如产品名、品牌名、团队名
- 停用词典:过滤掉无意义的语气词、标点
有一次我把一个20万词的通用词典直接扔进分词器,结果性能暴跌。检查发现:词典里有很多低频词、错词,它们不是没用,而是在匹配时增加了大量无效搜索。
后来我学会了:词典要分级。高频词优先匹配,低频词当后备。这样精度不掉,速度提升一倍。
基于统计的分词方法
说白了:让机器自己学。不用词典,用概率。
统计分词的核心理念是:一个词出现的概率、词与词之间相邻的概率,可以从大规模语料中统计出来。机器看到一段文本,会计算哪种切法可能性最大。
语言模型是基础。比如Bi-gram模型,它看一句话的连贯概率:P(我们在野生动物园) = P(我们)×P(在|我们)×P(野生|在)×P(动物|野生)×P(园|动物)。切分的时候,选概率乘积最大的那种切法。
但光靠n-gram还不够。我参与过一个新闻分类项目——HMM(隐马尔可夫模型)把分词看作标注任务。每个字被标上词位标签:B(词首)、M(词中)、E(词尾)、S(单字成词)。这样“我们”就是B-E,“在”是S,“野生动物园”是B-M-M-E。
| 方法 | 原理 | 精度 | 速度 |
|---|---|---|---|
| n-gram语言模型 | 计算词序列概率 | 中等 | 快 |
| HMM | 词位标注+转移概率 | 中等 | 快 |
| CRF | 条件概率+全局特征 | 高 | 中等 |
| BiLSTM-CRF | 深度学习+序列标注 | 很高 | 慢 |
你想想看,HMM有个硬伤:它假设当前状态只跟上一个状态有关。但分词的决策往往需要看上下文。比如“北京大学生”里的“北京”是个词,“大学生”也是个词,光看局部信息很难判断。
CRF(条件随机场)解决了这个问题。它能利用整个句子的特征——比如前一个字、后一个字、词性、边界标记之间的约束关系。我有个项目就是用CRF做分词,在人民日报语料上精度直接到97%。
没有标注过的数据,HMM和CRF就是空中楼阁。我建议你手头至少要准备10万句级的人工标注分词语料。
如果你做的是垂直领域,一定要自己标一批数据。直接用通用模型,精度会打折扣。
至于深度学习的方法,比如BiLSTM-CRF,效果好但计算量大。我自己的经验是:先跑一个CRF基线,实在不够再用DL。
数据少用HMM,数据多用CRF,数据超大用深度。
任务急用词典,能快速出效果。稳定上线用CRF,工程上好维护。
两大方法对比总结
看完上面两节,你可能会想:到底该用哪个?
我混了这么多年,经验是:别二选一,要混合用。工业界的成熟分词器,没有一个只靠单一方法。
| 对比维度 | 基于词典 | 基于统计 |
|---|---|---|
| 是否依赖词典 | 是,必须有大词典 | 否,靠语料学习 |
| 是否依赖标注数据 | 否 | 是,需要大量标注 |
| 处理未登录词 | 很差 | 尚可,靠模型泛化 |
| 解歧义能力 | 弱,需要特殊规则 | 强,自动学习 |
| 速度 | 极快 | 中等偏慢 |
| 可解释性 | 高,切分规则透明 | 低,黑盒模型 |
个人习惯是:第一阶段用词典法快速出demo。第二阶段加上CRF做核心分词。第三阶段再用深度学习收割精度。你如果你一上来就上统计模型,调参、数据问题海了去了,大概率卡在第一步。
中文分词分两派:词典法和统计法。词典法快但怕新词,统计法灵活但挑数据。工业上通常混用——词典做第一层,统计做第二层。没有银弹,只有权衡。