⽂本挖掘(⼀)pythonjieba+wordcloud使⽤笔记+词云分析应⽤
系列介绍:⽂本挖掘⽐较常见,系列思路:1-基本情况介绍(分词,词云展⽰);2-根据语料库的tf-idf值及创建⾃⼰的idf⽂件;3-基于snownlp语料情感分析;4-基于gensim
进⾏lda主题挖掘分析;
本⽂简介:对于⼤量的短⽂本需要进⾏分析的话,会使⽤到分词及可视化展⽰,中⽂分词没有明显的边界⾃⾏处理还不太⽅便。“结巴”中⽂分词是⼀个优秀的 Python 中⽂分
词库,wordcloud是⼀个词云图库,对他进⾏学习,可以快速进⾏基础的⽂本分析。
⽬的:介绍jieba库(v0.41)的基本使⽤,并结合分词结果进⾏词云展⽰
读者:应⽤⽤户。
参考链接:
jieba官⽅介绍:
[python] 使⽤scikit-learn⼯具计算⽂本TF-IDF值:
Jieba分词词性标注以及词性说明:
主要内容:
1、jieba库基本使⽤
python官方文档中文版1.1、分词
1.2、添加⾃定义词典
1.3、词性标注
1.4、基于TF-IDF算法的关键字抽取
2、jieba+wordcloud简单分析
1、jieba库基本使⽤
import jieba # 分词库
import jieba.posseg as pseg # 词性标注
import jieba.analyse as analyse # 关键字提取
1.1、分词
jieba库分词有三种模型,⼀般来说,使⽤默认模式即可。
content = "韩国东⼤门单鞋⼥⽅头绒⾯⼀脚蹬韩版休闲2020春季新款平底⽑⽑鞋"
seg_list = jieba.cut(content, cut_all=True)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式
seg_list = jieba.cut(content, cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 默认模式
seg_list = jieba.cut_for_search("韩国东⼤门单鞋⼥⽅头绒⾯⼀脚蹬韩版休闲2020春季新款平底⽑⽑鞋") # 搜索引擎模式
print("Search Mode: " + "/ ".join(seg_list))
输出:
Full Mode: 韩国/ 东⼤/ 东⼤门/ ⼤门/ 单鞋/ ⼥⽅/ ⽅头/ 绒⾯/ ⼀脚/ 脚蹬/ 韩/ 版/ 休闲/ 2020/ 春季/ 新款/ 平底/ ⽑⽑/ 鞋
Default Mode: 韩国/ 东⼤门/ 单鞋/ ⼥⽅/ 头/ 绒⾯/ ⼀/ 脚蹬/ 韩版/ 休闲/ 2020/ 春季/ 新款/ 平底/ ⽑⽑/ 鞋
Search Mode: 韩国/ 东⼤/ ⼤门/ 东⼤门/ 单鞋/ ⼥⽅/ 头/ 绒⾯/ ⼀/ 脚蹬/ 韩版/ 休闲/ 2020/ 春季/ 新款/ 平底/ ⽑⽑/ 鞋
1.2、添加⾃定义词典
以"Default Mode"输出为例,⽑⽑鞋被拆分成了⽑⽑和鞋两个部分,原因是P(⽑⽑鞋) < P(⽑⽑)×P(鞋),“⽑⽑鞋”词频不够导致其成词概率较低。
有两个⽅法可以添加⾃定义词典,添加⾃定义字典并不会替换⾃带的词典,会追加上去。其他⾃定义也是。
⼀个是载⼊词典:
jieba.load_userdict(file_name) # file_name 为⽂件类对象或⾃定义词典的路径
词典格式和 (jiaba包⽂件夹下)⼀样,⼀个词占⼀⾏;每⼀⾏分三部分:词语、词频(可省略)、词性(可省略),⽤空格隔开,顺序不可颠倒。file_name 若为路径或⼆进制⽅式打开的⽂件,则⽂件必须为 UTF-8 编码。另⼀个是动态调整:
使⽤ add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。
使⽤ suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
注意:⾃动计算的词频在使⽤ HMM 新词发现功能时可能⽆效。
删除该词 jieba.del_word('今天天⽓')
现在采⽤动态调整词典后,⽑⽑鞋能正确识别。
jieba.add_word('⽑⽑鞋', freq=None, tag=None)
seg_list = jieba.cut(content, cut_all=False)
print("Update Default Mode: " + "/ ".join(seg_list)) # 默认模式
Update Default Mode: 韩国/ 东⼤门/ 单鞋/ ⼥⽅/ 头/ 绒⾯/ ⼀/ 脚蹬/ 韩版/ 休闲/ 2020/ 春季/ 新款/ 平底/
⽑⽑鞋
1.3、词性标注
在⽼版本中,词性标注采⽤的字典会与jieba.cut不⼀致,新版本已修复。
# 词性标注
words = pseg.cut(content)
print("词性标注: " + "/ ".join([word + '-' + flag for word, flag in words]))
词性标注: 韩国-ns/ 东⼤门-x/ 单鞋-n/ ⼥⽅-n/ 头-n/ 绒⾯-n/ ⼀-m/ 脚蹬-n/ 韩版-nt/ 休闲-v/ 2020-m/ 春季-t/ 新款-n/ 平底-t/ ⽑⽑鞋-x
1.4、基于TF-IDF算法的关键字抽取
简单的词频统计并不能很好的反映词的重要性,tf-idf是⼀个识别关键字的算法。⼤概思路如下:
⼀个容易想到的思路,就是到出现次数最多的词。如果某个词很重要,它应该在这篇⽂章中多次出现。于是,我们进⾏"词频"(Term Frequency,缩写为TF)统计。
结果你肯定猜到了,出现次数最多的词是----"的"、"是"、"在"----这⼀类最常⽤的词。它们叫做"停⽤词"(stop words),表⽰对到结果毫⽆帮助、必须过滤掉的词。
假设我们把它们都过滤掉了,只考虑剩下的有实际意义的词。这样⼜会遇到了另⼀个问题,我们可能发现"zg"、"蜜蜂"、"养殖"这三个词的出现次数⼀样多。这是不是意味着,
作为关键词,它们的重要性是⼀样的?显然不是这样。因为"zg"是很常见的词,相对⽽⾔,"蜜蜂"和"养殖"不那么常见。如果这三个词在⼀篇⽂章的出现次数⼀样多,有理由
认为,"蜜蜂"和"养殖"的重要程度要⼤于"zg",也就是说,在关键词排序上⾯,"蜜蜂"和"养殖"应该排在"zg"的前⾯。所以,我们需要⼀个重要性调整系数,衡量⼀个词是
不是常见词。如果某个词⽐较少见,但是它在这篇⽂章中多次出现,那么它很可能就反映了这篇⽂章的特性,正是我们所需要的关键词。
⽤统计学语⾔表达,就是在词频的基础上,要对每个词分配⼀个"重要性"权重。最常见的词("的"、"是"、"在")给予最⼩的权重,较常见的词("zg")给予较⼩的权重,较少
见的词("蜜蜂"、"养殖")给予较⼤的权重。这个权重叫做"逆⽂档频率"(Inverse Document Frequency,缩写为IDF),它的⼤⼩与⼀个词的常见程度成反⽐。
知道了"词频"(TF)和"逆⽂档频率"(IDF)以后,将这两个值相乘,就得到了⼀个词的TF-IDF值。某个词对⽂章的重要性越⾼,它的TF-IDF值就越⼤。所以,排在最前⾯的⼏个词,
就是这篇⽂章的关键词。
介绍完基本的思路以后,这⾥我们发现有两个⽂件,⼀个是停⽤词,⼀个是idf值。jieba库默认有⼀些基本的停⽤词及idf⽂件(jieba\)。
# jieba\analyse\tfidf.py
STOP_WORDS = set((
"the", "of", "is", "and", "to", "in", "that", "we", "for", "an", "are",
"by", "be", "as", "on", "with", "can", "if", "from", "which", "you", "it",
"this", "then", "at", "have", "all", "not", "one", "has", "or", "that",
))
那么jieba计算tf-idf的值的过程,⼤致为,讲输⼊的⽂档进⾏分词并计算tf值,通过已经⽣成好的idf⽂件获取相应单词的idf值,如果没有,使⽤中位数值。
如⾃定义词典,停⽤词和idf⽂档也可以⾃定义。
jieba.analyse.set_idf_path(file_name) # file_name为⾃定义语料库的路径
jieba.analyse.set_stop_words(file_name) # file_name为⾃定义语料库的路径
最后的使⽤:
# topK:输⼊前topK个关键字,为None则输出全部
# withWeight:是否返回权重
# allowPOS:只计算哪类词性,'n','v','ns'
# withFlag:是否返回词性标注
tfidf_fre =act_tags(content, topK=20, withWeight=True, allowPOS=(),withFlag=True)
df = pd.DataFrame(data=tfidf_fre,columns=['单词','tf-idf'])
print(tfidf_fre)
关键字提取: [('单鞋', 1.0159638824153847), ('东⼤门', 0.9195975002230768), ('韩版', 0.9195975002230768), ('2020', 0.9195975002230768), ('⽑⽑鞋', 0.9195975002230768), ('绒⾯', 0.8781362309384615), ('平底', 0.8157569835384616), ( 2、jieba+wordcloud简单分析
最后做⼀个简单的应⽤分析。数据使⽤“2019年新年贺词.txt"。⽂档如下。
# 数据读取
with open('2019新年贺词.txt','r') as f :
text = f.read()
# 统计词频函数
def jieba_count_tf(words,is_filter_stop_words = True):
stop_words = []
if is_filter_stop_words:
# 获取Jieba库载⼊的停⽤词库
stop_words = analyse.default_tfidf.stop_words
freq = {}
for w in words:
if len(w.strip()) < 2 or w.lower() in stop_words:
continue
freq[w] = (w, 0.0) + 1.0
# 总词汇数量
total = sum(freq.values())
return freq
words = jieba.cut(text, cut_all=False)
tfs = jieba_count_tf(words,is_filter_stop_words = False)
# 形成表格数据
df = pd.DataFrame(data=list(zip(list(tfs.keys()),list(tfs.values()))),columns=['单词','频数'])
df
# 关键字分析
tfidf_fre =act_tags(text, topK=100, withWeight=True, allowPOS=(),withFlag=True)
# 形成表格数据
df = pd.DataFrame(data=tfidf_fre,columns=['单词','tf-idf'])
# ⽣成词云图展⽰
alice_mask = np.array(Image.open('test.png')) # 使⽤图⽚作为背景
font_path='C:\Windows\f'# 设置⽂本路径
# 创建图云对象
wc = WordCloud(font_path=font_path, background_color='white',mask = alice_mask,width=400, height=200,stopwords = None)
wc.fit_words(dict(zip(df['单词'], df['tf-idf']))) # 输⼊词频字典,或者 {词:tf-idf}
wc_img = wc.to_image() # 输出为图⽚对象
<_file("alice.png")
结论,从初步的新年贺词的展⽰来看,贺词中主要关注点为tuop,预⽰着对tuop攻坚战的祝福和肯定。
同时,从词汇的展⽰中,⼀些如同“我们”,“他们”,“⼤家”的⼀些停⽤词没有去掉,可以参考1.3添加停⽤词典,或在词云对象中添加停⽤词列表。更新后如下:
更新以后,关键字更加明显。“ggkf”、“发展”等词汇要凸显了出来。祝祖国繁荣昌盛。
总结:
1、需要拥有⼀个好的词典,不同场景应使⽤不同词典。
2、⼀个好的停⽤词典。
3、⼀个较⼴的idf⽂件,可进⼀步⾃⾏构建idf⽂件。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论