前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于词云可视化笔记四(tf-idf分析及可视化)

关于词云可视化笔记四(tf-idf分析及可视化)

作者头像
python与大数据分析
发布2022-03-11 13:13:19
1.4K0
发布2022-03-11 13:13:19
举报
文章被收录于专栏:python与大数据分析

TF-IDF(term frequency–inversedocument frequency)是一种用于信息检索与数据挖掘的常用加权技术。

TF意思是词频(Term Frequency),表示词条在文档d中出现的频率。

IDF意思是逆文本频率指数(InverseDocument Frequency)。IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。

某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

前文已经介绍了jieba和pkuseg两种分词方法,解决了TF词频问题,但IDF问题尚未解决,幸好,sklearn提供了标准化的解决方案。

1.CountVectorizer

CountVectorizer类会将文本中的词语转换为词频矩阵,例如矩阵中包含一个元素a[i][j],它表示j词在i篇文档中出现的频次。它通过fit_transform函数计算各个词语出现的次数,通过get_feature_names()可获取词袋中所有文本的关键字(英语是按字母顺序排列的),通过toarray()可看到词频矩阵的结果。

2.TfidfTransformer

TfidfTransformer用于统计vectorizer中每个词语的TF-IDF值。

sklearn的计算过程有两点要注意:

一是sklean计算对数log时,底数是e,不是10

二是参数smooth_idf默认值为True,若改为False,transformer = TfidfTransformer(smooth_idf = False),则计算方法略有不同,导致结果也有所差异。

前系列笔记也提供了词云可视化工具,但词云只是一种定性分析方式,要解决定量分析,还要另辟蹊径,本笔记也改写了一下网上的一些材料,通过heatmap方式对文本词频和文本的IDF进行展现,很容易看到语句中哪些词频最高,哪些词的分类属性更好。另外本文也提供了类河流图的方式即matplotlib的stackflow作图,不过效果不佳,还有待改进。

代码语言:javascript
复制
# coding:utf-8
import pylab
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import cm
from numpy import matrix
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
#文本词频可视化图表stackplot风格
# streamgraph风格的在beaborn上也有,不过不太符合要求
# streamgraph风格的在pyechart上也有,可以直接使用,下次再讲用法
# streamgraph风格的在matplotlib上只有类stackplot,不够圆滑
def draw_stackplot(data,xlabels,ylabels):
    # X标签 行,即章节
    # Y标签 列,即词汇
    # 数据 即词频,需要转置后才能应用
    #data= [[0, 3, 3, 3, 0, 0, 3, 0, 3], [0, 3, 0, 3, 0, 6, 3, 0, 3], [3, 0, 0, 0, 3, 0, 3, 3, 0], [0, 3, 3, 3, 0, 0, 3, 0, 3]]
    #xlablels= range(0, 4)
    #ylablels= ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
    pylab.mpl.rcParams['font.sans-serif'] = ['SimHei']  # 防止中文乱码
    pylab.mpl.rcParams['axes.unicode_minus'] = False  # 防止中文乱码
    fig, ax = plt.subplots()
    ax.stackplot(xlabels, data, labels=ylabels, baseline='wiggle')
    ax.axes.set_yticks(range(len(ylabels)))
    ax.axes.set_yticklabels(ylabels)
    ax.axes.set_xticks(range(len(xlabels)))
    ax.axes.set_xticklabels(xlabels)
    ax.legend(loc='best')
    ax.set_title('Interesting Graph\nCheck it out')
    plt.show()

#文本词频可视化图表heatmap风格
def draw_heatmap(data, xlabels, ylabels):
    pylab.mpl.rcParams['font.sans-serif'] = ['SimHei']  # 防止中文乱码
    pylab.mpl.rcParams['axes.unicode_minus'] = False  # 防止中文乱码
    vmin=np.amin(matrix(data))
    vmax = np.amax(matrix(data))
    cmap = cm.Blues
    figure = plt.figure(facecolor='w')
    ax = figure.add_subplot(2, 1, 1, position=[0.1, 0.15, 0.8, 0.8])
    ax.set_yticks(range(len(ylabels)))
    ax.set_yticklabels(ylabels)
    ax.set_xticks(range(len(xlabels)))
    ax.set_xticklabels(xlabels)
    map = ax.imshow(data, interpolation='nearest', cmap=cmap, aspect='auto', vmin=vmin, vmax=vmax)
    cb = plt.colorbar(mappable=map, cax=None, ax=None, shrink=0.5)
    plt.xticks(rotation=90)  # 将字体进行旋转
    plt.yticks(rotation=360)
    plt.show()

