代码视界

Hanpeng Chen的个人博客

中文分词Python库介绍

本文于 1092 天之前发表,文中内容可能已经过时。

在前面的文章《中文分词》一文中,我们简单介绍了中文分词及其常用的分词方法,本文将介绍几个比较有代表性的支持中文分词的python库。
本文所有实例均基于python3.6环境运行。

jieba

结巴分词:使用较为广泛的一款python分词工具,专用于分词的python库,分词效果较好。

GitHubhttps://github.com/fxsjy/jieba

特点:

  • 支持三种分词模式:
    1、精确模式:试图将句子最精确地切开,适合文本分析
    2、全模式:把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义
    3、搜索引擎模式:在精确模式下,对长词再次切分,提高召回率,适合用于搜索引擎分词

  • 支持繁体分词

  • 支持自定义词典

算法:

  • 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)
  • 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
  • 对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法

用法实例:

下面我们通过简单的代码来看一下精确模式、全模式、搜索引擎模式三种分词模式的分词效果。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- coding: utf-8 -*-
import jieba
string = '话说天下大势,分久必合,合久必分。周末七国分争,并入于秦。及秦灭之后,楚、汉分争,又并入于汉。汉朝自高祖斩白蛇而起义,一统天下,后来光武中兴,传至献帝,遂分为三国。推其致乱之由,殆始于桓、灵二帝。桓帝禁锢善类,崇信宦官。及桓帝崩,灵帝即位,大将军窦武、太傅陈蕃共相辅佐。时有宦官曹节等弄权,窦武、陈蕃谋诛之,机事不密,反为所害,中涓自此愈横。'
# 精确模式
default_result = jieba.cut(string)
print('精确模式:' + '/'.join(default_result))

# 全模式
full_result = jieba.cut(string, cut_all=True)
print('全模式:' + '/'.join(full_result))

# 搜索引擎模式
search_result = jieba.cut_for_search(string)
print('搜索引擎模式:' + '/'.join(search_result))

结果:

1
2
3
4
5
精确模式:话/说/天下/大势/,/分久必合/,/合久必分/。/周末/七/国/分争/,/并入/于/秦/。/及/秦灭/之后/,/楚/、/汉/分争/,/又/并入/于汉/。/汉朝/自/高祖/斩/白蛇/而/起义/,/一统天下/,/后来/光武/中兴/,/传至/献帝/,/遂/分为/三国/。/推其致/乱/之/由/,/殆/始于/桓/、/灵/二帝/。/桓帝/禁锢/善类/,/崇信/宦官/。/及桓帝/崩/,/灵帝/即位/,/大将军/窦武/、/太傅陈/蕃/共/相/辅佐/。/时有/宦官/曹节/等/弄权/,/窦武/、/陈蕃/谋/诛/之/,/机事不密/,/反为/所害/,/中/涓/自此/愈横/。

全模式:话/说/天下/大势///分久必合///合久必分///周末/七国/国分/分争///并入/于/秦///及/秦/灭/之后///楚///汉/分争///又/并入/于/汉///汉朝/自/高祖/斩/白蛇/而/起义///一统/一统天下/天下///后来/光/武/中兴///传/至/献帝///遂/分为/三国///推/其/致/乱/之/由///殆/始于/桓///灵/二帝///桓/帝/禁锢/善类///崇信/宦官///及/桓/帝/崩///灵/帝/即位///大将/大将军/将军/窦/武///太傅/太傅陈/蕃/共相/相辅/辅佐///时/有/宦官/曹/节/等/弄权///窦/武///陈/蕃/谋/诛/之///机事不密///反为/所/害///中/涓/自此/愈/横//

搜索引擎模式:话/说/天下/大势/,/分久必合/,/合久必分/。/周末/七/国/分争/,/并入/于/秦/。/及/秦灭/之后/,/楚/、/汉/分争/,/又/并入/于汉/。/汉朝/自/高祖/斩/白蛇/而/起义/,/一统/天下/一统天下/,/后来/光武/中兴/,/传至/献帝/,/遂/分为/三国/。/推其致/乱/之/由/,/殆/始于/桓/、/灵/二帝/。/桓帝/禁锢/善类/,/崇信/宦官/。/及桓帝/崩/,/灵帝/即位/,/大将/将军/大将军/窦武/、/太傅/太傅陈/蕃/共/相/辅佐/。/时有/宦官/曹节/等/弄权/,/窦武/、/陈蕃/谋/诛/之/,/机事不密/,/反为/所害/,/中/涓/自此/愈横/。

从上面的结果来看,分词效果还不错。

jieba还提供了下面几个功能,具体实现代码可以自行到github上查看,这里不再详细介绍。

  • 添加自定义词典:开发者还可以指定自己自定义的词典,以便包含jieba词库中没有的词。
  • 关键词提取:
    • 基于TF-IDF算法的关键词抽取(jieba.analyse)
    • 基于TextRank算法的关键词抽取(jieba.analyse.textrank)

THULAC

THULAC(THU Lexical Analyzer for Chinese)由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。

GitHubhttps://github.com/thunlp/THULAC-Python

特点

THULAC具有如下几个特点:

  • 能力强。利用我们集成的目前世界上规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大。
  • 准确率高。该工具包在标准数据集Chinese Treebank(CTB5)上分词的F1值可达97.3%,词性标注的F1值可达到92.9%,与该数据集上最好方法效果相当。
  • 速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度可达到1.3MB/s。

用法实例

下面我们开看下THULAC的分词效果,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
# -*- coding: utf-8 -*-
import thulac

# 默认模式,有词性标注
thu1 = thulac.thulac()
thu1_result = thu1.cut(string, text=True)
print('thu1_result:' + thu1_result)

