词频统计 - 词云绘制
2017-07-04 本文已影响1335人
_hahaha
需求分析:
从 搜狗实验室 下载一份迷你版的样例数据,解压后文件名为 ‘SogouC.mini’。作为练习数据对其进行以下几个实验:词频统计-词云绘制-关键词提取-相似文章推荐-自动摘要等实验。本篇为词频统计和词云绘制篇,后面几个实验我会慢慢补上。‘SogouC.mini’的文件目录结构如下:
*开发环境:
系统: macOS Sierra; 开发软件: PyChram CE; 运行环境: Python3.6
-
首先导入需要用到的包
import jieba
import pandas
from wordcloud import WordCloud
import matplotlib.pyplot as plt
-
创建语料库
filePaths = []
fileContents = []
for root, dirs, files in os.walk( # 遍历文件目录,包括目录下的子文件
'data/SogouC.mini/Sample'
):
for name in files:
filePath = os.path.join(root, name) # 组成每个子文件的全路径
filePaths.append(filePath)
f = codecs.open(filePath, 'r', 'utf-8') #open只能写入str类型的数据,某些情况可能会出现编码错误,而codecs.open能避免这个问题
fileContent = f.read()
f.close()
fileContents.append(fileContent)
corpus = pandas.DataFrame({
'filePath': filePaths,
'fileContent': fileContents
})
corpus.to_csv('data/corpus.csv', index=False) #将语料库corpus保存为csv文件
运行结果如下:(用head()函数显示前面5行)
*
-
读取停用词文件
# 读取停用词文件(StopwordsCN.txt)
stopWords = pandas.read_csv(
'data/StopwordsCN.txt',
encoding='utf-8',
index_col=False
)
-
对语料库进行分词 & 进行停用词过滤
# 分词处理 & 过滤停用词
for index, row in corpus.iterrows(): # 迭代(iterate)覆盖整个DataFrame的行中,返回(index, Series)对
filePath = row['filePath']。# row为字典类型,所以可以用row[key]的形式取到value值
fileContent = row['fileContent']
seg_list = jieba.cut(fileContent)
for seg in seg_list:
# 去除停用词及空字符(>0的时候为去处空字符),并且只保留字数大于1的词(>1的时候为去处空字符以及计数小于1的词)
if seg not in stopWords['stopword'].values and len(seg.strip())>1:
segments.append(seg)
filePaths.append(filePath)
segmentDF = pandas.DataFrame({
'filePath': filePaths,
'segment': segments
})
运行结果如下:(只显示部分结果)
*
-
词频统计
# 词频统计
segStat = segmentDF.groupby(
by='segment'
)['segment'].agg({
'计数':len
}).reset_index().sort_values(
'计数',
ascending=False # 降序排列
)
运行结果如下:(只显示部分结果)
*
-
绘制词云
# 绘制词云
wordCloud = WordCloud(
font_path='data/simhei.ttf', # 设置字体为中文字体
background_color='black' # 设置词云背景颜色
)
words = segStat.set_index('segment').to_dict() # 设置segment列为索引,并将DataFrame转化为字典形式
wordCloud.fit_words(words['计数']) # 配置词云
plt.imshow(wordCloud)
plt.show()
plt.close()
运行结果如下:
*