1. 语料库
语料库是我们要分析的所有文档的集合
import os
import os.path
import codecs
import pandas
# 递归得到所有文件路径
file_paths = []
# 递归得到所有文件内容
file_contents = []
for root, dirs, files in os.walk("./2.1/SogouC.mini/Sample"):
for name in files:
# 得到文件路径
file_path = os.path.join(root, name)
# 文件路径添加到数组
file_paths.append(file_path)
# 打开文件流
f = codecs.open(file_path, 'r', 'utf-8')
# 得到文件内容
file_content = f.read()
# 关闭文件流
f.close()
# 文件内容添加到数组
file_contents.append(file_content)
# 表格化文件路径和内容
corpos = pandas.DataFrame({
'filePath': file_paths,
'fileContent': file_contents
})
2. 中文分词
将一个汉字序列切分成一个一个的单独的词
例:我的家乡是四川省达州市 -> 我/的/家乡/是/四川省/达州市
停用词 数据处理时,需要过滤掉某些字或词
- 泛滥的词,如 web 、网站 等
- 语气助词、副词、介词、连接词等,如 的,地,得
import jieba
# 添加词汇
jieba.add_word('降龙十八掌')
jieba.add_word('凌波微步')
# 批量添加词汇
# jieba.load_userdict(
# '路径'
# )
# 分词
for w in jieba.cut("降龙十八掌和凌波微步哪个厉害呢"):
print(w)
3. 词频统计
某个词在该文档中出现的次数
import jieba
import numpy
import pandas
import os.path
import codecs
# 添加停顿词
pause = pandas.read_csv(filepath_or_buffer="./file/StopwordsCN.txt", encoding="UTF-8", index_col=False)
# 分词记录
segments = []
for root, dirs, files in os.walk("./file/2.1/SogouC.mini/Sample"):
for name in files:
# 打开文件流
f = codecs.open(os.path.join(root, name), 'r', 'utf-8')
# 得到文件内容
file_content = f.read()
# 关闭文件流
f.close()
for seg in jieba.cut(file_content):
if seg not in pause.stopword.values and len(seg.strip().strip(b'\x00'.decode())) > 0:
segments.append(seg)
# 表格化分词数据
segments_data = pandas.DataFrame({
'segments': segments
})
# 分词数据进行统计和排序
seg_stat = segments_data.groupby(
by='segments'
)['segments'].agg({
"计数": numpy.size
}).reset_index().sort_values(
'计数',
ascending=False
)
4. 词云
对文本中词频较高的分词,给予视觉上的突出,形成“关键词渲染”,从而过滤掉大量的文本信息,使浏览者一眼扫过就可以领略文本的主旨
from wordcloud import WordCloud
# 生成wordcloud对象,传入字体和背景颜色
wordcloud = WordCloud(
"C:\Windows\Fonts\simfang.ttf",
background_color="black"
)
# 转换表格化的分词数据为字典形式
words = seg_stat.set_index("segments").to_dict()
# 适配词频
wordcloud.fit_words(words['计数'])
# 生成词云图片
wordcloud.to_file("pywordcloud.png")
5. 词云美化
美化词云图片样式
from wordcloud import WordCloud, ImageColorGenerator
import imageio
# 导入图片
bimg = imageio.imread("./file/wukong.jpg")
# 生成wordcloud对象,传入字体,图片和背景颜色
wordcloud = WordCloud(
font_path="C:\Windows\Fonts\simfang.ttf",
mask=bimg
)
# 获取颜色
image_color = ImageColorGenerator(bimg)
# 更改字体颜色为背景图片的颜色
wordcloud.recolor(color_func=image_color)
# 生成词云图片
wordcloud.to_file("pywordcloud.png")
6. 关键词
快速了解文档内容,把握主题的重要方式
-
使用jieba的 extract_tags 方法提取关键词
import codecs import os import jieba.analyse import pandas # 提取五个关键词 tag1 = [] tag2 = [] tag3 = [] tag4 = [] tag5 = [] for root, dirs, files in os.walk("./file/2.1/SogouC.mini/Sample"): for name in files: # 打开文件流 f = codecs.open(os.path.join(root, name), 'r', 'utf-8') # 得到文件内容 file_content = f.read() # 关闭文件流 f.close() # 提取关键词 tags = jieba.analyse.extract_tags(file_content, topK=5) tag1.append(tags[0]) tag2.append(tags[1]) tag3.append(tags[2]) tag4.append(tags[3]) tag5.append(tags[4]) tags_data = pandas.DataFrame({ 'tag1': tag1, 'tag2': tag2, 'tag3': tag3, 'tag4': tag4, 'tag5': tag5 }) print(tags_data)
-
TF-IDF提取
-
词频(TF)
- 指的是某一个给定的词在该文档中出现的次数
- 计算公式
TF = 该词在文档中出现的次数
-
逆文档频率(IDF)
- IDF就是每个词的权重,它的大小与一个词的常见程度成反比
- 计算公式
IDF = log(文档总数 / (包含该词的文档数 + 1))
-
TF-IDF
- 权衡某个分词是否关键词的指标,该值越大,是关键词的可能性就越大
- 计算公式
TF-IDF = TF * IDF
import os import codecs import jieba import pandas import numpy import re file_paths = [] file_contents = [] # 提取停顿词 pause = pandas.read_csv("./file/StopwordsCN.txt", encoding="UTF-8", index_col=False) # 递归提取文件路径及其内容 for root, dirs, files in os.walk("./file/2.1/SogouC.mini/Sample"): for file in files: # 文件路径 file_path = os.path.join(root, file) # 打开文件 f_handle = codecs.open(file_path, "r", "utf-8") # 获取文件内容 file_content = f_handle.read() # 关闭文件 f_handle.close() # 文件路径列表 file_paths.append(file_path) # 文件内容列表 file_contents.append(file_content) # 文件路径和内容组成的数据矿 data_frame = pandas.DataFrame({ 'file_paths': file_paths, 'file_contents': file_contents }) # 中文正则 zh_pattern = re.compile(u'[\u4e00-\u9fa5]') segments = [] file_paths = [] # 分词 iterrows依次返回每一行数据 for index, row in data_frame.iterrows(): for seg in jieba.cut(row['file_contents']): # 如果分词是中文,则添加到分词列表中 if zh_pattern.search(seg) and seg not in pause.stopword.values and len(seg.strip().strip(b'\x00'.decode())) > 0: segments.append(seg) file_paths.append(row['file_paths']) # 文件路径和分词组成的数据矿 segment_DF = pandas.DataFrame({ 'file_paths': file_paths, 'segments': segments }) # 对数据矿进行统计并安装计数倒叙 seg_stat = segment_DF.groupby( by=['file_paths', 'segments'] )['segments'].agg(numpy.size) seg_stat = seg_stat.to_frame() seg_stat.columns = ['计数'] seg_stat = seg_stat.reset_index().sort_values( '计数', ascending=False ) # 提取排序后计数大于1的数据 seg_stat = seg_stat[seg_stat.计数 > 1] # pivot_table透视表 # 以file_paths进行分组,每一组中都含有所有segments的数据及其统计 # pivot_table过的数据就是TF TF = seg_stat.pivot_table( index="file_paths", columns='segments', values='计数', fill_value=0 ) # IDF的计算函数 def handler(x): return (numpy.log(len(data_frame) / (numpy.sum(x > 0) + 1))) # pandas.apply方法是将数据矿中的数据一行一行的执行制定的函数 # 将TF中的数据一行一行的执行handler函数,计算出每一行的IDF IDF = TF.apply(handler) # 得到TF_IDF TF_IDF = pandas.DataFrame(TF * IDF) tag1s = [] tag2s = [] tag3s = [] tag4s = [] tag5s = [] # 提取TF_IDF的前五数据 for file_path in TF_IDF.index: # 提取TF_IDF中file_path列的所有行并进行降序排列后提取前五行 # loc 提取制定的行 tagis = TF_IDF.loc[file_path].sort_values(ascending=False)[:5].index tag1s.append(tagis[0]) tag2s.append(tagis[1]) tag3s.append(tagis[2]) tag4s.append(tagis[3]) tag5s.append(tagis[4]) # 组成文件路径和TF_IDF的数据矿 tagDF = pandas.DataFrame({ 'file_path': data_frame.file_paths, # 'file_content': data_frame.file_contents, 'tag1': tag1s, 'tag2': tag2s, 'tag3': tag3s, 'tag4': tag4s, 'tag5': tag5s }) tagDF.to_csv("text.txt", sep=",", header=True, index=True)
-
-
sklearn
全名Scikit-Learn,是基于Python的机器学习模块,基于BSD开源许可证,官网:http://scikit-learn.org/stable/from sklearn.feature_extraction.text import CountVectorizer contents = [ '我 是 中国 人。', '你 是 美国 人。', '你 叫 什么 名字?', '他 是 谁 啊?' ] # 初始化CountVectorizer方法,min_df最小词频,token_pattern分词的正则表达式 count_vectorizer = CountVectorizer( min_df=0, token_pattern=r"\b\w+\b" ) # 分词计数的向量化矩阵 textVector = count_vectorizer.fit_transform(contents) # 获取矩阵 textVector.todense() # 获取每列对应的分词 count_vectorizer.vocabulary_ # 导入sklearn的TF-IFD计算包 from sklearn.feature_extraction.text import TfidfTransformer # 初始化TF-IDF计算包 transformer = TfidfTransformer() # 分词计数的向量化矩阵计算为TF-IDF矩阵 tfidf = transformer.fit_transform(textVector) # 导入pandas包 import pandas # 将TF-IDF矩阵转化为pandas的数据矿 TFIDFDataFrame = pandas.DataFrame(tfidf.toarray()) # 设置数据矿的列索引为与之对应的分词,columns列索引,get_feature_names获取分词 TFIDFDataFrame.columns = count_vectorizer.get_feature_names() # 导入numpy包 import numpy # 将tfidf中的数据按行升序,取其中最后两位,即最大的两位,返回排序后的索引。argsort升序,axis=0按列排序,axis=1按行排序 TFIDFSorted = numpy.argsort(tfidf.toarray(), axis=1)[:, -2:] # 查看权重最高的分词,values以数组的形式返回 TFIDFDataFrame.columns[TFIDFSorted].values