1. jieba 的江湖地位

NLP(自然语言)领域现在可谓是群雄纷争,各种开源组件层出不穷,其中一支不可忽视的力量便是 jieba 分词,号称要做最好的 Python 中文分词组件。

“最好的” 这三个字可不是空穴来风,jieba 在开源社区的受欢迎程度非常之高。

jieba 项目目前的 github star 数已经达到 24k,其他热门分词组件像 HanLP star 数 20k、ansj_seg star 数 5.6k、pkuseg-python star 数 5k。可见 jieba 已经稳居中文分词领域 c 位。

jieba 的主要功能是做中文分词,可以进行简单分词、并行分词、命令行分词,当然它的功能不限于此,目前还支持关键词提取、词性标注、词位置查询等。

更让人愉悦的是 jieba 虽然立足于 python,但同样支持其他语言和平台,诸如:C++、Go、R、Rust、Node.js、PHP、 iOS、Android 等。所以 jieba 能满足各类开发者的需求。

2. 如何学 jieba

据我所知,jieba 最靠谱的文档是 github 项目的 readme,因为它似乎还没有独立的使用文档。但由于使用起来简单,看 readme 也能快速上手。

Jieba库的Github地址

国内各大博客有关于 jieba 的使用教程,但需要甄别下准确度和时效性,因为 jieba 项目一直在更新。

当然本文不是纯粹的种草文章,会简单介绍下 jieba 的使用方法。

3. 安装 jieba

jieba 支持pip或者conda安装,直接在命令行执行:

1
pip install jieba

不出意外,应该能很快安装好。

你也可以下载 jieba 安装包再安装,jieba 的 pypi 地址:

Pypi地址

4. 分词初体验

分词是 NLP 处理的第一步,也是最基本的任务,分词的好坏直接决定了后面语义分析的精准度。

所谓分词就是将一段表述里的词汇进行分解,比如 “我爱中国”,分解后有三个词:我、爱、中国,词性分别是名词、动词、名词。

jieba 库中用于分词的方法有三个:

jieba.cut

给定中文字符串,分解后返回一个迭代器,需要用 for 循环访问。

参数解释:

「strs」: 需要分词的字符串;
「cut_all」:用来控制是否采用全模式;
「HMM」:用来控制是否使用 HMM 模型;
「use_paddle」:用来控制是否使用 paddle 模式下的分词模式,paddle 模式采用延迟加载方式,通过 enable_paddle 接口安装 paddlepaddle-tiny,并且 import 相关代码;

这里区分全模式和精确模式,举个例子先看看区别:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 全模式
seg_list = jieba.cut("中国上海是一座美丽的国际性大都市", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))

# 返回结果
Full Mode: 中国/ 上海// 一座/ 美丽/ 的/ 国际/ 国际性/ 大都/ 大都市/ 都市

# 精确模式
seg_list = jieba.cut("中国上海是一座美丽的国际性大都市", cut_all=False)
print("Full Mode: " + "/ ".join(seg_list))

# 返回结果
Default Mode: 中国/ 上海// 一座/ 美丽/ 的/ 国际性/ 大都市

可以看到,全模式把句子中所有的可以成词的词语都扫描出来, 会出现一词多用、一词多意。精确模式将句子最精确的切分开,每个词都只有一种含义。

jieba.cut方法默认是精确模式。

还有一个参数控制 paddle 模式,会更加精确,使用这个的前提是你需要先安装 paddlepaddle-tiny。

安装命令:
pip install paddlepaddle-tiny==1.6.1

详情可以去官网看下,这里不举例。

该方法和 cut 一样,分解后返回一个迭代器,需要用 for 循环访问。不过它是搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

参数解释:

「strs」:需要分词的字符串;
「HMM」:是否使用 HMM 模型,默认值为 True。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细。

1
2
3
4
5
6
# 搜索引擎模式
seg_list = jieba.cut_for_search("中国上海是一座美丽的国际性大都市,拥有复旦大学、上海交通大学等知名高等学府")
print(", ".join(seg_list))

# 返回结果
Search Mode: 中国, 上海, 是, 一座, 美丽, 的, 国际, 国际性, 大都, 都市, 大都市, ,, 拥有, 复旦, 大学, 复旦大学, 、, 上海, 交通, 大学, 上海交通大学, 等, 知名, 高等, 学府, 高等学府

jieba.lcut

jieba.cut使用方法一样,不过返回的是列表。

cut 和 cut_for_search 方法都是支持繁体字的。

5. 添加自定义词典

如果是对专业新闻或者小说进行分词,会有很多的新词汇,jieba 库里没有就没办法识别,那么就需要添加自定义的词汇,比如:奥利给。

添加自定义词汇的方法: jieba.load_userdict(file_name) 参数是文本文件,txt、csv 都可以。

自定义词典文件的词汇格式是一个词占一行,每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。 比如:

以 “奥利给,管虎执导的八佰是一部让人热血沸腾的好电影。” 这段话为例, 如果不添加自定义词典,很多词没办法识别出来。

1
2
3
4
5
6
# 不添加自定义词典
seg_list = jieba.cut("奥利给,管虎执导的八佰是一部让人热血沸腾的好电影")
print("/ ".join(seg_list))

# 返回结果
奥利/ 给// 管虎/ 执导/ 的/ 八佰是/ 一部// 人/ 热血沸腾/ 的/ 好/ 电影

添加自定义词典后,新词、人名、电影名都可以识别出来

1
2
3
4
5
6
7
# 载入词典
jieba.load_userdict("dict.txt")
seg_list = jieba.cut("奥利给,管虎执导的八佰是一部让人热血沸腾的好电影")
print("/ ".join(seg_list))

# 返回结果
奥利给/ ,/ 管虎/ 执导// 八佰// 一部// 人/ 热血沸腾/ 的/ 好/ 电影

6. 结论

jieba 无疑是一款优秀的分词工具,而且在不断地优化成长。前面讲了一些基本的使用,大家还可以尝试使用停用词、提取关键词、词性标注、词位置查询等功能,也是十分的便捷。