第1章:分词器概述
搜索引擎为什么需要分词器?这个问题,我当年刚入行时也琢磨过。说白了,用户输入一串文字,机器看不懂「苹果手机」是个整体,它只会傻乎乎地当成一个个字符去匹配。没有分词器,搜索引擎就是个文盲。
1.1 从用户输入到倒排索引
你想想看,用户搜「北京天气」,如果按单字切,索引里存的是「北」「京」「天」「气」。那搜「北京」时,匹配到的是两个单字,相关性一塌糊涂。我早期做过一个电商搜索项目,客户反馈搜「连衣裙」出来一堆「连」字相关的商品——嗯,当时分词没做好,被老板骂了一顿。
分词器的作用,就是把连续的文本切成有意义的词。比如「我爱自然语言处理」切成「我」「爱」「自然语言处理」。这样搜索引擎才能建立词级别的倒排索引,而不是字级别的。
核心观点:分词器决定了搜索引擎理解文本的最小语义单元。没有分词,就没有真正的语义搜索。
1.2 分词器在检索流程中的位置
整个检索流程,分词器出现在两个关键环节:
- 索引阶段:文档入库时,先分词,再建倒排索引。
- 查询阶段:用户输入查询词,先分词,再去索引里找。
我画个简单的流程图给你看:
文档入库 → 分词器切词 → 建立倒排索引
用户查询 → 分词器切词 → 检索倒排索引 → 排序返回
你看,分词器是入口。入口做不好,后面再牛的排序算法也白搭。我记得有一次线上事故,就是因为分词器把「iPhone14」切成了「iPhone」和「14」,结果用户搜「iPhone14 Pro」时,匹配不到「iPhone14」这个完整词条,召回率直接掉了30%。
1.3 分词器的核心挑战
分词看起来简单,实际坑很多。我总结几个常见的:
- 歧义切分:「南京市长江大桥」——是「南京/市长/江大桥」还是「南京市/长江大桥」?
- 未登录词:「蓝海资料掘金营」这种新词,词典里没有,怎么切?
- 粒度控制:「北京大学」是作为一个词,还是切分成「北京」「大学」?
我曾经在医疗搜索项目里踩过坑。用户搜「胃溃疡」,分词器切成了「胃」「溃疡」。结果搜「胃病」时,因为「胃」字匹配上了,把一堆不相关的胃病内容也召回了。后来我调整了分词粒度,把「胃溃疡」作为一个整体词条处理,准确率才提上来。
避坑指南:我曾经以为分词器越细越好,后来发现不是。粗粒度保留完整语义,细粒度提高召回率。实际项目中,我习惯用混合策略——粗粒度做主召回,细粒度做扩展召回。
1.4 主流分词器概览
目前业界常用的分词器,我列个表给你参考:
| 分词器 | 原理 | 适用场景 | 我的评价 |
|---|---|---|---|
| IK Analyzer | 词典+规则 | 中文通用搜索 | 轻量好用,适合中小项目 |
| jieba | 统计+词典 | Python生态 | 上手快,但性能一般 |
| HanLP | 深度学习 | 高精度场景 | 准确率高,但资源消耗大 |
| Elasticsearch内置 | 多种混合 | ES生态 | 开箱即用,但定制麻烦 |
我个人习惯,小项目先用IK,快速验证。大项目或者对精度要求高的,上HanLP。但不管选哪个,一定要做领域词典的定制。我见过太多项目,直接拿通用分词器上线,结果专业术语全切错了。
1.5 本章小结
分词器是搜索引擎的「眼睛」。它把人类语言翻译成机器能理解的词条。位置在索引和查询的最前端,决定了后续所有环节的上限。选型时,别只看名气,要结合你的数据特点。下一章,我会带你深入IK分词器的源码,看看它到底是怎么工作的。
注意:不要迷信任何分词器。没有万能的分词方案,只有最适合你业务场景的。我建议你先把本章的流程图画出来,再动手选型。