# 只分词,不进行词性标注
thu2 = thulac.thulac(seg_only=True)
thu2_result = thu2.cut(string, text=True)
print('thu2_result:' + thu2_result)

分词结果:

1
2
3
thu1_result:话_n 说_v 天下_n 大势_n ,_w 分久必合_id ,_w 合久必分_id 。_w 周末_t 七国分争_id ,_w 并入_v 于_p 秦_g 。_w 及_c 秦灭_v 之后_f ,_w 楚_j 、_w 汉_g 分争_v ,_w 又_c 并入_v 于_p 汉_g 。_w 汉朝_t 自_r 高_a 祖斩_n 白蛇_n 而_c 起义_v ,_w 一统天下_id ,_w 后_f 来_v 光武_ns 中兴_nz ,_w 传_v 至_d 献_v 帝_g ,_w 遂_d 分为_v 三_m 国_n 。_w 推_v 其_r 致乱_v 之_u 由_g ,_w 殆始_v 于_p 桓_g 、_w 灵二帝_id 。_w 桓帝_np 禁锢_v 善类_n ,_w 崇信_v 宦官_n 。_w 及_c 桓帝崩_n ,_w 灵帝_n 即位_n ,_w 大将军_n 窦武_v 、_w 太傅_n 陈蕃_np 共_d 相_d 辅佐_v 。_w 时_g 有_v 宦官_n 曹节_np 等_u 弄权_n ,_w 窦武_np 、_w 陈蕃_np 谋诛_v 之_u ,_w 机事不密_i ,_w 反_d 为_v 所_u 害_v ,_w 中_j 涓_j 自此_d 愈_d 横_a 。_w

thu2_result:话 说 天下 大势 , 分久必合 , 合久必分 。 周末 七国分争 , 并入 于 秦 。 及 秦灭 之后 , 楚 、 汉分 争 , 又 并入 于汉 。 汉朝 自 高祖斩白蛇而起义 , 一统天下 , 后 来 光武 中兴 , 传 至 献帝 , 遂 分为 三 国 。 推 其 致乱 之 由 , 殆始 于 桓 、 灵二帝 。 桓帝 禁锢善类 , 崇信 宦官 。 及 桓帝崩 , 灵帝 即位 , 大将 军窦武 、 太 傅陈蕃 共 相辅佐 。 时 有 宦官 曹节 等 弄权 , 窦武 、 陈蕃 谋诛之 , 机事不密 , 反 为 所 害 , 中涓 自此 愈横 。


PKUSeg

PKUSeg是由北京大学语言计算与机器学习研究组研制推出的一套全新的中文分词工具包。它简单易用,支持多领域分词,在不同领域的数据上都大幅提高了分词的准确率。

GitHub: https://github.com/lancopku/pkuseg-python

特点

pkuseg有如下几个特点:

  • 多领域分词
  • 更高的分词准确率
  • 支持用户自训练模型
  • 支持词性标注

用法实例

分词代码:

1
2
3
4
5
import pkuseg
# 使用默认配置进行分词
seg = pkuseg.pkuseg()
text = seg.cut(string)
print(text)

分词结果:

1
['话说', '天下', '大势', ',', '分久必合', ',', '合久必分', '。', '周末', '七', '国', '分争', ',', '并入', '于', '秦', '。', '及', '秦灭', '之后', ',', '楚', '、', '汉分', '争', ',', '又', '并入', '于汉', '。', '汉朝', '自', '高', '祖斩', '白蛇而起义', ',', '一统天下', ',', '后来', '光武', '中兴', ',', '传至', '献帝', ',', '遂', '分为', '三国', '。', '推', '其', '致乱', '之', '由', ',', '殆始于桓', '、', '灵二帝', '。', '桓帝', '禁锢', '善类', ',', '崇信', '宦官', '。', '及', '桓帝崩', ',', '灵帝', '即位', ',', '大将军', '窦武', '、', '太傅', '陈', '蕃共', '相', '辅佐', '。', '时有', '宦官', '曹节', '等', '弄权', ',', '窦武', '、', '陈', '蕃谋', '诛之', ',', '机事不密', ',', '反为所害', ',', '中', '涓', '自此', '愈', '横', '。']

三个库比较

pkuseg在开源时对其进行测评,pkuseg的作者们选择 THULAC、结巴分词等国内代表分词工具包与 pkuseg 做性能比较。他们选择 Linux 作为测试环境,在新闻数据(MSRA)和混合型文本(CTB8)数据上对不同工具包进行了准确率测试。此外,测试使用的是第二届国际汉语分词评测比赛提供的分词评价脚本。评测结果如下:

我们可以看到,最广泛使用的结巴分词准确率最低,清华的THULAC分词准确率也低于PKUSeg。当然,pkuseg 是在这些数据集上训练的,因此它在这些任务上的准确率也会更高一些,也由此在其开源后对于其高准确率曾引起一些质疑和争议,有兴趣的朋友可以自行百度或点击下面链接查看:
https://github.com/lancopku/pkuseg-python/issues/9


更多python中文分词库

上面都只是简单介绍了jieba、THULAC和pkuseg三个分词python库,更多用法和参数请到相应的github上查阅。

还有一些中文分词的python库,这里只提供其github地址,就不一一介绍,有兴趣的朋友自行查看研究。

SnowNLP https://github.com/isnowfy/snownlp

NLPIR https://github.com/NLPIR-team/NLPIR

FoolNLTK https://github.com/rockyzhengwu/FoolNLTK

LTP https://github.com/HIT-SCIR/pyltp

欢迎关注微信公众号: 『前端极客技术』『代码视界』
支付宝打赏 微信打赏

赞赏是不耍流氓的鼓励