数据挖掘二:文本分析

文章目录

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. 关键词

快速了解文档内容,把握主题的重要方式

  1. 使用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)
  2. TF-IDF提取

    1. 词频(TF)

      1. 指的是某一个给定的词在该文档中出现的次数
      2. 计算公式
        TF = 该词在文档中出现的次数
    2. 逆文档频率(IDF)

      1. IDF就是每个词的权重,它的大小与一个词的常见程度成反比
      2. 计算公式
        IDF = log(文档总数 / (包含该词的文档数 + 1))
    3. TF-IDF

      1. 权衡某个分词是否关键词的指标,该值越大,是关键词的可能性就越大
      2. 计算公式
        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)
  3. 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
原文链接:,转发请注明来源!
评论已关闭。