jieba 结巴分词:Python 中文分词的基准线

jieba 在 GitHub 上已经拿到 34,989 Star 了。

fxsjy 开源的这个 Python 中文分词库,2012 年发布以来一直活跃维护。它支持的四种分词模式覆盖了从文本分析到搜索引擎的大多数场景,接口设计直接,社区生态跨越十几种编程语言。做中文 NLP 的开发者都清楚,任务的第一步往往是 import jieba。

正文顶部截图

1、 四种分词模式,各司其职

jieba 的分词不搞一刀切,每种模式对号入座。

精确模式是默认选择,把"我来到北京清华大学"切成"我/来到/北京/清华大学",适合文本分析和信息抽取。全模式追求速度,能把所有可能的词都扫出来,“乒乓球拍卖完了"会切成"乒乓/乒乓球/球拍/拍卖/卖完/完了”,480KB/s 的处理速度在文本预处理中相当能打。搜索引擎模式在精确模式基础上再对长词细分,提升召回率。还有基于 PaddlePaddle 的深度学习模式,用双向 GRU 网络做序列标注,同时输出词性。

2、 为什么社区选了 jieba

NLP 领域不缺分词工具,jieba 能在中文社区扎根有它的原因。

算法层面用了前缀词典加动态规划的经典组合。先基于前缀词典构建 DAG(有向无环图),把句子中所有成词可能都列出来,再用动态规划找最大概率路径。未登录词交给 HMM 模型和 Viterbi 算法处理。这套方案是 2012 年定下来的,十几年过去依然能打,说明当初的选型经得起考验。

API 设计零学习成本:jieba.cut() 返回 generator,jieba.lcut() 直接给 list。全模式和搜索引擎模式换个参数就行,不用换工具。

README区域截图

3、 不止是分词

分词是核心,但 jieba 能做的事不止于此。

关键词提取内置了 TF-IDF 和 TextRank 两套算法,jieba.analyse.extract_tags() 一行代码拿到结果。可以切换自定义 IDF 语料库和停用词表,适配不同领域文本。

词性标注走 ictclas 兼容的标记体系,jieba.posseg.cut() 直接返回带词性的分词结果。对需要抽取人名、地名、机构名的场景,这一步省掉了单独的 NER 环节。

并行分词对大批量文本处理是直接的加速手段。4 核 Linux 机器上处理金庸全集,精确分词跑出 1MB/s,单进程版的 3.3 倍。命令行直接 python -m jieba news.txt > cut_result.txt,对非 Python 开发者同样友好。

4、 跨语言生态

一个 Python 库被翻译成了 Java、C++、Rust、Node.js、Go、PHP、Erlang、R、C#、iOS 和 Android 版本,说明它解决的确实是一个足够底层也足够通用的需求。jieba 做到了。不管后端用什么语言,中文分词这一步都能找到对应的 jieba 实现。

自定义词典和动态调频的能力让 jieba 在实际业务中比纯模型方案更灵活。遇到"创新办"被切成"创新/办",加一行 jieba.add_word('创新办') 就修好,不用重新训练。

5、 适合谁

做中文文本分析的 Python 开发者直接把 jieba 作为分词第一步,API 够用且稳定。用其他语言的后端团队也能找到对应移植版。

对需要控制词典和生产环境自定义词表的团队,jieba 的词典管理比端到端深度学习方案更可控,出问题时排查成本更低。

自定义词表的团队,jieba 的词典管理比端到端深度学习方案更可控,出问题时排查成本更低。

更多推荐