1. 介绍

JIEBA 是目前最好的 Python 中文分词组件,它主要有以下 3 种特性:

  • 支持 3 种分词模式:精确模式、全模式、搜索引擎模式
  • 支持繁体分词
  • 支持自定义词典
import jieba
import jieba.posseg as pseg 
import jieba.analyse as anls

2. 分词

  可使用 jieba.cutjieba.cut_for_search 方法进行分词,两者所返回的结构都是一个可迭代的 generator,可使用 for 循环来获得分词后得到的每一个词语(unicode),或者直接使用 jieba.lcut 以及 jieba.lcut_for_search 直接返回 list。其中:

  • jieba.cutjieba.lcut 接受 3 个参数:
  • 需要分词的字符串(unicode 或 UTF-8 字符串、GBK 字符串)
  • cut_all 参数:是否使用全模式,默认值为 False
  • HMM 参数:用来控制是否使用 HMM 模型,默认值为 True
  • jieba.cut_for_searchjieba.lcut_for_search 接受 2 个参数:
  • 需要分词的字符串(unicode 或 UTF-8 字符串、GBK 字符串)
  • HMM 参数:用来控制是否使用 HMM 模型,默认值为 True
# 全模式
seg_list = jieba.cut("他来到上海交通大学", cut_all=True)
print("【全模式】:" + "/ ".join(seg_list))
# 精确模式
seg_list = jieba.cut("他来到上海交通大学", cut_all=False)
print("【精确模式】:" + "/ ".join(seg_list))

2.2 搜索引擎模式

# 搜索引擎模式
seg_list = jieba.cut_for_search("他毕业于上海交通大学机电系,后来在一机部上海电器科学研究所工作")  
print("【搜索引擎模式】:" + "/ ".join(seg_list))

 

2.3 HMM模型

HMM 模型,即隐马尔可夫模型(Hidden Markov Model, HMM),是一种基于概率的统计分析模型,用来描述一个系统隐性状态的转移和隐性状态的表现概率。在 jieba 中,对于未登录到词库的词,使用了基于汉字成词能力的 HMM 模型和 Viterbi 算法,其大致原理是:

# 未启用 HMM
seg_list = jieba.cut("他来到了网易杭研大厦", HMM=False) #默认精确模式和启用 HMM
print("【未启用 HMM】:" + "/ ".join(seg_list))  

【未启用 HMM】:他/ 来到/ 了/ 网易/ 杭/ 研/ 大厦
# 识别新词
seg_list = jieba.cut("他来到了网易杭研大厦") #默认精确模式和启用 HMM
print("【识别新词】:" + "/ ".join(seg_list))  
【识别新词】:他/ 来到/ 了/ 网易/ 杭研/ 大厦

 

3 添加自定义字典

3.1 载入字典

使用 jieba.load_userdict(file_name) 即可载入词典。

# 示例文本
sample_text = "周大福是创新办主任也是云计算方面的专家"
# 未加载词典
print("【未加载词典】:" + '/ '.join(jieba.cut(sample_text)))
【未加载词典】:周大福/ 是/ 创新/ 办/ 主任/ 也/ 是/ 云/ 计算/ 方面/ 的/ 专家

# 载入词典
jieba.load_userdict("userdict.txt")
# 加载词典后
print("【加载词典后】:" + '/ '.join(jieba.cut(sample_text)))
【加载词典后】:周大福/ 是/ 创新办/ 主任/ 也/ 是/ 云计算/ 方面/ 的/ 专家

3.2 调整字典

使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。

jieba.add_word('石墨烯') #增加自定义词语
jieba.add_word('凱特琳', freq=42, tag='nz') #设置词频和词性 
jieba.del_word('自定义词') #删除自定义词语

使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。

# 调节词频前
print("【调节词频前】:" + '/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))

 

4 关键词提取

jieba 提供了两种关键词提取方法,分别基于 TF-IDF 算法和 TextRank 算法。

4.1 基于TF-IDF

  TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率)是一种统计方法,用以评估一个词语对于一个文件集或一个语料库中的一份文件的重要程度

通过 jieba.analyse.extract_tags 方法可以基于 TF-IDF 算法进行关键词提取,该方法共有 4 个参数:

  • sentence:为待提取的文本
  • topK:为返回几个 TF/IDF 权重最大的关键词,默认值为 20
  • withWeight:是否一并返回关键词权重值,默认值为 False
  • allowPOS:仅包括指定词性的词,默认值为空


4.2 基于TEXT-RANK

 TextRank 是另一种关键词提取算法,基于大名鼎鼎的 PageRank,其原理可参见论文—— TextRank: Bringing Order into Texts

  通过 jieba.analyse.textrank 方法可以使用基于 TextRank 算法的关键词提取,其与 'jieba.analyse.extract_tags' 有一样的参数,但前者默认过滤词性(allowPOS=('ns', 'n', 'vn', 'v'))。

4.3 自定义语料库

关键词提取所使用逆向文件频率(IDF)文本语料库和停止词(Stop Words)文本语料库可以切换成自定义语料库的路径。


5 词性标注


jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。


words = pseg.cut("他改变了中国")

for word, flag in words:
    print("{0} {1}".format(word, flag))
他 r
改变 v
了 ul
中国 ns

 

6 并行分词

将目标文本按行分隔后,把各行文本分配到多个 Python 进程并行分词,然后归并结果,从而获得分词速度的可观提升。用法:

  • jieba.enable_parallel(4):开启并行分词模式,参数为并行进程数
  • jieba.disable_parallel() :关闭并行分词模式

使用 jieba.tokenize 方法可以返回词语在原文的起止位置。

result = jieba.tokenize(u'上海益民食品一厂有限公司')
print("【普通模式】")
for tk in result:
    print("word: {0} \t\t start: {1} \t\t end: {2}".format(tk[0],tk[1],tk[2]))