文本数据的词云可视化

1.使用python实现文本数据的词云可视化,阐述词云原理,数据源可以自行选定; 2.实现文本数据的one-hot编码、Bag-of-word模型,将过程阐述清楚,数据源可以自行选定;

 

词云可视化

随着大量的数据被产生,收集和存储,如何帮助用户理解和分析这些数据一直是一个研究热点。可视分析是一种借助交互式可视化界面对数据进行分析推理的方法。

1、何为词云?

词云又称标签云或者文字云。

标签云或文字云是关键词的视觉化描述,用于汇总用户生成的标签或一个网站的文字内容。标签一般是独立的词汇,常常按字母顺序排列,其重要程度又能通过改变字体大小或颜色来表现,所以标签云可以灵活地依照字序或热门程度来检索一个标签。大多数标签本身就是超级链接,直接指向与标签相联的一系列条目。

简而言之,就是把需要的关键词绘制成图片,通过改变字体大小或颜色来表现其重要程度。

2、词云能用来做什么?

** 数据分析是一种工具和手段,一种生产过程,那么分析结果的呈现就可以说最终的产品,也就是报告。从我们大多数人的阅读习惯来说,图像永远比文字来的更有力度。所以如何能把数据可视化呈现给读者,就是整个数据分析工作最后的,也是最重要的一环。

简而言之,字不如表,表不如图。是愿意看一堆关键词还是一目了然的云图?**

3、制作词云的步骤有哪些?

云图的制作分为:分词——统计词频——绘图

4、如何分词

** 分词就是把文章中每一句话都炸成单独的词语,分成单蹦的字就没意思了……

对于英文,分词很简单,以空格和标点进行分词就可以了**

5、如何获取专业词库?

学科专业语料库是依据某一学科或专业而建立的独具特色的专门用途语料库,其在专业词表制定、专科词典编纂以及机辅翻译等领域应用十分广泛。近年来,国内学科专业语料库呈现快速发展的趋势,数量越来越多,规模也越来越大;但同时也暴露出一系列问题,如总体发展不平衡、理论研究滞后、资源难以共享等。随着大型通用语料库建设速度放缓,规模较小的学科专业语料库将是未来语料库语言学发展的一大趋势。

使用python实现文本数据的词云可视化

pip install wordcloud

from wordcloud import WordCloud
import matplotlib.pyplot as plt
 
# 打开文件 读取
strt = open('1.txt').read()
print(strt)
 
# 生成对象
wc = WordCloud().generate(text=strt)
 
# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()
 
# # 保存文件
wc.to_file('happybirthday.png')

#wordcloud模块用于生成词云图
from wordcloud import WordCloud,ImageColorGenerator
#matplotlib是一个Python的第三方库,里面的pyplot可以用来作图
import jieba
import matplotlib.pyplot as plt
from imageio import imread

#读取一个txt文件
text = open('词云可视化.txt','r',encoding="utf-8").read()

#读入背景图片
bg_pic = imread('bg.png')
#生成词云图片
'''参数说明:
mask:设置背景图片   background_color:设置背景颜色
scale:按照比例进行放大画布,此处指长和宽都是原来画布的1.5倍
generate(text):根据文本生成词云 '''
wordcloud = WordCloud(mask=bg_pic,background_color='white',
font_path='msyh.ttc',
scale=1.5).generate(text)

%matplotlib inline 
#产生背景图片,基于彩色图像的颜色生成器
image_colors = ImageColorGenerator(bg_pic)
#绘制词云图片
plt.imshow(wordcloud)
#显示图片时不显示坐标尺寸
plt.axis('off')
#显示词云图片
plt.show()
#保存图片
wordcloud.to_file('词云可视化.jpg')

​​​​​​​

 

利用python实现文本数据的one-hot编码、Bag-of-word模型 

1、onehot编码的优势

