小项目:词频分析+词云图(全部代码+遇到的问题)

584 阅读3分钟

目标:

通过对提取的文件中的文本进行词频分析及可视化处理(词云图)来了解文本大致的主题及内容,为后续的文本分析做准备。

思路分析:

  1. 针对不同的文件类型(csv、excel、docx、pdf等)采用不同的package的方法来打开文件,提取文本。
  2. 提取到的文本要进行大致观察,看文本数据是否干净(即是否存在很多无关紧要的符号),如果要单纯进行中文文本分析,那么就需要用到re库,对数据进行处理,剔除掉其中的符号、英文等,得到包含剩余中文的列表。
  3. 将列表转换为字符串文本。
  4. 用jieba库对剩余文本进行分词,这个过程中要考虑到最终保留多长的字符串,一般要删除长度为1的字符串,因为这种字符串大多无意义。同时要提前导入自定义词典避免相关专业名词被分开。
  5. 进行词频统计、词频排序。
  6. 导入pyecharts库,进行词云图的制作。

具体代码:

#导入库
import re
import jieba
import csv
from pyecharts import options as opts
from pyecharts.charts import Page, WordCloud
from pyecharts.globals import SymbolType

#读取文件中的文本
text = open(r'文件路径').read()

#去掉非中文部分,保留中文
text = re.findall('[\u4e00-\u9fa5]',text)

#将列表转换为字符串
text = ''.join(text)

# 导入自定义词典
jieba.load_userdict('自定义词典的路径名称')

#对文本进行分词
cut_text = jieba.lcut(text)

#删除掉长度为1的字符
cut1_text = [
    w
    for w in set(cut_text)
    if len(w) > 1
]

#词频统计
wordfreq = []
for word in cut1_text:
    freq = cut_text.count(word)
    wordfreq.append((word, freq))
    
# 词频排序
wordfreq = sorted(wordfreq, key=lambda k:k[1], reverse=True)
wordfreq

#词云图制作
#初始化,设置
wordcloud =WordCloud()
wordcloud.add("",
              wordfreq,
              word_size_range=[20,100])
wordcloud.set_global_opts(title_opts=opts.TitleOpts(title="基本示例"))

#渲染结果
wordcloud.render_notebook()

代码分析及易错点:

  1. 在读取文件中的文本部分,文件路径前要加r,主要是因为\在python中经常作为转义符使用,因此机器可能无法正确识别。

  2. 在去掉非中文部分中,[\u4e00-\u9fa5]是中文字符的编码,可以通过百度查询得到。

  3. 在删除掉长度为1的字符这一部分,for循环后并没有加冒号,主要原因是因为这是python中的列表解析,在列表解析中for循环后不同加冒号,只用空格继续写,甚至不用分行,如:cut1_text = [w for w in set(cut_text) if len(w) > 1],另一种传统复杂写法如下:

cut1_text = []
for w in set(cut_text):
    if len(w) > 1:
        cut1_text.append(w)
  1. 在删除掉长度为1的字符这一部分,for循环中用了set()把列表变成了集合,这一步至关重要,如果没有变成集合,那么后期的词频统计部分,for循环的结果会出现很多重复现象。

  2. 在词频统计部分for word in cut1_text:主要是提取word,因此主要是选择cut1_text(已去重)作为对象,而后要计算每个词出现的频次freq = cut_text.count(word),则应该选择为cut_text(未去重)