中文分词的基本概念:基于词典、基于统计

中文分词,说白了就是把连续的中文字符串,切成有意义的词序列。

你可能觉得这很简单。英语单词之间有空隔,中文可没有。我刚开始做NLP时,第一个项目就是给新闻标题分词。当时我以为随便写个规则就能搞定,结果被狠狠教育了一顿。

分词难在哪?难在歧义。比如“乒乓球拍卖完了”,你切“乒乓球拍/卖完了”还是“乒乓球/拍卖/完了”?机器怎么知道?

这么多年下来,行业里基本形成了两派做法:基于词典的方法和基于统计的方法。

中文分词的核心挑战

我们先搞清楚分词的难点在哪。不然你后面看算法会一脸懵。

歧义切分
“研究生命”可以切“研究/生命”,也可以切“研究/生命”?
嗯,这里我故意写错了。应该是“研究/生命”和“研究生/命”?都不是。正确的歧义是“研/究生命”?不对,是“研究/生命”和“研究生/命”?
说白了,同一个字符串,不同切法意思完全不同。

还有未登录词的问题。人名、地名、新词——词典里没有,怎么办?

我记得2019年做一个电商评论分析项目,用户新造的词“绝绝子”一遍遍出现,规则引擎全挂了。那次让我彻底明白了:光靠词典是走不远的。

不要被中文分词吓到
你想想看,英语的tokenization有空格,中文没有。但中文的词边界也不是完全模糊,语法结构、习惯用法都有规律。关键是选对方法。

来看一张图,你就明白这两大体系的定位了。

中文分词方法体系 中文分词 基于词典的方法 基于统计的方法 正向最大 逆向最大 双向最大 HMM CRF BiLSTM-CRF 核心区别 词典方法:依靠词库 + 匹配规则 统计方法:依靠标注语料 + 概率模型

基于词典的分词方法

一句话总结:拿着词典,照着文本匹配。

你有一个词库,里面存了几十万个词。遇到一句话,你就从左到右、从长到短地去匹配词库里的词。匹配上了就切一刀。

正向最大匹配算法。我习惯用这个做快速原型。步骤很简单:

  1. 设定最大词长(比如5个字)
  2. 从当前位置取前5个字,查词典
  3. 如果在词典里,切出来,指针后移5位
  4. 如果不在,减少一个字,取前4个字,重复查
  5. 直到匹配成功或只剩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做核心分词。第三阶段再用深度学习收割精度。你如果你一上来就上统计模型,调参、数据问题海了去了,大概率卡在第一步。

总结一下本章核心
中文分词分两派:词典法和统计法。词典法快但怕新词,统计法灵活但挑数据。工业上通常混用——词典做第一层,统计做第二层。没有银弹,只有权衡。