onehot独热编码(是因为大部分算法是基于向量空间中的度量来进行计算的,为了使非偏序关系的变量取值不具有偏序性,并且到原点是等距的。使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理。离散特征进行one-hot编码后,编码后的特征,其实每一维度的特征都可以看做是连续的特征。就可以跟对连续型特征的归一化方法一样,对每一维特征进行归一化。比如归一化到[-1,1]或归一化到均值为0,方差为1。

再贴出某位大佬的解释:使用one-hot的直接原因是现在多分类cnn网络的输出通常是softmax层,而它的输出是一个概率分布,从而要求输入的标签也以概率分布的形式出现,进而计算交叉熵之类。one-hot其实就是给出了真实样本的真实概率分布,其中一个样本数据概率为1,其他全为0.。计算损失交叉熵时,直接用1*log(1/概率),就直接算出了交叉熵,作为损失。

为什么特征向量要映射到欧式空间?

将离散特征通过one-hot编码映射到欧式空间,是因为,在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。

使用onehot编码可以解决分类问题中的标签之间的距离问题。举个例子,假设有三个完全独立的类别,比如:胡桃:1,刻晴:2,心海:3。如果我们只赋予他们这种数值的标签,那么将导致胡桃与刻晴之间的距离<胡桃到心海之间的距离,这是有问题的,另外如果我们平均两个分类为1和3的模型,最后得到的结果却是刻晴,这也是有问题的,平均的结果应该是胡桃与心海五五开。这时我们使用onehot编码就不会出现这种问题,例如:胡桃:(1,0,0),刻晴:(0,1,0),心海:(0,0,1),这样他们三者彼此到彼此的距离都是一致的,而且这种onehot编码也更适宜于交叉熵损失函数。

2、onehot编码的缺陷

(1)忽略了真实数据之间的相关性

onehot编码的一个缺陷就是,它使得标签中的所有类别彼此之间距离或相似度都是一致的,因此,在自然语言处理中,我们还要把单词做一下word2vec做一下编码,使得语义相近的词,他们的编码向量也比较一致。在视觉模型分类中,一般使用onehot即可,因为我们的类别数不会像单词那么多。

(2)类别数量很多时,onehot向量会过长

当类别的数量很多时,特征空间会变得非常大,成为一个高维稀疏矩阵。在这种情况下,一般可以用PCA来减少维度。而且one hot encoding+PCA这种组合在实际中也非常有用。

单词编码,在该实验中,我们用2行文字进行实验,也可以选用文章

import numpy as np

samples = ['Today is Friday it is Sunny',
       'and yesterday is Thursday it was cloudy']  # 初始数据,本例中是一个句子,当然也可以是一篇文章

token_index = {}   # 构建数据中所有标记的索引
for sample in samples:
    for word in sample.split():   # 用split方法对样本进行分词,实际应用中,可能还需要考虑到标点符号
        if word not in token_index:

            token_index[word] = len(token_index) + 1  #为每个唯一单词指定唯一索引,注意我们没有为索引编号0指定单词

max_length = 10  # 对样本进行分词,只考虑样本前max_length单词

results = np.zeros((len(samples), max_length, max(token_index.values()) + 1))    # 将结果保存到results中
for i, sample in enumerate(samples):
    for j, word in list(enumerate(sample.split()))[:max_length]:
        index = token_index.get(word)
        results[i, j, index] = 1.

print(token_index)#输出纵向的单词字典
print(results) #输出两行文字的单词分布情况
print(results.shape)#输出矩阵的规模,可以从结果看出输出了2个矩阵,纵向10行,横向11行,纵向代表单词,横向代表第i元素时,该单词是否出现,出现则设置为“1”,否则为“0”
{'Today': 1, 'is': 2, 'Friday': 3, 'it': 4, 'Sunny': 5, 'and': 6, 'yesterday': 7, 'Thursday': 8, 'was': 9, 'cloudy': 10}
[[[0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
  [0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

 [[0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
  [0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
  [0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
  [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]]
(2, 10, 11)

字符编码,和单词编码的方式相似,使用ASCII字符的方式进行

import string

samples = ['The cat sat on the mat.', 'The dog ate my homework.']
characters = string.printable   # 所有可打印的ASCII字符
token_index = dict(zip(characters, range(1, len(characters) + 1)))

max_length = 50
results = np.zeros((len(samples), max_length, max(token_index.values()) + 1))
for i, sample in enumerate(samples):
    for j, character in enumerate(sample[:max_length]):
        index = token_index.get(character)
        results[i, j, index] = 1.

print(token_index)
print(results) 
print(results.shape)
{'0': 1, '1': 2, '2': 3, '3': 4, '4': 5, '5': 6, '6': 7, '7': 8, '8': 9, '9': 10, 'a': 11, 'b': 12, 'c': 13, 'd': 14, 'e': 15, 'f': 16, 'g': 17, 'h': 18, 'i': 19, 'j': 20, 'k': 21, 'l': 22, 'm': 23, 'n': 24, 'o': 25, 'p': 26, 'q': 27, 'r': 28, 's': 29, 't': 30, 'u': 31, 'v': 32, 'w': 33, 'x': 34, 'y': 35, 'z': 36, 'A': 37, 'B': 38, 'C': 39, 'D': 40, 'E': 41, 'F': 42, 'G': 43, 'H': 44, 'I': 45, 'J': 46, 'K': 47, 'L': 48, 'M': 49, 'N': 50, 'O': 51, 'P': 52, 'Q': 53, 'R': 54, 'S': 55, 'T': 56, 'U': 57, 'V': 58, 'W': 59, 'X': 60, 'Y': 61, 'Z': 62, '!': 63, '"': 64, '#': 65, '$': 66, '%': 67, '&': 68, "'": 69, '(': 70, ')': 71, '*': 72, '+': 73, ',': 74, '-': 75, '.': 76, '/': 77, ':': 78, ';': 79, '<': 80, '=': 81, '>': 82, '?': 83, '@': 84, '[': 85, '\\': 86, ']': 87, '^': 88, '_': 89, '`': 90, '{': 91, '|': 92, '}': 93, '~': 94, ' ': 95, '\t': 96, '\n': 97, '\r': 98, '\x0b': 99, '\x0c': 100}
[[[0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  ...
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]]

 [[0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  ...
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]]]
(2, 50, 101)

Bag-of-word模型

如下图所示,bag-of-word即将text即文本表述按单词拆分,组成词典,然后将文本描述按词按是否在词典出现进行编码,组成词语向量。图中’she loves pizza is … are the best’即是词典,下方的编码即某一描述的词向量编码。 在这里插入图片描述

基于keras Tokenizer实现

pip install keras
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting keras
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/f9/4d/dc255a437c9616b155e5bd55e325e092b7cdcb4652361d733ae051d40853/keras-2.10.0-py2.py3-none-any.whl (1.7 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7/1.7 MB 2.5 MB/s eta 0:00:0000:0100:01
Installing collected packages: keras
Successfully installed keras-2.10.0

[notice] A new release of pip available: 22.1.2 -> 22.3
[notice] To update, run: pip install --upgrade pip
Note: you may need to restart the kernel to use updated packages.

pip install tensorflow

from keras.preprocessing.text import Tokenizer
 
text = [
  'There was a man',
  'The man had a dog',
  'The dog and the man walked',
]
#using tokenizer 
model = Tokenizer()
model.fit_on_texts(text)
 
#print keys 
print(model.word_index.keys())
 
#create bag of words representation 
rep = model.texts_to_matrix(text, mode='count')
print(rep)

vector= model.texts_to_sequences(text)
print(vector)

 其中texts_to_matrix后的mode参数为count表示统计出的是词频向量,并没有把文本转成需要的向量表示,所以科学使用Tokenizer的方法是,首先用Tokenizer的 fit_on_texts 方法学习出文本的字典,然后word_index 就是对应的单词和数字的映射关系dict,通过这个dict可以将每个string的每个词转成数字,可以用texts_to_sequences,这是我们需要的,然后通过padding的方法补成同样长度,再用keras中自带的embedding层进行向量化。

dict_keys(['man', 'the', 'a', 'dog', 'there', 'was', 'had', 'and', 'walked'])#单词字典
[[0. 1. 0. 1. 0. 1. 1. 0. 0. 0.]#矩阵,每一行文字每个单词出现的次数
 [0. 1. 1. 1. 1. 0. 0. 1. 0. 0.]
 [0. 1. 2. 0. 1. 0. 0. 0. 1. 1.]]
[[5, 6, 3, 1], [2, 1, 7, 3, 4], [2, 4, 8, 2, 1, 9]]#词典xiang
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jus sing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值