#------------------------------英文tf-idf-------------------------------
#英文文本
corpus = [  
    'This is the first document.'*3,
    'This is the second second document.'*3,
    'And the third one.'*3,
    'Is this the first document?'*3,
]
# -------------------------词频分析---------------------------
#将文本中的词语转换为词频矩阵  
vectorizer = CountVectorizer()
#计算个词语出现的次数  
X = vectorizer.fit_transform(corpus)
#X格式如下,主要包括(行 词)词频
#(0, 1)    1     (0, 2)   1     (0, 6)   1     (0, 3)   1     (0, 8)   1     (1, 5)   2     (1, 1)   1
#获取语句中所有文本关键词
word = vectorizer.get_feature_names()
# word格式如下,是个英文词汇的数组列表
# ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
#查看词频结果,转置为Numpy 2维数组后的输出
print('X.toarray()=',X.toarray())
#and   document   first  is one    second the    third  this
#0 1  1  1  0  0  1  0  1
#0 1  0  1  0  2  1  0  1
#1 0  0  0  1  0  1  1  0
#0 1  1  1  0  0  1  0  1
# ---------------------------可视化----------------------------
#热力图方式
xlabels=word
ylabels=list(range(len(corpus)))
data=X.toarray().tolist()
draw_heatmap(data, xlabels, ylabels)
#转置维stackflow的格式要求,y轴为字符,x轴为章节
#stackplt方式
data=X.T.toarray().tolist()
draw_stackplot(data, ylabels, xlabels)
# --------------------------词频分析---------------------------
#TfidfTransformer类调用
transformer = TfidfTransformer()
#将词频矩阵X统计成TF-IDF值  
tfidf = transformer.fit_transform(X)
#查看数据结构 tfidf[i][j]表示i类文本中的tf-idf权重,以下为fidf的输出样式
#(0, 8)    0.4387767428592343
#(0, 3)    0.4387767428592343
#(0, 6)    0.35872873824808993
#(0, 2)    0.5419765697264572
#(0, 1)    0.4387767428592343
#(1, 8)    0.27230146752334033
#(1, 3)    0.27230146752334033
print('tfidf.toarray()=',tfidf.toarray())
#查看tfidf结果,转置为Numpy 2维数组后的输出
#and   document   first  is one    second the    third  this
#0 0.43877674 0.54197657 0.43877674 0  0  0.35872874 0  0.43877674
#0 0.27230147 0  0.27230147 0  0.85322574 0.22262429 0  0.27230147
#0.55280532    0  0  0  0.55280532 0  0.28847675 0.55280532 0
#0 0.43877674 0.54197657 0.43877674 0  0  0.35872874 0  0.43877674
# ---------------------------可视化----------------------------
xlabels=word
ylabels=range(len(corpus))
data=tfidf.toarray().tolist()
draw_heatmap(data, xlabels, ylabels)
#------------------------------中文tf-idf-------------------------------
corpus = ["我 来到 北京 清华大学"*3,       # 第一类文本切词后的结果,词之间以空格隔开
          "他 来到 了 网易 杭研 大厦"*3,  # 第二类文本的切词结果
          "小明 硕士 毕业 与 中国 科学院"*3,  # 第三类文本的切词结果
          "我 爱 北京 天安门"*3]           # 第四类文本的切词结果
# -------------------------词频分析---------------------------
# 该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
vectorizer = CountVectorizer()
X=vectorizer.fit_transform(corpus)
word = vectorizer.get_feature_names()
print(X.toarray())
#['中国', '北京', '大厦', '天安门', '小明', '来到', '杭研', '毕业', '清华大学', '硕士', '科学院', '网易']
#[0 1 0 0 0 1 0 0 1 0 0 0]
#[0 0 1 0 0 1 1 0 0 0 0 1]
#[1 0 0 0 1 0 0 1 0 1 1 0]
#[0 1 0 1 0 0 0 0 0 0 0 0]
# ---------------------------可视化----------------------------
xlabels=word
ylabels=range(len(corpus))
data=X.toarray().tolist()
print('--------------')

print('--------------')
# --------------------------词频分析---------------------------
# 该类会统计每个词语的tf-idf权值
transformer = TfidfTransformer()
# 第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵
tfidf = transformer.fit_transform(X)
# 获取词袋模型中的所有词语
word = vectorizer.get_feature_names()
# 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
data = tfidf.toarray()
# ---------------------------可视化----------------------------
xlabels=word
ylabels=range(len(corpus))
data=tfidf.toarray().tolist()
draw_heatmap(data, xlabels, ylabels)
#['中国', '北京', '大厦', '天安门', '小明', '来到', '杭研', '毕业', '清华大学', '硕士', '科学院', '网易']
#[0.         0.52640543 0.         0.         0.         0.52640543  0.         0.         0.66767854 0.         0.         0.        ]
#[0.         0.         0.52547275 0.         0.         0.41428875 0.52547275 0.         0.         0.         0.         0.52547275]
#[0.4472136  0.         0.         0.         0.4472136  0. 0.         0.4472136  0.         0.4472136  0.4472136  0.        ]
#[0.         0.6191303  0.         0.78528828 0.         0. 0.         0.         0.         0.         0.         0.        ]
for i in range(len(data)):  # 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
    print( u"-------这里输出第", i, u"类文本的词语tf-idf权重------")
    for j in range(len(word)):
        print(word[j], data[i][j])

英文tf分析

英文idf分析

中文tf分析

中文idf分析

词频的stackflow可视化

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python与大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档