一、实验内容
使用结巴分词工具进行分词、关键词提取与词性标注。
二、实验步骤
1.安装结巴分词
# from _future_ import unicode_literals # 将模块中显式出现的所有字符串转为unicode类型 # 从python2.6以后就用不过到了,已经内置到python内置了 import sys sys.path.append("../") import jieba import jieba.posseg import jieba.analyse
2. 读入文本文件中的内容,利用结巴分词的三种分词模式进行分词
报错:AttributeError: ‘NoneType’ object has no attribute ‘decode’
原因:提示有一个变量的值是None,None 的类型是NoneType , 它没有decode 方法。
解决:把txt[0]转为str形式
list1 = jieba.load_userdict("D:\Desktop\\1.txt") print(list1)
None
txt = open("D:\Desktop\\1.txt",'r',encoding='utf-8').readlines() list0 = txt[0] print(list0) list1 = str(txt[0]) list1
阳光包裹着奔跑,被予以光辉灿烂的自由。满堂花醉三千客,一剑霜寒十四州。阳光包裹着奔跑,被予以光辉灿烂的自由。请保持这一份热爱,奔赴下一场山海。 '阳光包裹着奔跑,被予以光辉灿烂的自由。满堂花醉三千客,一剑霜寒十四州。阳光包裹着奔跑,被予以光辉灿烂的自由。请保持这一份热爱,奔赴下一场山海。'
之后就可以跑通了。
① 精确模式
试图将句子最精确地切开,适合文本分析;
cut_all参数默认为False,所有使用cut方法时默认为精确模式
#精确模式 seg_list = jieba.cut(list1,cut_all=False) seg_list print ("Default Mode:", "/ ".join(seg_list)) #精确模式
Default Mode: 阳光/ 包裹/ 着/ 奔跑/ ,/ 被/ 予以/ 光辉灿烂/ 的/ 自由
② 全模式
把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;
#全模式 seg_list = jieba.cut(list1,cut_all=True) print ("Full Mode:", "/ ".join(seg_list))
Full Mode: 阳光/ 包裹/ 着/ 奔跑/ ,/ 被/ 予以/ 光辉/ 光辉灿烂/ 灿烂/ 的/ 自由
③ 搜索引擎模式
在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
#搜索引擎模式 seg_list = jieba.cut_for_search(list1) print ("Search Mode:", ", ".join(seg_list))
Search Mode: 阳光, 包裹, 着, 奔跑, ,, 被, 予以, 光辉, 灿烂, 光辉灿烂, 的, 自由
3. 对上述文件中的词语进行词性标注
#词性标注 words = jieba.posseg.cut(list1) for word, flag in words: print('%s %s' % (word, flag))
阳光 nr 包裹 v 着 uz 奔跑 v , x 被 p 予以 v 光辉灿烂 i 的 uj 自由 a 。 x 满堂 nr 花醉 nr 三千 m 客 n , x 一剑 n 霜寒 n 十四 m 州 n 。 x 阳光 nr 包裹 v 着 uz 奔跑 v , x 被 p 予以 v 光辉灿烂 i 的 uj 自由 a 。 x
4. 设置停用词表去掉前三的高频词,再次统计
# 统计上述文件中的前十个高频词汇 words = jieba.lcut(txt[0]) print("words:",words) counts = {} for word in words: if len(word) == 1: # 将标点符号不列入词频统计 continue else: counts[word] = counts.get(word,0) + 1 print("count:",counts) result=[] result=sorted(counts.items(),key=lambda x:x[1],reverse=True) print("result:",result) print("top10 result:",result[:10])
words: ['阳光', '包裹', '着', '奔跑', ',', '被', '予以', '光辉灿烂', '的', '自由', '。', '满堂', '花醉', '三千', '客', ',', '一剑', '霜寒', '十四', '州', '。', '阳光', '包裹', '着', '奔跑', ',', '被', '予以', '光辉灿烂', '的', '自由', '。'] count: {'阳光': 2, '包裹': 2, '奔跑': 2, '予以': 2, '光辉灿烂': 2, '自由': 2, '满堂': 1, '花醉': 1, '三千': 1, '一剑': 1, '霜寒': 1, '十四': 1} result: [('阳光', 2), ('包裹', 2), ('奔跑', 2), ('予以', 2), ('光辉灿烂', 2), ('自由', 2), ('满堂', 1), ('花醉', 1), ('三千', 1), ('一剑', 1), ('霜寒', 1), ('十四', 1)] top10 result: [('阳光', 2), ('包裹', 2), ('奔跑', 2), ('予以', 2), ('光辉灿烂', 2), ('自由', 2), ('满堂', 1), ('花醉', 1), ('三千', 1), ('一剑', 1)]
# 方法二 tags = jieba.analyse.extract_tags(txt[0], topK=10) print(",".join(tags))
Building prefix dict from the default dictionary ... Loading model from cache C:\Users\15488\AppData\Local\Temp\jieba.cache Loading model cost 0.754 seconds. Prefix dict has been built successfully. 光辉灿烂,奔跑,包裹,予以,阳光,霜寒,花醉,自由,满堂,下一场
# 通过设置停用词表去掉前三的高频词,再次进行统计 jieba.analyse.set_stop_words("D:\Desktop\stopwords.txt")#加载停用词词表 tags = jieba.analyse.extract_tags(txt[0], topK=10) print(",".join(tags))
光辉灿烂,予以,霜寒,花醉,自由,满堂,下一场,一剑,山海,奔赴
可以看到,“奔跑”,“包裹”,“阳光”三个词不见了
5. 对上述文件中的关键词进行提取,提取个数为15个。
# 对上述文件中的关键词进行提取,提取个数为15个 tags = jieba.analyse.extract_tags(txt[0], topK=15) print(",".join(tags))
光辉灿烂,予以,霜寒,花醉,自由,满堂,下一场,一剑,山海,奔赴,热爱,三千,十四,一份,保持
6. 自定义词典
将文本:卓拉格奥尔吉,格里沙格里高里,热尼亚叶甫根尼
在精确模式下分词为:卓拉/格奥尔吉,格里沙/格里高里,热尼亚/叶甫根尼。
#精确模式 seg_list = jieba.cut(list1,cut_all=False) seg_list print ("Default Mode:", "/ ".join(seg_list)) #精确模式
# 自定义词典 test_text = "卓拉格奥尔吉,格里沙格里高里,热尼亚叶甫根尼" test_text1 = jieba.cut(test_text,cut_all=False) print ("Default Mode:", "/ ".join(test_text1)) #精确模式 # 卓拉/格奥尔吉,格里沙/格里高里,热尼亚/叶甫根尼 jieba.load_userdict("D:\Desktop\jiebaDict.txt") test_text2 = jieba.cut(test_text,cut_all=False) print ("Self Mode:", "/ ".join(test_text2))
Default Mode: 卓拉/ 格奥尔/ 吉/ ,/ 格里沙/ 格里/ 高里/ ,/ 热尼亚/ 叶甫/ 根尼 Self Mode: 卓拉/ 格奥尔吉/ ,/ 格里沙/ 格里高里/ ,/ 热尼亚/ 叶甫根尼
#关键词提取 s = ''' 此外,公司拟对全资子公司吉林欧亚置业有限公司增资4.3亿元,增资后,吉林欧亚置业注册 资本由7000万元增加到5亿元。吉林欧亚置业主要经营范围为房地产开发及百货零售等业务。 目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。 ''' for x, w in jieba.analyse.extract_tags(s, topK=10, withWeight=False): print('%s %s' % (x, w)) # 第一个参数:待提取关键词的文本 # 第二个参数:返回关键词的数量,重要性从高到低排序 # 第三个参数:是否同时返回每个关键词的权重 # 第四个参数:词性过滤,为空表示不过滤,若提供则仅返回符合词性要求的关键词
欧 亚 吉 林 置 业 万 元 增 资 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-54-c9207878d691> in <module> 5 目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。 ''' 6 ----> 7 for x, w in jieba.analyse.extract_tags(s, topK=10, withWeight=False): 8 print('%s %s' % (x, w)) 9 ValueError: too many values to unpack (expected 2)
#关键词提取 s = ''' 此外,公司拟对全资子公司吉林欧亚置业有限公司增资4.3亿元,增资后,吉林欧亚置业注册 资本由7000万元增加到5亿元。吉林欧亚置业主要经营范围为房地产开发及百货零售等业务。 目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。 ''' for x, w in jieba.analyse.extract_tags(s, topK=20, withWeight=True): print('%s %s' % (x, w)) # 第一个参数:待提取关键词的文本 # 第二个参数:返回关键词的数量,重要性从高到低排序 # 第三个参数:是否同时返回每个关键词的权重 # 第四个参数:词性过滤,为空表示不过滤,若提供则仅返回符合词性要求的关键词
欧亚 0.7148056394033334 吉林 0.6453082221991667 置业 0.478531921956875 万元 0.33220407634875 增资 0.3288276861054167 4.3 0.24905765631041665 7000 0.24905765631041665 2013 0.24905765631041665 139.13 0.24905765631041665 实现 0.19486376152458332 综合体 0.19074469840854166 经营范围 0.18985803977479165 亿元 0.18745378397625 在建 0.17176428835750002 全资 0.16822244884583334 百货 0.163858254571875 注册 0.15190267518354167 零售 0.14443267604520835 子公司 0.14291960962 营业 0.13630174790083333
#textrank for x, w in jieba.analyse.textrank(s, withWeight=True): print('%s %s' % (x, w)) # 第一个参数:待提取关键词的文本 # 第二个参数:返回关键词的数量,重要性从高到低排序 # 第三个参数:是否同时返回每个关键词的权重 # 第四个参数:词性过滤,为空表示过滤所有,与TF—IDF不一样!
欧亚 1.0 吉林 0.9364641330019609 置业 0.6432179048068093 实现 0.585402153793541 收入 0.43240063293299474 增资 0.4058272733028047 子公司 0.35273363353936127 城市 0.3492725633507077 商业 0.3476243659188807 在建 0.3200580083086885 零售 0.30288826958119686 百货 0.3021737387349968 全资 0.2993380759226258 营业 0.29926807751968304 注册 0.29865040909098856 综合体 0.292992290385712 开发 0.28202080738141794 业务 0.2793133445548325 有限公司 0.27682069669610626 经营范围 0.2651294160502385
#加载停用词词表 jieba.analyse.set_stop_words('stopwords.txt') for x, w in jieba.analyse.textrank(s, withWeight=True): print('%s %s' % (x, w)) # 创建停用词list def stopwordslist(filepath): stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()] return stopwords
欧亚 1.0 吉林 0.9364641330019609 置业 0.6432179048068093 实现 0.585402153793541 收入 0.43240063293299474 增资 0.4058272733028047 子公司 0.35273363353936127 城市 0.3492725633507077 商业 0.3476243659188807 在建 0.3200580083086885 零售 0.30288826958119686 百货 0.3021737387349968 全资 0.2993380759226258 营业 0.29926807751968304 注册 0.29865040909098856 综合体 0.292992290385712 开发 0.28202080738141794 业务 0.2793133445548325 有限公司 0.27682069669610626 经营范围 0.2651294160502385
其他:实验四:结巴分词
实验内容
本实验旨在使用结巴分词库对文本进行分词,并进行一系列文本处理操作,包括词性标注、停用词过滤、关键词提取以及自定义词典的应用。
实验步骤
步骤一:安装结巴分词
首先,你需要安装结巴分词库。你可以使用pip进行安装:
pip install jieba
步骤二:读入文本文件
在Python中,你可以使用open
函数读入文本文件的内容,然后对文本进行处理。以下是一个示例:
with open('your_text_file.txt', 'r', encoding='utf-8') as file: text = file.read()
步骤三:分词操作
结巴分词库提供了三种分词模式:精确模式、全模式和搜索引擎模式。你可以按如下方式使用它们:
import jieba # 精确模式 seg_exact = jieba.cut(text, cut_all=False) # 全模式 seg_full = jieba.cut(text, cut_all=True) # 搜索引擎模式 seg_search = jieba.cut_for_search(text)
步骤四:词性标注
你可以使用结巴分词库的词性标注功能来标注每个词的词性。以下是示例代码:
import jieba.posseg as pseg words = pseg.cut(text) for word, flag in words: print(f'{word}\t{flag}')
步骤五:停用词过滤与高频词统计
可以创建一个停用词表,将文本中的高频词(通常是虚词、无实际语义的词)去掉,以提高文本的质量。你可以使用Python的collections
库来进行高频词统计。
步骤六:关键词提取
使用结巴分词库的jieba.analyse
模块,可以轻松提取文本中的关键词。以下是示例代码:
from jieba import analyse # 提取15个关键词 keywords = analyse.extract_tags(text, topK=15) print(keywords)
步骤七:自定义词典
结巴分词库支持自定义词典,你可以添加自己的专业词汇或特定领域的词语,以提高分词准确性。自定义词典的格式为每行一个词语。
jieba.load_userdict('your_custom_dict.txt')
请根据实际需要进行适当的修改和扩展,这些步骤将帮助你利用结巴分词库进行文本处理和分析。