常用分词算法:规则、统计与神经网络方法

说到分词,很多新手第一反应就是“把句子拆成词”。

嗯,不全是。你想想看,中文没有天然空格,同一个句子在不同场景下切法完全不同。举个例子,“南京市长江大桥”——到底是“南京/市长/江大桥”还是“南京市/长江大桥”?

我个人最早接触分词时,用的是最简单的方法:词典匹配。后来发现完全不够用。今天我把三种主流方法——基于规则、统计、神经网络——掰开揉碎讲讲。

1. 基于规则的分词:最朴素的思路

说白了就是“背词典”。维护一个超大词典,然后从左到右匹配。最常见的两种方式:

  • 正向最大匹配(FMM):从句子开头取最长匹配词,比如词典里有“研究”和“研究生”,FMM倾向于选更长的“研究生”。
  • 反向最大匹配(BMM):从句子末尾往前匹配,能处理一些FMM搞不定的边界情况。
  • 双向最大匹配(Bi-MM):FMM和BMM都跑一次,选结果更合理的那一个——比如词数更少、单字更少。

我在做早期文本过滤项目时,就用过FMM+BMM组合。词典大概50万词,切分速度很快,但遇到未登录词(比如新网络用语“蚌埠住了”)就直接崩了。那会儿我花了两个星期给词典打补丁,根本打不完。

小技巧:规则分词适合词典完备、领域固定的场景。比如药品名称库、法律条款——这时候词典几乎不会漏,速度快又可控。

2. 统计分词:让语料说话

规则方法最大的痛点:词典永远不够全。统计分词换了个思路——我不硬匹配,我学概率。

核心假设:每个字属于哪个词,取决于它附近几个字的联合概率。最经典的模型:

  • N-gram语言模型:用词序列的出现频率来评估切分。比如“的”字经常跟在名词后,模型就会倾向于把“的”和前面词分开。
  • 隐马尔可夫模型(HMM):把分词看作一个序列标注问题——每个字可以标记为B(词首)、M(词中)、E(词尾)、S(单字成词)。然后通过Viterbi解码找到最优状态序列。
  • 条件随机场(CRF):在HMM基础上加入更多特征(比如字的位置、词性),效果更好,但训练也慢一些。
方法 核心思想 优点 缺点
N-gram + Viterbi 基于词频的联合概率 简单、无需标注数据 泛化能力弱,稀疏问题
HMM 序列标注 + 转移概率 训练快,适合小语料 特征有限,对上下文不敏感
CRF 全局归一化 + 手工特征 效果稳定,可控性高 特征工程费时

记得我在做舆情分析系统时,用的就是CRF。每天处理十几万条微博,分词准确率做到97%左右。但每次换领域(比如从新闻切到医疗)就得重新标注数据、重新训练特征模板,真的很累。

3. 神经网络分词:端到端的暴力美学

大概从2015年开始,深度学习全面渗透到NLP。分词也不例外。你不再需要手工设计特征,直接喂字符序列给模型,输出就是词边界。

主流架构:

  • BiLSTM-CRF:双向LSTM提取上下文特征,上层挂CRF做标签约束。中规中矩,效果不错。
  • BERT + 分类头:预训练模型把每个字编码成语义向量,然后接一个全连接层预测标签(B/M/E/S)。现在很多商用系统直接这么搞。
  • 基于Transformer的生成式:比如用BART或T5直接生成带分隔符的序列,虽然慢,但能处理一些复杂歧义。
我的避坑经验:我曾经以为BERT分词无所不能,结果在英文混写的中文日志上翻了车。因为词表里没有“API接口”这种复合词,BERT把它切成了“AP”和“I接口”。后来加了领域微调才搞定。

神经网络的优点非常明显:

  • 自动学习特征,减轻人工负担
  • 对未登录词和歧义鲁棒性更强
  • 可以轻松融入词性、句法等多任务学习

但缺点也摆在那里:需要大量标注数据、训练慢、推理延迟高。在实时对话系统里,用BERT分词可能比规则方法慢10倍以上——这个代价有时候不值得。

4. 三种方法对比总览

选哪种?我给自己总结了一个判断表,分享给你:

维度 规则 统计 神经网络
数据需求 仅词典 标注+未标注文本 大量标注数据
泛化能力 弱(只能切词典词) 中等(能处理常见组合) 强(能理解语义)
推理速度 毫秒级 毫秒~几十毫秒 几十~几百毫秒
开发成本 低(构建词典即可) 中(特征工程耗时) 高(训练&调参)
适合场景 封闭领域、高吞吐 中等规模、通用文本 开放领域、高精度要求
注意:不要一上来就追最新神经网络方法。很多场景下,“规则+统计”的混合方案性价比最高。我见过一个新闻分类系统,只用CRF+小词典就达到了98%的准确率——因为新闻用语非常规范。

5. 知识体系总图

下面这张图把三种方法的演进路径和关键模型串起来了,你可以存下来当复习提纲。

分词算法演进图谱 基于规则 正向最大匹配 反向最大匹配 双向最大匹配 数据不足 基于统计 N-gram + Viterbi 隐马尔可夫HMM 条件随机场CRF 拥抱深度学习 神经网络 BiLSTM+CRF BERT + 标注头 生成式Transformer 🔥 实战中更常见的做法:混合方法 规则初筛 + 统计消歧 + 神经网络兜底 例如:CRF做主模型,词典做后处理修正,BERT做二次验证 性能/成本平衡曲线 规则(低成本·低精度) → 统计(中成本·中精度) → 神经网络(高成本·高精度) 选哪个?先问你的语料规模和推理时延要求。

回到开头那个问题:如果明天让你从零开始给一个中文项目加分词,你会选哪条路?

我个人建议:先评估数据量。只有一本词典,那就用规则;有一堆未标注文本,试试N-gram统计;如果准备了带标签语料,直接上CRF或BiLSTM-CRF;大厂资源多,可以上BERT,但记得做模型压缩。