一、分词
1、jieba.cut 和jieba.lcut
jieba.cut 和jieba.lcut接收三个参数:
1)、需要分词的字符串
2)、cut_all:是否采用全模式(默认为False)
3)、HMM:是否采用HMM模型(默认为True)
在使用jieba库的功能之前我们首先先引入一下jieba库,并准备好分词用的字符串:
import jieba
import jieba.posseg as pseg
import jieba.analyse as anls
# 设置测试用的字符串
sentence = "我是xiaogenggou,专业是信息管理与信息系统"
首先我们分别使用jieba.cut和jieba.lcut对待处理字符串进行全模式分词:
# 借助jieba.cut进行全模式分词
seg_list_1 = jieba.cut(sentence, cut_all=True)
# 打印分词结果
print("[jieba.cut]:" + "/".join(seg_list_1))
# 借助jieba.lcut进行全模式分词
seg_list_2 = jieba.lcut(sentence, cut_all=True)
# 打印分词结果
print("[jieba.lcut]:"+str(seg_list_2))
得出结果:
[jieba.cut]:我/是/xiaogenggou/,/专业/是/信息/信息管理/管理/与/信息/信息系统/系统
[jieba.lcut]:['我', '是', 'xiaogenggou', ',', '专业', '是', '信息', '信息管理', '管理', '与', '信息', '信息系统', '系统']
可以看出jieba.cut需要借助"分隔符".jion()的语法才能打印,分词时以分割符为分割的标志。
而jieba.lcut可以直接打印(这里是为了和之前的字符同时打印才转换成字符串类型),以’为分割符。
如果我们打印jieba.cut和jieba.lcut的类型并直接打印jieba.cut:
# 打印jieba.cut的类型
print(type(seg_list_1))
# 打印jieba.lcut的类型
print(type(seg_list_2))
# 直接打印jieba.cut
print(seg_list_1)
我们可以看到:
结果得到了一个可迭代的generato类
我们用for循环对其迭代:
# 循环迭代打印jieba.cut
for i in seg_list_1:
print(i)
结果如下:
我
是
xiaogenggou
,
专业
是
信息
信息管理
管理
与
信息
信息系统
系统
无论是对于jieba.cut还是对于jieba.lcut的全模式(cut_all=True)我们都可以看出对于信息管理与信息系统这个名词,jieba尝试了相邻词组成词语的所有组合(虽然没有"信息管理与信息系统"整合起来的)。这样虽然全面,但给可读性却带来一些困扰,因此我们可以尝试精确模式(cut_all=False)来使信息管理与信息系统只被分成jieba库认为概率最高的组合。我们依然同时使用jieba.cut和jieba.lcut
代码如下:
# 借助jieba.cut进行精准模式分词
seg_list_3 = jieba.cut(sentence, cut_all=False)
# 打印分词结果
print("[jieba.cut]:" + "/".join(seg_list_3))
# 借助jieba.lcut进行精准模式分词
seg_list_4 = jieba.lcut(sentence, cut_all=False)
# 打印分词结果
print("[jieba.lcut]:"+str(seg_list_4))
结果是:
[jieba.cut]:我/是/xiaogenggou/,/专业/是/信息管理/与/信息系统
[jieba.lcut]:['我', '是', 'xiaogenggou', ',', '专业', '是', '信息管理', '与', '信息系统']
2、jieba.cut_for_search和jieba.lcut_for_search
利用jieba.cut_for_search和jieba.lcut_for_search继续分词被称为搜索引擎模式。
相较于jieba.cut和jieba.lcut而言,jieba.cut_for_search和jieba.lcut_for_search只有两个参数:
1)、需要分词的字符串
2)、HMM:是否采用HMM模型(默认为True)
打印分词结果,类型并直接打印jieba.cut_for_search:
seg_list_5 = jieba.cut_for_search(sentence)
# 打印分词结果
print("jieba.cut_for_search:"+"/".join(seg_list_5))
# 打印类型
print(type(seg_list_5))
# 直接打印jieba.cut_for_search
print(seg_list_5)
# 借助jieba.lcut_for_search进行分词
seg_list_6 = jieba.lcut_for_search(sentence)
# 打印分词结果
print(seg_list_6)
# 打印类型
print(type(seg_list_6))
得到结果:
jieba.cut_for_search:我/是/xiaogenggou/,/专业/是/信息/管理/信息管理/与/信息/系统/信息系统
['我', '是', 'xiaogenggou', ',', '专业', '是', '信息', '管理', '信息管理', '与', '信息', '系统', '信息系统']
可以看出来,就结果而言,搜索引擎模式与全模式差异不大。
二、外加词典
我们可以新建文件作为字典集,字典的格式为:
词语 词频(可省略) 词性(可省略)
在上文的例子中:"信息管理与信息系统"并不能作为一个整体被划分,因此我们可以外加词典,将其加入其中。
新建一个txt文件并将"信息管理与信息系统"写入,词性为n
信息管理与信息系统 n
我们可以借助**jieba.load_userdict(file_name)**函数外加词典,
file_name为文件类对象或自定义词典的路径。
在载入字典后我们将可以将"信息管理与信息系统"划分为一个整体
代码如下:
# 借助jieba.load_userdict(file_name)外加词典
jieba.load_userdict("test.txt")
# 在外加词典后利用精准模式分词
seg_list_7 = jieba.lcut(sentence, cut_all=False)
# 打印分词结果
print(seg_list_7)
结果如下:
['我', '是', 'xiaogenggou', ',', '专业', '是', '信息管理与信息系统']
我们也可以再去查看全模式下"信息管理与信息系统"是否被作为划分标准:
代码如下:
# 在外加字典后利用全模式分词
seg_list_8 = jieba.lcut(sentence, cut_all=True)
# 打印分词结果
print(seg_list_8)
结果如下:
['我', '是', 'xiaogenggou', ',', '专业', '是', '信息', '信息管理', '信息管理与信息系统', '管理', '与', '信息', '信息系统', '系统']
我们也可以通过jieba.add_word和jieba.del_word来对字典进行修改。
jieba.add_word有三个变量:
1)加入字典的字符串
2)字符串的词频(权值的一种表示方式)(默认为None)
3)词性 (默认为None)
首先我们修改测试用的字符串:
# 修改测试字符串
sentence = "我是xiaogenggou,专业是信息管理与信息系统,爱好是挂树"
# 对修改后的字符串进行分词
seg_list_9 = jieba.lcut(sentence)
# 打印修改后的字符串分词结果
print(seg_list_9)
结果为:
['我', '是', 'xiaogenggou', ',', '专业', '是', '信息管理与信息系统', ',', '爱好', '是', '挂', '树']
用jieba.add_word增加字符串:
# 通过jieba.add_word增加自定义词语
jieba.add_word('挂树', freq=50, tag="n")
# 在词典改变后进行分词操作
seg_list_10 = jieba.lcut(sentence)
# 打印分词结果
print(seg_list_10)
结果如下:
['我', '是', 'xiaogenggou', ',', '专业', '是', '信息管理与信息系统', ',', '爱好', '是', '挂树']
现在用jieba.del_word对字典进行删减:
# 利用jieba.del_word删除词典中的"挂树"
jieba.del_word('挂树')
# 在删除'挂树'字符串后进行分词
seg_list_11 = jieba.lcut(sentence)
# 打印分词结果
print(seg_list_11)
结果如下:
['我', '是', 'xiaogenggou', ',', '专业', '是', '信息管理与信息系统', ',', '爱好', '是', '挂', '树']
值得注意的是,使用jieba.add_word和jieba.del_word并不会对原词典文件造成影响。
我们还可以同过jieba.suggest_freq调节词频,控制词语能否被识别
代码如下:
# 更改'我是'的的词频
jieba.suggest_freq(('我是'), True)
# 在词典修改进行分词操作
seg_list_12 = jieba.lcut(sentence, HMM=False)
# 打印分词结果
print(seg_list_12)
# 修改'专'和'业'的的词频
jieba.suggest_freq(('专','业'), True)
# 在词典修改进行分词操作
seg_list_12 = jieba.lcut(sentence, HMM=False)
# 打印分词结果
print(seg_list_12)
结果如下:
['我是', 'xiaogenggou', ',', '专业', '是', '信息管理与信息系统', ',', '爱好', '是', '挂', '树']
['我是', 'xiaogenggou', ',', '专', '业', '是', '信息管理与信息系统', ',', '爱好', '是', '挂', '树']
在使用jieba.suggest_freq分词时建议关闭HMM,否则可能失效,同时建议逐个修改,否则会失效。也不建议对英文单词进行分词。
三、关键词提取
1、jieba.analyse.extract_tags
jieba.analyse.extract_tags是一种权值的统计方法,原理可以理解为一个词在一片文章中出现的次数越多,在别的文章中出现次数越少,则更能代表这篇文章。
jieba.analyse.extract_tags有四个参数:
sentence:需要分词的字符串
topK:为返回几个 TF/IDF 权重最大的关键词(默认值为 20)
withWeight:是否一并返回关键词权重值(默认值为 False)
allowPOS:仅包括指定词性的词(默认值为None)
代码如下:
seg_list_13 = jieba.analyse.extract_tags(sentence,topK=5,withWeight=True)
# 打印提取关键词结果
print(seg_list_13)
# 利用for循环打印关键词及其权值
for i in seg_list_13:
print(i[0],i[1])
结果如下:
[('我是', 2.988691875725), ('xiaogenggou', 2.988691875725), ('信息管理与信息系统', 2.988691875725), ('爱好', 2.10190405216)]
我是 2.988691875725
xiaogenggou 2.988691875725
信息管理与信息系统 2.988691875725
爱好 2.10190405216
2、jieba.analyse.textrank
与jieba.analyse.extract_tags有相同的参数但jieba.analyse.textrank 的默认词性为allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’)。
jieba.analyse.textrank的代码如下:
# 利用jieba.analyse.textrank获取关键词和权值
seg_list_14 = jieba.analyse.textrank(sentence, withWeight=True)
# 打印提取关键词结果
print(seg_list_14)
# 利用for循环打印关键词即其权值
for i in seg_list_14:
print(i[0],i[1])
结果如下:
[('信息管理与信息系统', 1.0), ('专业', 0.9961264494011037)]
信息管理与信息系统 1.0
专业 0.9961264494011037
3、自定义语料库
可以借助jieba.analyse.set_stop_words(path)将停止停止词文本语料库改为自己自定义语料库的路径。
借助jieba.analyse.set_idf_path(path)将逆向文件频率文本语料库转化为自己自定义语料库的路径。
参数均为转化的路径
四、词性及起始位置
1、词性
打印词性时我们要借助jieba.posseg库。
代码如下:
# 借助jieba.posseg进行分词操作(已import jieba.posseg as pseg)
seg_list_15 = pseg.cut(sentence)
# 利用for循环打印分词结果
for w, f in seg_list_15:
print(w, f)
结果如下:
我是 x
xiaogenggou eng
x
, x
专业 n
是 v
信息管理与信息系统 n
, x
爱好 a
是 v
挂 v
树 v
2、起始位置
我们可以借助jieba.tokenize函数实现显示分词词语的起始位置。输入参数只接受 unicode
代码如下:
# 借助jieba.tokenize进行分词操作
seg_list_16 = jieba.tokenize(sentence)
# 利用for循环打印分词结果
for w, s, e in seg_list_16:
print(w, s, e)
结果如下:
我是 0 2
xiaogenggou 2 13
13 14
, 14 15
专 15 16
业 16 17
是 17 18
信息管理与信息系统 18 27
, 27 28
爱好 28 30
是 30 31
挂 31 32
树 32 33
3、同时获取词性和起始位置
自行编写函数,代码如下:
import jieba.posseg as pseg
import jieba
def jieba_mix(sentence):
"""
:param sentence: 待处理的字符串
:return: 每个分词的词语,词性,起始位置组成的字典的集合
"""
# 对待处理字符串进行jieba.posseg.cut分词处理
flag = pseg.cut(sentence)
# 初始化存储用的列表
ls = []
# 利用for循环遍历分词结果,w表示词语,f表示词性
for w, f in flag:
# 设置字典,将词语的key值设为word,词性的key值设为Part of speech
d = {"word": w, "Part of speech": f}
# 将字典加入列表
ls.append(d)
# 利用jieba.tokenize对待处理字符串进行分词处理
position = jieba.tokenize(sentence)
# 设置循环时用的位置标识符
i = 0
# 借助for循环遍历分词结果,w表示词语,s表示开始位置,e表示结束位置
for w, s, e in position:
# 扩充字典,将开始位置的key值设为start
ls[i]["start"] = s
# 扩充字典,将结束位置的key值设为end
ls[i]["end"] = e
# 更新位置标识符
i += 1
return ls
jieba.load_userdict('test.txt')
sentence = "我是xiaogenggou ,专业是信息管理与信息系统,爱好是挂树"
print(jieba_mix(sentence))
结果如下:
[{'word': '我', 'Part of speech': 'r', 'start': 0, 'end': 1}, {'word': '是', 'Part of speech': 'v', 'start': 1, 'end': 2}, {'word': 'xiaogenggou', 'Part of speech': 'eng', 'start': 2, 'end': 13}, {'word': ' ', 'Part of speech': 'x', 'start': 13, 'end': 14}, {'word': ',', 'Part of speech': 'x', 'start': 14, 'end': 15}, {'word': '专业', 'Part of speech': 'n', 'start': 15, 'end': 17}, {'word': '是', 'Part of speech': 'v', 'start': 17, 'end': 18}, {'word': '信息管理与信息系统', 'Part of speech': 'n', 'start': 18, 'end': 27}, {'word': ',', 'Part of speech': 'x', 'start': 27, 'end': 28}, {'word': '爱好', 'Part of speech': 'a', 'start': 28, 'end': 30}, {'word': '是', 'Part of speech': 'v', 'start': 30, 'end': 31}, {'word': '挂树', 'Part of speech': 'n', 'start': 31, 'end': 33}]
借助for循环打印结果:
a = jieba_mix(sentence)
for i in range(len(a)):
print(a[i])
结果如下:
{'word': '我', 'Part of speech': 'r', 'start': 0, 'end': 1}
{'word': '是', 'Part of speech': 'v', 'start': 1, 'end': 2}
{'word': 'xiaogenggou', 'Part of speech': 'eng', 'start': 2, 'end': 13}
{'word': ' ', 'Part of speech': 'x', 'start': 13, 'end': 14}
{'word': ',', 'Part of speech': 'x', 'start': 14, 'end': 15}
{'word': '专业', 'Part of speech': 'n', 'start': 15, 'end': 17}
{'word': '是', 'Part of speech': 'v', 'start': 17, 'end': 18}
{'word': '信息管理与信息系统', 'Part of speech': 'n', 'start': 18, 'end': 27}
{'word': ',', 'Part of speech': 'x', 'start': 27, 'end': 28}
{'word': '爱好', 'Part of speech': 'a', 'start': 28, 'end': 30}
{'word': '是', 'Part of speech': 'v', 'start': 30, 'end': 31}
{'word': '挂树', 'Part of speech': 'n', 'start': 31, 'end': 33}
网友评论