当前位置:   article > 正文

手把手教你对抓取的文本进行分词、词频统计、词云可视化和情感分析

运用关键词提取、词频统计、词云分析、关键词共现分析、可视化分析等相关方法,分

点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

苍苍竹林寺,杳杳钟声晚。

大家好,我是Python进阶者。

前言

前几天星耀群有个叫【小明】的粉丝在问了一道关于Python处理文本可视化+语义分析的问题,如下图所示。

71ed77aa25070cf782fee9b5655bc4be.png他要构建语料库,目前通过Python网络爬虫抓到的数据存在一个csv文件里边,现在要把数据放进txt里,表示不会,然后还有后面的词云可视化,分词,语义分析等,都不太会。

关于词云的文章,历史文章已经写了十几篇了,感兴趣的话可以在公众号历史文章搜索关键字“词云”前往,但是关于分词和语义分析的文章,就分享过一篇,这个我在读研的时候写的,虽然有些时日,但是内容依旧精彩,欢迎前往查探:Python大佬分析了15万歌词,告诉你民谣歌手们到底在唱什么

一、思路

内容稍微有点多,大体思路如下,先将csv中的文本取出,之后使用停用词做分词处理,再做词云图,之后做情感分析。

1、将csv文件中的文本逐行取出,存新的txt文件,这里运行代码《读取csv文件中文本并存txt文档.py》进行实现,得到文件《职位表述文本.txt》

2、运行代码《使用停用词获取最后的文本内容.py》,得到使用停用词获取最后的文本内容,生成文件《职位表述文本分词后_outputs.txt》

3、运行代码《指定txt词云图.py》,可以得到词云图;

4、运行代码《jieba分词并统计词频后输出结果到Excel和txt文档.py》,得到《wordCount_all_lyrics.xls》和《分词结果.txt》文件,将《分词结果.txt》中的统计值可以去除,生成《情感分析用词.txt》,给第五步情感分析做准备

5、运行代码《情感分析.py》,得到情感分析的统计值,取平均值可以大致确认情感是正还是负。

关于本文的源码和数据我都已经打包好上传到git了,在公众号后台回复关键词小明的数据即可获取。

35e0a7dcea52ad8b9abc7a3406238cd6.png

二、实现过程

1.将csv文件中的文本逐行取出,存新的txt文件

这里运行代码《读取csv文件中文本并存txt文档.py》进行实现,得到文件《职位表述文本.txt》,代码如下。

  1. # coding: utf-8
  2. import pandas as pd
  3. df = pd.read_csv('./职位描述.csv', encoding='gbk')
  4. print(df.head())
  5. for text in df['Job_Description']:
  6.     # print(text)
  7.     if text is not None:
  8.         with open('职位表述文本.txt', mode='a', encoding='utf-8') as file:
  9.             file.write(str(text))
  10. print('写入完成')
2.使用停用词获取最后的文本内容

运行代码《使用停用词获取最后的文本内容.py》,得到使用停用词获取最后的文本内容,生成文件《职位表述文本分词后_outputs.txt》,代码如下:

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import jieba
  4. # jieba.load_userdict('userdict.txt')
  5. # 创建停用词list
  6. def stopwordslist(filepath):
  7.     stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
  8.     return stopwords
  9. # 对句子进行分词
  10. def seg_sentence(sentence):
  11.     sentence_seged = jieba.cut(sentence.strip())
  12.     stopwords = stopwordslist('stop_word.txt')  # 这里加载停用词的路径
  13.     outstr = ''
  14.     for word in sentence_seged:
  15.         if word not in stopwords:
  16.             if word != '\t':
  17.                 outstr += word
  18.                 outstr += " "
  19.     return outstr
  20. inputs = open('职位表述文本.txt''r', encoding='utf-8')
  21. outputs = open('职位表述文本分词后_outputs.txt''w', encoding='utf-8')
  22. for line in inputs:
  23.     line_seg = seg_sentence(line)  # 这里的返回值是字符串
  24.     outputs.write(line_seg + '\n')
  25. outputs.close()
  26. inputs.close()

关键节点,都有相应的注释,你只需要替换对应的txt文件即可,如果有遇到编码问题,将utf-8改为gbk即可解决。

3.制作词云图

运行代码《指定txt词云图.py》,可以得到词云图,代码如下:

  1. from wordcloud import WordCloud
  2. import jieba
  3. import numpy
  4. import PIL.Image as Image
  5. def cut(text):
  6.     wordlist_jieba=jieba.cut(text)
  7.     space_wordlist=" ".join(wordlist_jieba)
  8.     return space_wordlist
  9. with open(r"C:\Users\pdcfi\Desktop\xiaoming\职位表述文本.txt" ,encoding="utf-8")as file:
  10.     text=file.read()
  11.     text=cut(text)
  12.     mask_pic=numpy.array(Image.open(r"C:\Users\pdcfi\Desktop\xiaoming\python.png"))
  13.     wordcloud = WordCloud(font_path=r"C:/Windows/Fonts/simfang.ttf",
  14.     collocations=False,
  15.     max_words= 100,
  16.     min_font_size=10
  17.     max_font_size=500,
  18.     mask=mask_pic).generate(text)
  19.     image=wordcloud.to_image()
  20.     # image.show()
  21.     wordcloud.to_file('词云图.png')  # 把词云保存下来

