借鉴于 【jieba 模块文档】

用于自己学习和记录!

jieba 模块是一个用于中文分词的模块

此模块支持三种分词模式

  • 精确模式(试图将句子最精确的切开,适合文本分析)
  • 全模式(把句子在所有可以成词的成语都扫描出来,速度非常快,但是不能解决歧义的问题)
  • 搜索引擎模式(在精确模式的基础上,对长词再次切分,提高召回率)



### 主要功能

1. 分词

需要分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。但是,不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8


jieba.cut()
jieba.lcut()

此方法接受三个参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型

lcut 方法直接返回 list,cut 方法返回一个 可迭代的 generator

用法

import jieba
seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("全模式: " + "/ ".join(seg_list)) # 全模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("精确模式: " + "/ ".join(seg_list)) # 精确模式
seg_list = jieba.cut("他来到了网易杭研大厦") # 默认是精确模式
print("默认模式: " + "/ ".join(seg_list))

结果:

Full Mode: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
Default Mode: 我/ 来到/ 北京/ 清华大学
默认模式: 他/ 来到/ 了/ 网易/ 杭研/ 大厦



###### **jieba.cut_for_search**
###### **jieba.lcut_for_search**

此方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细

cut_for_search返回一个 可迭代的 generator,lcut_for_search返回一个list

用法

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
print(", ".join(seg_list))

结果:

小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造



###### **jieba.Tokenizer(dictionary=DEFAULT_DICT)**

新建自定义分词器,可用于同时使用不同词典。


2. 添加自定义词典

其包含以下功能:

  • 载入字典
  • 调整词典
载入字典

开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。


jieba.load_userdict(file_name)

添加指定文件名的词典,file_name参数 为文件类对象或自定义词典的路径,file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。

词典的格式为:一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。例如:

创新办 3 i
云计算 5
凱特琳 nz
台中



##### 调整词典

add_word(word, freq=None, tag=None)

向词典中添加一个词。freq 和 tag 可以省略,freq 默认为一个计算值


del_word(word)

在词典中删除一个词。


suggest_freq(segment, tune=True)

调节单个词语的词频,使其能(或不能)被分出来。

使用此功能时,HMM 新词发现功能时可能无效。

>>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post/中将/出错/。
>>> jieba.suggest_freq(('中', '将'), True)
494
>>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post/中/将/出错/。
>>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
「/台/中/」/正确/应该/不会/被/切开
>>> jieba.suggest_freq('台中', True)
69
>>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
「/台中/」/正确/应该/不会/被/切开



#### 3. 关键词提取

基于 TF-IDF 算法的关键词抽取
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())

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


jieba.analyse.TFIDF(idf_path=None)

新建 TFIDF 实例,idf_path 为 IDF 频率文件


jieba.analyse.set_idf_path(file_name)

关键词提取所使用逆向文件频率(即IDF)文本语料库可以切换成自定义语料库的路径,file_name 为自定义语料库的路径。


jieba.analyse.set_stop_words(file_name)

关键词提取所使用停止词(即Stop Words)文本语料库可以切换成自定义语料库的路径,file_name 为自定义语料库的路径。

用法

# 可以先构建一个TFIDF实例,再修改实例中的内容,提取关键字
>>> import jieba.analyse
>>> tfidf = jieba.analyse.TFIDF()
>>> tfidf.set_stop_words(file_name) # file_name未填写
>>> tfidf.set_idf_path(file_name) # file_name未填写
>>> tfidf.extract_tags(sentence) # 设定完毕即可开始提取关键字 # 也可以直接调用函数修改,看了源码,其模块的构造文件里面包含对TFIDF实例的调用
>>> import jieba.analyse
>>> jieba.set_stop_words(file_name) # 可以直接这样填写
>>> jieba.analyse.set_idf_path(file_name)
>>> jieba.analyse.extract_tags(sentence)



##### 基于 TextRank 算法的关键词抽取

jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))

接口与上面相同,但此处的默认词性需要注意


jieba.analyse.TextRank()

新建自定义 TextRank 实例

用法

>>> import jieba.analyse
>>> s = "此外,公司拟对全资子公司吉林欧亚置业有限公司增资4.3亿元,增资后,吉林欧亚置业注册资本由7000万元增加到5亿元。吉林欧亚置业主要经营范围为房地产开发及百货零售等业务。目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。"
>>> for t, w in jieba.analyse.textrank(s, withWeight=True):
print('%s, %s'% (t, w)) # 或者这样写
>>> import jieba.analyse
>>> s = "此外,公司拟对全资子公司吉林欧亚置业有限公司增资4.3亿元,增资后,吉林欧亚置业注册资本由7000万元增加到5亿元。吉林欧亚置业主要经营范围为房地产开发及百货零售等业务。目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。"
>>> tr = jieba.analyse.TextRank()
>>> for t, w in tr.textrank(s, withWeight=True):
print('%s, %s'% (t, w))

结果

# 两个结果一致,都为如下
吉林, 1.0
欧亚, 0.9966893354178172
置业, 0.6434360313092776
实现, 0.5898606692859626
收入, 0.43677859947991454
增资, 0.4099900531283276
子公司, 0.35678295947672795
城市, 0.34971383667403655
商业, 0.34817220716026936
业务, 0.3092230992619838
在建, 0.3077929164033088
营业, 0.3035777049319588
全资, 0.303540981053475
综合体, 0.29580869172394825
注册资本, 0.29000519464085045
有限公司, 0.2807830798576574
零售, 0.27883620861218145
百货, 0.2781657628445476
开发, 0.2693488779295851
经营范围, 0.2642762173558316



#### 4. 词性标注

jieba.posseg.POSTokenizer(tokenizer=None)

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

用法

>>> import jieba.posseg
>>> words = jieba.posseg.cut("我爱北京天安门")
>>> for word, flag in words:
print('%s, %s' % (word, flag)) # 或者这样写
>>> import jieba.posseg
>>> pt = jieba.posseg.POSTokenizer()
>>> words = pt.cut("我爱北京天安门")
>>> for word, flag in words:
print('%s, %s' % (word, flag))

结果

# 两种结果一致
我, r
爱, v
北京, ns
天安门, ns



#### 5. Tokenize:返回词语在原文的起止位置

jieba.tokenize()

此方法输入的参数只接受 unicode 。

用法

import jieba
# 默认模式
result = jieba.tokenize(u'永和服装饰品有限公司')
for tk in result:
print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
# 搜索模式
result = jieba.tokenize(u'永和服装饰品有限公司', mode='search')
for tk in result:
print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))

结果

# 默认模式
word 永和 start: 0 end:2
word 服装 start: 2 end:4
word 饰品 start: 4 end:6
word 有限公司 start: 6 end:10 # 搜索模式
word 永和 start: 0 end:2
word 服装 start: 2 end:4
word 饰品 start: 4 end:6
word 有限 start: 6 end:8
word 公司 start: 8 end:10
word 有限公司 start: 6 end:10
05-12 13:49