中文分词,简单说就是把一串连续的汉字,按照语义切分成一个个独立的词。这步看似基础,却是搜索引擎理解内容、智能客服读懂提问、语音助手听懂指令的地基。分词做不好,后面的语义分析、情感判断、信息提取都会跟着出错。
这是中文分词最传统的实现方式,核心逻辑很直白:维护一个庞大的词库,然后把待处理的句子跟词库里的条目盯着比对。匹配顺序不同,衍生出几种变体。
正向最大匹配从句子左边开始,优先用最长的词语去套;逆向最大匹配则从右往左扫;双向最大匹配把两边的结果拿来对照,再根据"切出来的词越少越好""单个字越少越好"这类规则,挑一个更合理的结果。
比如"研究生命科学"这句,正向匹配可能切成"研究/生命/科学",逆向匹配可能得到"研究生/命/科学"——即便结果是两种,双向匹配也能靠规则倾向选前者。
这类办法的短板也很明显:遇到词库外的专有名词、网络新词基本没辙;碰上交叉歧义(如"结婚的和尚未结婚的")也常犯迷糊。实际项目里,通常得定期补词库,再叠加一些手工消歧规则才能用。
把分词当成一个"给每个字标注位置"的任务,是统计派的核心思路。标注体系一般用B打头(词首)、M(词中)、E(词尾)、S(单字成词)。模型用带标签的语料去学习,上线后对每个字预测它在词里的位置。
隐马尔可夫模型(HMM)是这派的经典代表,它学习的是状态转移概率(比如前一个字是B时,下一个字是M或E的概率)和发射概率(某个字出现在某位置的概率)。有了这两组概率,对任意汉字串,都能算出最可能的位置序列。
它的强项是泛化能力比纯词典好,对一部分没见过的词能靠上下文推断出来;弱点则是依赖大规模高质量标注数据,训练成本高,而且HMM这种结构记不住太长的上下文依赖。
深度学习让分词精度往前跳了一大步。双向长短期记忆网络(BiLSTM)能同时从左右两个方向获取上下文,避免只看单侧信息的局限。输出层通常再接一层条件随机场(CRF),用来管住标签序列的合法性——比如CRF会学习到"B后面不能直接接E"这类硬约束,把明显不合理的输出挡在门外。
再往后,BERT、RoBERTa这类预训练语言模型带来质变。词不再是机械的向量,而是根据它在句中的具体位置和语境动态生成。用大规模无监督语料预训练过的模型,只需少许任务数据微调,就能在公开评测集上把分词F1值稳定做到96%以上。
这套路子的代价是推理速度慢、显存占用高,只追求极致精度的话就选它,但别指望在弱机器上跑得飞快。
生产环境很少只押注一种方法。主流的混合做法分两步走:先用词典匹配做快速粗切分,把明显没歧义的词定下来;再把高风险的歧义片段和未登录词集中丢给统计或深度模型精修。这样既能保住速度,又能补上召回率。
开源工具各有侧重,选型得看场景:
如果业务词表基本可控、对响应延迟极度敏感,优先选匹配派方案;如果语料里新词、长难句密集,那预训练模型加CRF的组合更合适,哪怕牺牲一点速度也值得。
不是。英文词和词之间有空格隔开,"分词"更多指的是把单词还原成原形(去掉ing、ed之类的词缀);而中文没有天然间隔,分词是真正把连续汉字拆成词语序列,二者面对的困难和处理的粒度都完全不同。
后果是连锁的。搜索引擎会召回不相关的文档,机器翻译会把"武汉市长江大桥"译成奇怪的句子,用户问"我想学python",系统可能理解成"我想学PY小写游戏"。越往上层(意图识别、知识图谱)走,分词偏差被放大的程度越严重。
别急着标注。先直接用Jieba或HanLP的预训练模型跑上一版,积累一批线上日志里漏切、错分的样本;然后手动整理这些高频样本进自定义词典,同时标记少量典型歧义句给模型微调,用最小成本把准确度提上去。
分词没有一劳永逸的方案,核心是在"速度、精度、扩展性"之间做取舍。给三句实操建议:先用开源工具快速验证最简可行方案;关键业务场景务必做离线评测,别只盯着几个例子看效果;新词监控加上个性化词库更新机制,才能让分词能力随业务一起迭代。如果预算和技术储备允许,直接上预训练语言模型加CRF的管线,是目前精度上限最高的公开选择。