在文本搜索、自然语言处理、智能推荐等场景中,「分词」 是一个基础但至关重要的技术点。无论是用数据库做模糊查询,还是构建搜索引擎,分词都是提高效率和准确度的核心手段。
🔍 一、什么是分词?
分词(Tokenization) 是指将一段连续的文本切分为有意义的「词语」或「短语」的过程。
它是 NLP(自然语言处理)和全文搜索的第一步。
举个例子:
原始文本:
“我爱自然语言处理”
分词结果(中文):
我 / 爱 / 自然语言 / 处理
英文文本通常以空格分词,而中文、日文、韩文等语言需要使用特定算法来切割词边界。
🛠️ 二、为什么分词很重要?
在以下场景中都需要高质量的分词:
场景 | 分词作用 |
---|---|
✅ 全文搜索 | 提升检索准确率,支持模糊查询 |
✅ 推荐系统 | 理解用户搜索意图或商品名称 |
✅ 智能问答 | 理解提问背后的关键词 |
✅ 文本分类 | 提取核心词汇构建向量表示 |
✅ 数据分析 | 对用户输入进行关键词提取 |
🔍 三、常见分词方案对比
方案 | 适用语言 | 是否支持中文 | 特点 | 使用场景 |
---|---|---|---|---|
✅ MySQL FULLTEXT | 英文 | ❌ 不支持中文 | 内置分词器基于空格、标点 | 英文搜索 |
✅ MySQL FULLTEXT + ngram | 所有语言 | ✅ 支持中文 | 固定长度 n-gram 切词,能识别 N3-2016 | 中文、混合语言搜索 |
✅ Elasticsearch + ik_smart / ik_max_word | 所有语言 | ✅ 强大中文支持 | 支持最细粒度 & 智能分词 | 搜索引擎 |
✅ Lucene / Solr | 所有语言 | ✅ 强大中文支持 | 高级分词、多语言支持 | 企业级搜索系统 |
✅ Jieba 分词(Python) | 中文 | ✅ | 精度高,支持自定义词典 | NLP 开发、爬虫分析 |
✅ HanLP、THULAC、NLPIR | 中文 | ✅ | 学术/工业级分词工具 | AI/NLP |
📦 四、MySQL 中的分词方案
1. LIKE 查询(最基础)
SELECT * FROM articles WHERE title LIKE '%分词%';
✅ 简单
❌ 性能差、不支持分词、不适合大数据量
2. FULLTEXT(默认分词器)
ALTER TABLE articles ADD FULLTEXT(title);
SELECT * FROM articles WHERE MATCH(title) AGAINST('token' IN BOOLEAN MODE);
✅ 支持全文索引,适合英文
❌ 不支持中文、符号(如 “N3-2016”)
3. FULLTEXT + ngram
分词器
ALTER TABLE articles ADD FULLTEXT(title) WITH PARSER ngram;
✅ 支持中文、符号和短词搜索
✅ 轻量级,适合小中型系统
⚠️ 需 MySQL 5.7.6+(推荐 8.0+)
💡 五、如何选择分词方案?
应用场景 | 推荐方案 |
---|---|
小型项目 / 中文搜索 | MySQL + ngram |
高性能全文搜索 | Elasticsearch + IK 分词器 |
数据分析 / 自然语言处理 | Jieba、HanLP |
多语言搜索服务 | Lucene / Solr |
日志搜索、文档系统 | OpenSearch / ES |
✅ 六、分词实践建议(Best Practices)
1. 明确使用目的
是为了搜索?还是为了 NLP?目标不同,分词策略也不同。
2. 中文必须用支持分词的工具
MySQL 默认不支持中文分词,必须使用 ngram
或换用专业搜索引擎。
3. 统一处理符号、大小写
对输入内容进行规范化(去除符号、统一大小写)可提升命中率。
4. 结合业务词库
例如:“N3-2016”、“语法7” 这类业务词汇可加入自定义词典(如在 Jieba、HanLP 中)。
5. 分词 + 索引结合使用
仅分词不够,必须结合索引使用才能实现高性能查询。
✍️ 七、小结
维度 | MySQL ngram | Elasticsearch | Jieba 分词 |
---|---|---|---|
中文支持 | ✅ | ✅ | ✅ |
安装复杂度 | 简单 | 中等 | 简单 |
精度 | 一般 | 高 | 高 |
可扩展性 | 中 | 强 | 中 |
搜索效率 | 高 | 极高 | 中 |
👉 对于大多数中小项目,如果你不想引入 ES,MySQL + ngram 是轻量又高效的选择。
📚 延伸阅读
-
MySQL 官方文档:ngram 分词器
-
Elasticsearch 中文分词:IK Analyzer
-
Jieba 中文分词 GitHub