文本挖掘是将文本信息转化为可利用的数据的知识。
一、创建“语料库”
语料库(Corpus)是我们要分析的所有文档的集合。
将现有的文本文档的内容添加到一个新的语料库中。
实现逻辑:
将各文本文件分类放置在一个根目录下,通过遍历读取根目录下所有子目录中的所有文件,
然后将读取结果赋值到一个数据框中,得到含有文件路径、文件内容的结果。
代码核心:
构建方法:os.walk(fileDir) 对在fileDir目录下的所有文件(for循环)进行操作 ,得到文件路径
文件读取:codecs.open(filepath,medthod,encoding) 文件路径、打开方式(r,w,rw)、文件编码 ,得到文本内容
#构建语料库 import codecs filepaths = [] #构建一个空的‘文件路径’列表 filecontents = [] #构建一个空的‘文件内容’列表 for root, dirs, files in os.walk('.\SogouC.mini\Sample'): for name in files: #拼接文件路径,得到所有子文件夹下的文件的文件路径的列表 filepaths,包含根目录、子目录和文件名 filepath = os.path.join(root,name) filepaths.append(filepath) #将所有子文件夹下的文件路径的列表合并到一个新的列表中 #打开文件,‘r’表示只读,编码方式‘utf-8’ f = codecs.open(filepath,'r','utf-8') filecontent = f.read() #读取文件,并将内容传入到 'filecontent'(文件内容)列表中 f.close() #关闭文件 filecontents.append(filecontent) #将所有子文件夹下的文件内容的列表合并到一个新的列表中 import pandas as pd #根据得到的合并后的文件路径和文件内容,得到语料库的数据框 corpos = pd.DataFrame({ 'filePath':filepaths, 'fileContent':filecontents}) corpos.to_csv('.\corpos.csv',sep=',',encoding='utf_8_sig',index=False)
###防止保存时出现乱码,需要参数encoding='utf_8_sig'
二、中文分词
一般使用 jieba 中文分词包,较友好(简单,方便,准确率高)
jieba包的部分用法:
- jieba.cut('str') 对str进行分词
- jieba.add_word() 增加自定义分词
- jieba.load_userdict() 通过导入本地文件中的词,将之添加到词库
分词实现代码:
import jieba #创建词组和路径的空列表 segments = [] filepath_2 = [] #对语料库的每行遍历( for index, row in corpos.iterrows(): filePath = row['filePath'] #文件路径 fileContent = row['fileContent'] #文本内容 segs = jieba.cut(fileContent) #对文本内容分词 #对分词结果遍历,将每个词及其路径分别添加到segments和filepath_2列表中 for seg in segs: segments.append(seg) filepath_2.append(filePath) #将两个列表合并到数据框中(词,路径) segmeng_DF = pd.DataFrame({ 'segment': segments, 'filePath': filepath_2})
最终得到各个词及其路径的数据框
三、词频统计
得到含有分词结果的数据后,需要对分词出现的次数进行统计,得到词频表
#####词频统计 import numpy as np #根据前面的分词结果,对每个词的词频进行统计,再根据词频大小排序 segcount = segmeng_DF.groupby(by='segment')['segment'].agg({ '频数':np.size }).reset_index().sort_index(by=['频数'],ascending=False) help(pd.DataFrame.sort_index)
DataFrame不支持sort方法,已更新为sort_index方法
词频统计后需要将部分停用词(语气词等等无实际意义的词)进行剔除
!!!这里使用导入的方式确定停用词,read_csv对中文路径十分不友好,尽量使用英文路径
stopwords = pd.read_csv(r'D:\python_study\StopwordsCN.txt',encoding='utf-8',index_col=False)
stopwords即为分词过程中需要剔除的词
剔除停用词的两种思路:
- 剔除统计词频后的分词结果中含有的停用词,使用isin方法,“~”取反
- 在构建语料库的时候添加过滤条件
第一种实现方法:
fsegcount = segcount[~segcount.segment.isin(stopwords.stopword)]
第二种实现方法:
#####在读取文件时过滤停用词 import jieba #创建词组和路径的空列表 segments = [] filepath_2 = [] #对语料库的每行遍历( for index, row in corpos.iterrows(): filePath = row['filePath'] #文件路径 fileContent = row['fileContent'] #文本内容 segs = jieba.cut(fileContent) #对文本内容分词 #对分词结果遍历,将每个词及其路径分别添加到segments和filepath_2列表中 for seg in segs: if (seg not in stopwords.stopword.values) and (len(seg.strip())>0): segments.append(seg) filepath_2.append(filePath) #将两个列表合并到数据框中(词,路径) segmeng_DF = pd.DataFrame({ 'segment': segments, 'filePath': filepath_2}) segcount_1 = segmeng_DF.groupby(by='segment')['segment'].agg({ '频数':np.size }).reset_index().sort_index(by=['频数'],ascending=False)
嵌套if函数,通过判断分词结果是否在stopwords的值中,剔除停用词,得到最终的词频统计表
四、绘制词云
首先需要下载wordcloud程序包,通过whl文件进行库的安装
https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud
在cmd中定位下载目录,输入 pip install wordcloud-1.5.0-cp36-cp36m-win_amd64.whl 进行安装
from wordcloud import WordCloud import matplotlib.pyplot as plt #传入字体文件的路径及背景颜色两个参数 wordcloud = WordCloud(font_path=r'D:\python_study\python数据挖掘\数据挖掘学习代码\课件\2.4\simhei.ttf', background_color='gray')
#wordcloud方法需要传入字典结构的参数,所以将词频结果(数据框)转换为字典类型
#先将分词设置为数据框的索引,再使用to_dict方法转换为字典
words = segcount_1.set_index('segment').to_dict()
type(segcount_1.set_index('segment'))#只有一列的数据框 wordcloud.fit_words(words['频数'])#根据频数进行作图 plt.imshow(wordcloud) plt.close()
最终得到类似与右图的结果
五、词云美化
将词云的背景替换成与主题相关的图片
需要用到的包:
from scipy.misc import imread
from wordcloud import WordCloud, ImageColorGenerator
部分关键方法
读取图片背景: bimg = imread(imgFilePath)
获取图片颜色: bimgColors = ImageColorGenerator(bimg)
重置词云的颜色: wordcloud.recolor(color_func=bimgColors
#词云美化 from scipy.misc import imread from wordcloud import WordCloud, ImageColorGenerator #读取需要替换的图片背景: bimg = imread(r'D:\python_study\python数据挖掘\数据挖掘学习代码\课件\2.5\贾宝玉2.png') #使用了贾宝玉的上半身作为词云(别问,懒,随手拿的) wordcloud = WordCloud( background_color="white", mask=bimg, font_path=r'D:\python_study\python数据挖掘\数据挖掘学习代码\课件\2.4\simhei.ttf' ) wordcloud = wordcloud.fit_words(words['频数']) #设置输出图形参数 plt.figure( num=None, figsize=(8, 6), dpi=80, facecolor='w', edgecolor='k') #获取图片颜色 bimgColors = ImageColorGenerator(bimg) #移除坐标轴 plt.axis("off") #重置词云颜色 plt.imshow(wordcloud.recolor(color_func=bimgColors)) plt.show()
最终得到右图的结果