美文网首页@IT·互联网技术研发汇集
基于python的语义分析系统 python语义分析库

基于python的语义分析系统 python语义分析库

作者: 知信学源 | 来源:发表于2024-02-23 21:26 被阅读0次

一、分词

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}

相关文章

网友评论

    本文标题:基于python的语义分析系统 python语义分析库

    本文链接:https://www.haomeiwen.com/subject/efowadtx.html