说在前面

  • 由于前段时间学习任务较重,故所做的一些东西没有及时写博客更新,从今天开始我将会把之前的项目更新到博客。
  • 这次基于jieba库的词频分析是python课上留的一个小作业,主要是熟悉对英文和中文的词频统计并分析得到结论。

1.文章内容的选取

  • 本次选取词频分析的文章是国家发布的一个新冠肺炎疫情社区防控的指导方案,这篇文章主要讲了如何在社区进行疫情防控,首先将这篇文章复制下来,以”utf-8”格式保存为”.txt”文件

下面是最终保存的结果图:

2.文章的预处理

  • 从上图也可以看出文章里面有许多标点符号、特殊字符、换行符 “\n” 等,这些字符都会给后面的分词带来影响,所以我们首先要对文章进行预处理,把这些无用字符去掉。
1
2
3
4
5
6
7
def read_txt(path):
'''读文件'''
txt = open(path, 'r', encoding='utf-8').read()
for x in ' ,。“‘’”:!、《》;? 」「…":':
txt = txt.replace(x, "")
txt = txt.replace("\n","")
return txt
  • 这里使用replace方法将读到的文本中的无用字符用””代替。

3.用jieba库进行分词

  • 之后用jieba进行分词,这里定义了两个列表,分别存取新创的构词和无关的待去掉的构词,比如新添构词:“新冠肺炎”、“社区防控”、“委员会”等,待去掉的构词:“做好”、“对于”、“逐步”、“推动”等;之后遍历这两个列表,分别调用jieba.add_word()加入新增构词、jieba.del_word()删除无关构词;然后调用jieba.lcut()生成分词后的列表。
1
2
3
4
5
6
7
8
9
10
def get_words(txt):
'''用jieba进行分词'''
new_words = ['新冠肺炎', '社区防控', '委员会', '组织领导', '医学观察', '精准化', '精细化']
del_words = ['做好', '对于', '逐步', '做到', '推动', '根据', '要求', '返回']
for i in new_words:
jieba.add_word(i)
for i in del_words:
jieba.del_word(i)
words = jieba.lcut(txt)
return words

4.统计词频

  • 下面进行词频的统计,这里定义了一个字典,遍历分词之后的列表,判断字符串长度是否大于1(取代单独一个字符的词),调用count()方法统计该词的出现次数,并和该词构成一个键值对存到字典中,这样就完成了词频的统计,接着调用sort()方法以字典的值降序排序,打印出前30个词及词频。
1
2
3
4
5
6
7
8
9
10
11
12
13
def deal_with_words(words):
'''统计词频'''
dic = {}
for i in words:
if len(i) > 1:
dic[i] = words.count(i)
words_list = list(dic.items())
words_list.sort(key= lambda x:x[1], reverse=True)
print ('字符\t词频')
print ('=============')
for i in range(30):
word, count = words_list[i]
print("{0:<10}{1:>5}".format(word, count))
  • 以下是最终打印出来的结果:前面是分割出来的词,后面是出现的次数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    字符	词频
    =============
    社区 83
    工作 40
    防控 35
    社区防控 33
    疫情 26
    人员 25
    管理 23
    服务 21
    居民 20
    生活 16
    组织 16
    物资 16
    措施 14
    机制 12
    健康 12
    参与 11
    医学观察 10
    地区 10
    隔离 10
    配送 10
    新冠肺炎 9
    实施 9
    群众 9
    完善 9
    社区服务 9
    机构 8
    志愿者 8
    加强 8
    信息 8
    高风险 8

5.用wordcloud生成词云

  • 下面利用wordcloud生成词云,并用matplotlib库对其进行绘图,更加直观展现关键词及重要程度,调用Wordcloud的generate()方法对分词后的字符串进行词云的产生,之后用matplotlib中的imshow()方法绘制词云图,设置坐标轴隐藏,使用show()方法将其显示出来。
1
2
3
4
5
6
7
def create_word_cloud(words):
'''绘制词云'''
txt = ' '.join(words)
wc = WordCloud(font_path='./fonts/simhei.ttf',width=800, height=600, mode='RGBA', background_color=None).generate(txt)
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()
  • 下面是最终生成的词云图:

  • 通过词云和统计的词频可以发现“社区”、“工作”、“防控”、“居民服务”等关键词比较突出,大致可以总结出这篇文章主要是谈社区防控的,并且对居民生活要有保障物资,各地应该是要有相应的措施,后面的“健康”、“医学观察”、“地区”、“隔离”、“配送”则表明要求关注居民的健康问题,如果发现有人有发热状况要立即进行隔离并进行医学观察,给居民配送物资等,基本上就是社区防控与服务居民的方案指导。

附源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt

def read_txt(path):
'''读文件'''
txt = open(path, 'r', encoding='utf-8').read()
for x in ' ,。“‘’”:!、《》;? 」「…":':
txt = txt.replace(x, "")
txt = txt.replace("\n","")
return txt

def get_words(txt):
'''用jieba进行分词'''
new_words = ['新冠肺炎', '社区防控', '委员会', '组织领导', '医学观察', '精准化', '精细化']
del_words = ['做好', '对于', '逐步', '做到', '推动', '根据', '要求', '返回']
for i in new_words:
jieba.add_word(i)
for i in del_words:
jieba.del_word(i)
words = jieba.lcut(txt)
return words

def deal_with_words(words):
'''统计词频'''
dic = {}
for i in words:
if len(i) > 1:
dic[i] = words.count(i)
words_list = list(dic.items())
words_list.sort(key= lambda x:x[1], reverse=True)
print ('字符\t词频')
print ('=============')
for i in range(30):
word, count = words_list[i]
print("{0:<10}{1:>5}".format(word, count))

def create_word_cloud(words):
'''绘制词云'''
txt = ' '.join(words)
wc = WordCloud(font_path='./fonts/simhei.ttf',width=800, height=600, mode='RGBA', background_color=None).generate(txt)
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()

def main():
'''主函数'''
txt = read_txt('疫情指导方案.txt')
words = get_words(txt)
deal_with_words(words)
create_word_cloud(words)

if __name__ == '__main__':
main()