如果想用你自己的图片,只需要替换原始图片即可。这里使用Python底图做演示,得到的效果如下:

80284b55fbf7ae818e52057fae826fbe.png
4.分词统计

运行代码《jieba分词并统计词频后输出结果到Excel和txt文档.py》,得到《wordCount_all_lyrics.xls》和《分词结果.txt》文件,将《分词结果.txt》中的统计值可以去除,生成《情感分析用词.txt》,给第五步情感分析做准备,代码如下:

  1. #!/usr/bin/env python3
  2. # -*- coding:utf-8 -*-
  3. import sys
  4. import jieba
  5. import jieba.analyse
  6. import xlwt  # 写入Excel表的库
  7. # reload(sys)
  8. # sys.setdefaultencoding('utf-8')
  9. if __name__ == "__main__":
  10.     wbk = xlwt.Workbook(encoding='ascii')
  11.     sheet = wbk.add_sheet("wordCount")  # Excel单元格名字
  12.     word_lst = []
  13.     key_list = []
  14.     for line in open('职位表述文本.txt', encoding='utf-8'):  # 需要分词统计的原始目标文档
  15.         item = line.strip('\n\r').split('\t')  # 制表格切分
  16.         # print item
  17.         tags = jieba.analyse.extract_tags(item[0])  # jieba分词
  18.         for t in tags:
  19.             word_lst.append(t)
  20.     word_dict = {}
  21.     with open("分词结果.txt"'w') as wf2:  # 指定生成文件的名称
  22.         for item in word_lst:
  23.             if item not in word_dict:  # 统计数量
  24.                 word_dict[item] = 1
  25.             else:
  26.                 word_dict[item] += 1
  27.         orderList = list(word_dict.values())
  28.         orderList.sort(reverse=True)
  29.         # print orderList
  30.         for i in range(len(orderList)):
  31.             for key in word_dict:
  32.                 if word_dict[key] == orderList[i]:
  33.                     wf2.write(key + ' ' + str(word_dict[key]) + '\n')  # 写入txt文档
  34.                     key_list.append(key)
  35.                     word_dict[key] = 0
  36.     for i in range(len(key_list)):
  37.         sheet.write(i, 1, label=orderList[i])
  38.         sheet.write(i, 0, label=key_list[i])
  39.     wbk.save('wordCount_all_lyrics.xls')  # 保存为 wordCount.xls文件

得到的txt和excel文件如下所示:

eb7213b372ee028a9d4858169817e585.png
5.情感分析的统计值

运行代码《情感分析.py》,得到情感分析的统计值,取平均值可以大致确认情感是正还是负,代码如下:

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from snownlp import SnowNLP
  4. # 积极/消极
  5. print(s.sentiments)  # 0.9769551298267365  positive的概率
  6. def get_word():
  7.     with open("情感分析用词.txt", encoding='utf-8') as f:
  8.         line = f.readline()
  9.         word_list = []
  10.         while line:
  11.             line = f.readline()
  12.             word_list.append(line.strip('\r\n'))
  13.         f.close()
  14.         return word_list
  15. def get_sentiment(word):
  16.     text = u'{}'.format(word)
  17.     s = SnowNLP(text)
  18.     print(s.sentiments)
  19. if __name__ == '__main__':
  20.     words = get_word()
  21.     for word in words:
  22.         get_sentiment(word)
  23. # text = u'''
  24. # 也许
  25. # '''
  26. # s = SnowNLP(text)
  27. print(s.sentiments)
  28. #     with open('lyric_sentiments.txt''a', encoding='utf-8') as fp:
  29. #         fp.write(str(s.sentiments)+'\n')
  30. print('happy end')

基于NLP语义分析,程序运行之后,得到的情感得分值如下图所示:

9cb53138b7c614b5d4e6f278df842c04.png将得数取平均值,一般满足0.5分以上,说明情感是积极的,这里经过统计之后,发现整体是积极的。

四、总结

我是Python进阶者。本文基于粉丝提问,针对一次文本处理,手把手教你对抓取的文本进行分词、词频统计、词云可视化和情感分析,算是完成了一个小项目了。下次再遇到类似这种问题或者小的课堂作业,不妨拿本项目练练手,说不定有妙用噢,拿个高分不在话下!

最后感谢粉丝【小明】提问,感谢【

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/628582
推荐阅读
相关标签