当前位置:   article > 正文

NLP文本关键词提取之TF-IDF模型:基于结巴分词和wordcloud进行疫情文本数据分析_tf-idf 关键词提取 文本分析

tf-idf 关键词提取 文本分析

TF-IDF模型:基于结巴分词和wordcloud进行疫情文本数据分析

最近做了新冠疫情中国政策的文本数据分析,下面来介绍一下相关知识进行总结与巩固,也希望帮助更多的人。

一、Tf-idf:关键词提取

停用词:停用词是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词

某个词比较少见,但在文章中多次出现,进而反映文章特行,那么它就是关键词

1、词频TF

词 频 ( T F ) = 某 个 词 在 文 章 中 的 出 现 次 数 该 文 出 现 词 的 总 数 \scriptsize词频(TF) = \frac{某个词在文章中的出现次数}{该文出现词的总数} (TF)=

2、逆文档频率IDF

image-20220505155431647

IDF越大,词频越大,重要程度越高

TF-IDF=词频*逆文档频率

二、结巴分词

jieba是Python 中文分词组件库,内置了许多方法帮助我们去使用。

pip install jieba

下面是结巴分词演示

1、首先导入jieba分词库
import pandas as pd
import jieba
import os
import jieba.analyse
  • 1
  • 2
  • 3
  • 4
2、获取文件夹下的所有文件名

有感兴趣想做的,可以找一些txt文件数据放入文件夹内(数据量越大越好)

content_S =[]
contents = []   # 存放txt文件每行的内容
path1 = r"policy_2020"
files_1 = os.listdir(path1)   # 得到path1文件夹下所有文件的名称
# print(files_1)
  • 1
  • 2
  • 3
  • 4
  • 5
3、遍历每一个文件并使用结巴进行分词

这里我用了非常低级的写法,这样使我的时间复杂度过大,当数据量很大时不建议这样写,学习使用还是可以的,大佬们也可以提一些宝贵建议。由于数据原因我用了5小时才跑完这部分内容(2144个txt文件)。

for i in range(len(files_1)):
    new_path = path1 + '\\'+ files_1[i]
    contents.append(new_path)
# print(contents)
    for j in range(len(contents)):
        with open(contents[j], 'r', encoding='utf-8') as f:
            myString = f.read().replace(' ','').replace('\n','')
            # 取关键词前五
        tags = jieba.analyse.extract_tags(myString,topK=5)
#         print(tags)
        content_S.append(tags)
    print("完成",i)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
4、读取分好词的conten_S和停用词
df_content=pd.DataFrame({'content_S':content_S})
df_content.head()
# 停用词
stopwords = pd.read_csv("baidu_stopwords.txt",index_col=False,sep="\t",quoting=2,names=['stopword'],encoding='utf-8')
stopwords.head
  • 1
  • 2
  • 3
  • 4
  • 5
5、停用词判断逻辑
def drop_stopwords(contents,stopwords):
    contents_clean=[]
    all_words=[]
    for line in contents:
        line_clean = []
        for word in line:
            if word in stopwords:
                continue
            line_clean.append(word)
            all_words.append(str(word))
        contents_clean.append(line_clean)
    return contents_clean,all_words
cons = df_content.content_S.values.tolist()
stopwords=stopwords.stopword.values.tolist()
contents_clean,all_words = drop_stopwords(cons,stopwords)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
6、查看经过停用词处理后的数据
df_content=pd.DataFrame({'content_clean':contents_clean})
df_content.head()
#关键词
df_all_words=pd.DataFrame({'all_words':all_words})
df_all_words.head()
#查看经过结巴分词后的所有关键词词频
words_count=df_all_words.groupby(by=['all_words'])['all_words'].agg([("count","count")])
words_count=words_count.reset_index().sort_values(by=["count"],ascending=False)
words_count.head(20)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

image-20220512215201124

三、绘制词云

使用wordcloud库可以进行词云绘制,将高频词可视化展示出来

首先需要导入 pip install wordcloud

from wordcloud import WordCloud
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib
matplotlib.rcParams['figure.figsize'] = (10.0,5.0)
#设置字体和背景颜色及最大文字大小,没有的话可以随便找个字体文件
wordcloud=WordCloud(font_path="./data/simhei.ttf",background_color="white",max_font_size=80)
word_frequence = {x[0]:x[1] for x in words_count.head(100).values}
wordcloud=wordcloud.fit_words(word_frequence)
plt.imshow(wordcloud)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

运行结果如下

image-20220512214243335
0).values}
wordcloud=wordcloud.fit_words(word_frequence)
plt.imshow(wordcloud)


运行结果如下

[外链图片转存中...(img-w6Q74NUD-1652364226383)]
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/684036
推荐阅读
相关标签
  

闽ICP备14008679号