Advertisement

文本数据的词云可视化

阅读量:
  1. 通过Python语言实现文本数据生成可视化的词语云,并介绍其工作原理。根据需要可以选择不同的数据来源;
  2. 通过构建one-hot编码矩阵和Bag-of-words模型来处理文本数据,并详细描述其构建过程。这些技术参数的选择可以根据具体需求进行调整。

词云可视化

在数据大量生成的过程中,如何获取并存储这些信息,从而帮助人们更好地理解与分析它们,一直是一个值得深入研究的热点问题。一种基于交互式可视化界面的数据分析方法被称为可视分析技术

1、何为词云?

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

在信息组织中,标签云作为关键词的视觉化描述工具被广泛应用。它旨在汇总用户生成的关键词及网站内容,并以直观的形式呈现这些信息资源之间的关联性与分布特征。通常以独立词汇形式存在,并常按字母顺序排列。其重要性可通过调整字体大小和颜色来体现;因此,在分析时可以根据字序排列或按热门程度筛选相关关键词。其中许多链接都是超媒体超链接(Hyperlink),能够直接导向与之相关的丰富资源库。

核心观点是将需要关注的关键词以图像形式呈现,并通过调整字体大小或颜色特性来突出显示它们的重要性。

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编码的优势

由于大多数算法都是基于向量空间中的度量来进行计算的,在处理非偏序关系的变量时需要确保其取值不具备偏序性,并且能够等距地到达原点。通过使用one-hot编码的方式将离散特征的取值扩展到欧氏空间中对应的位置上,则可以使每个离散特征的具体取值都对应于该空间中的一个具体点。这种方法使得离散型特征经过one-hot编码处理后与连续型特征一样具备可比性,并且能够合理地进行距离计算。当对离散型特征进行one-hot编码后得到的新特征矩阵中每一维度都可以被看作是一个连续型特征的空间表现形式。这样一来就可以采用与连续型特征相同的归一化方法对其进行标准化处理了。比如将归一化范围设定为[-1,1]或者设定归一化后的均值为0方差为1等方法都可以被采用以达到更好的数据预处理效果

对于多分类CNN模型而言,在实际应用中通常会采用Softmax层来进行分类任务求解。由于这一层输出的结果是一个概率分布向量(即每个类别对应的概率值之和等于1),因此为了保证模型的有效性与一致性,在输入端标签数据也需要以类似的形式呈现(即标签对应的类别概率为1而其余类别为0)。这种通过one-hot编码的方式可以精确地反映样本的真实类别归属关系并有效地指导后续的学习过程。具体而言,在计算损失函数时采用交叉熵损失函数能够使得当预测的概率与真实标签完全一致时(即预测值中的目标类别对应概率为1),其损失值达到最小值(理论上为0)。这种特性使得one-hot编码成为实现分类任务的理想选择。

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

采用one-hot编码方案将离散属性转化为向量表示的原因在于,在回归、分类以及聚类等典型的机器学习算法中,特征间距离与相似度的评估对于模型性能具有重要意义。传统的距离与相似度评估方法多基于欧氏空间中的几何性质,并且余弦相似性计算则直接利用了欧氏空间中的向量夹角特性。

使用onehot编码可以帮助我们缓解分类任务中类别标签之间距离所带来的挑战。举个例子来说吧,假设我们有三个完全独立的类别。如果我们只为其分配这种数值型标签,则会遇到一个问题:例如像胡桃被标记为1, 刻晴被标记为2, 心海被标记为3这样的情况。这样做的缺点在于会导致胡桃与刻晴之间的距离小于胡桃至心海的距离(如图所示)。此外, 如果我们对这两个分类(1和3)取平均值, 最终计算得到的结果却是刻晴, 这也是值得警惕的问题。正确的平衡应该是胡桃和心海各占一半。为了避免这种情况, 我们应该采用onehot编码的方式进行表示: 胡桃会被表示成(1, 0, 0), 刻晴则表示成(0, 1, 0), 而心海则是(0, 0, 1)。这样一来每个类别与其他类别的几何距离都会保持一致,并且这种onehot编码方式更适合于交叉熵损失函数的应用场景

2、onehot编码的缺陷

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

onehot编码的一个局限性就是它会导致标签中的各类别间距离或相似度保持完全相同的状态。在自然语言处理领域中我们需要对单词进行预处理以便具有相似语义意义的词语能够拥有较为接近的编码向量。而对于视觉模型分类问题来说由于类别的数量通常较少因此通常情况下使用onehot编码即可满足需求

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

当类别数目显著多时

单词编码,在该实验中,我们用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模型

如上所示,在此插入图片描述

基于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),即对应于该词汇表中的单词都能找到其对应的唯一数字索引值;接着就可以利用这个字典将每个输入字符串中的每一个单词转化为相应的数字形式(即完成text-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)

还没有任何评论哟~