如何计算出文本数据的相似矩阵?

栏目: IT技术 · 发布时间: 4年前

内容简介:今天要计算texts中两两文本计算相似性,生成texts对应的相似矩阵。我们需要先将text转为为向量,texts转化后就是文档-词频矩阵。现在有texts,希望将其变成文档词频矩阵,已知有scikit-learn机器学习库可以将英文语料转化为文档词频矩阵。但并不能直接使用scikit-learn,我们一定要先将中文转为成

今天要计算texts中两两文本计算相似性,生成texts对应的相似矩阵。我们需要先将text转为为向量,texts转化后就是文档-词频矩阵。

texts = ['吃着火锅唱着歌,突然失业了怎么办?',
        '北京今年高考外语口试取消!外语口试费用将全额退还',
        '北京取消外语口试到底怎么回事?',
        '最新:今年北京市统一高考外语口试不再举行',
        '北京市取消2020年高考外语口试',
        '先上岗、再考证!2020年上半年中小学教师资格考试推迟',
        '上万个公司都在用的机器学习服务SageMaker,AWS宣布要在中国推出了']


texts
['吃着火锅唱着歌,突然失业了怎么办?',
 '北京今年高考外语口试取消!外语口试费用将全额退还',
 '北京取消外语口试到底怎么回事?',
 '最新:今年北京市统一高考外语口试不再举行',
 '北京市取消2020年高考外语口试',
 '先上岗、再考证!2020年上半年中小学教师资格考试推迟',
 '上万个公司都在用的机器学习服务SageMaker,AWS宣布要在中国推出了']

中文语料准备

现在有texts,希望将其变成文档词频矩阵,已知有scikit-learn机器学习库可以将英文语料转化为文档词频矩阵。

但并不能直接使用scikit-learn,我们一定要先将中文转为成 类英文形态 ,即词语之间用空格间隔。

转化代码如下

import jieba

corpus = [' '.join(jieba.lcut(text)) 
          for text in texts]


corpus
Building prefix dict from the default dictionary ...
Dumping model to file cache /var/folders/sc/3mnt5tgs419_hk7s16gq61p80000gn/T/jieba.cache
Loading model cost 0.768 seconds.
Prefix dict has been built successfully.





['吃 着 火锅 唱着歌 , 突然 失业 了 怎么办 ?',
 '北京 今年 高考 外语 口试 取消 ! 外语 口试 费用 将 全额 退还',
 '北京 取消 外语 口试 到底 怎么回事 ?',
 '最新 :今年 北京市 统一 高考 外语 口试 不再 举行',
 '北京市 取消 2020 年 高考 外语 口试',
 '先 上岗 、 再 考证 !2020 年 上半年 中小学 教师资格 考试 推迟',
 '上万个 公司 都 在 用 的 机器 学习 服务 SageMaker , AWS 宣布 要 在 中国 推出 了']

生成文档词频矩阵

有了符合scikit-learn输入要求的数据格式,我们就可以很方便的将语料数据转化为中文文档词频矩阵(doc-term-matrix)。

有两种统计词频的方法

  • TfidfVectorizer

  • CountVectorizer

一般情况下用TfidfVectorizer,关于两者区别大家有精力去看一下这篇

如何从文本中提取特征信息?

from sklearn.feature_extraction.text import TfidfVectorizer

tfidf = TfidfVectorizer()
#dtm(doc-term-matrix)
dtm = tfidf.fit_transform(corpus)
dtm
<7x39 sparse matrix of type '<class 'numpy.float64'>'
	with 53 stored elements in Compressed Sparse Row format>

dtm是一个形状为 7*39 矩阵

  • 7  文档数(文本数)

  • 39 词语数(语料中涉及到的词语数)

这里我们看一下tfidf一共发现了39个词,分别是

feature_words = tfidf.get_feature_names()
print(feature_words)
['2020', 'aws', 'sagemaker', '上万个', '上半年', '上岗', '不再', '中国', '中小学', '举行', '今年', '全额', '公司', '到底', '北京', '北京市', '取消', '口试', '唱着歌', '外语', '失业', '学习', '宣布', '怎么办', '怎么回事', '推出', '推迟', '教师资格', '最新', '服务', '机器', '火锅', '突然', '统一', '考证', '考试', '费用', '退还', '高考']

计算文本相似矩阵

现在已经可以确定,我们已经拥有了文档-词频矩阵,

from sklearn.metrics.pairwise import cosine_similarity, pairwise_distances

接下来我们要计算出 7*7 文档相似矩阵(这里我们的测试文本有7条)。

from sklearn.metrics.pairwise import cosine_similarity, pairwise_distances

cos_sim_matrix = cosine_similarity(dtm)

#相似矩阵形状
print(cos_sim_matrix.shape)
print()
print(cos_sim_matrix)
(7, 7)

[[1.         0.         0.         0.         0.         0.
  0.        ]
 [0.         1.         0.4698711  0.362457   0.49069644 0.
  0.        ]
 [0.         0.4698711  1.         0.14816366 0.35816398 0.
  0.        ]
 [0.         0.362457   0.14816366 1.         0.42708997 0.
  0.        ]
 [0.         0.49069644 0.35816398 0.42708997 1.         0.14014411
  0.        ]
 [0.         0.         0.         0.         0.14014411 1.
  0.        ]
 [0.         0.         0.         0.         0.         0.
  1.        ]]
pairwise_sim_matrix = pairwise_distances(dtm)

print(pairwise_sim_matrix.shape)
print()
print(pairwise_sim_matrix)
(7, 7)

[[0.         1.41421356 1.41421356 1.41421356 1.41421356 1.41421356
  1.41421356]
 [1.41421356 0.         1.02968821 1.12919706 1.00926068 1.41421356
  1.41421356]
 [1.41421356 1.02968821 0.         1.30524813 1.13299252 1.41421356
  1.41421356]
 [1.41421356 1.12919706 1.30524813 0.         1.07042985 1.41421356
  1.41421356]
 [1.41421356 1.00926068 1.13299252 1.07042985 0.         1.31137782
  1.41421356]
 [1.41421356 1.41421356 1.41421356 1.41421356 1.31137782 0.
  1.41421356]
 [1.41421356 1.41421356 1.41421356 1.41421356 1.41421356 1.41421356
  0.        ]]

pairwise_distances方法是 cosine_similarity减1后取绝对值得到的。

将相似矩阵存到txt中

计算得到的cos_sim_matrix和pairwise_sim_matrix是numpy中的array数据类型,可以使用numpy.savetxt函数将矩阵信息存储到txt中。

当然到这一步,也可以想办法存到别的文件格式中

import numpy as np

np.savetxt('cos_sim_matrix.txt', cos_sim_matrix)
np.savetxt('pairwise_sim_matrix.txt', pairwise_sim_matrix)

读取txt中的相似矩阵

如果后续需要在 python 中分析,可能需要用到数据读取。

import numpy as np

matrix = np.loadtxt('cos_sim_matrix.txt')
matrix
array([[1.        , 0.        , 0.        , 0.        , 0.        ,
        0.        , 0.        ],
       [0.        , 1.        , 0.4698711 , 0.362457  , 0.49069644,
        0.        , 0.        ],
       [0.        , 0.4698711 , 1.        , 0.14816366, 0.35816398,
        0.        , 0.        ],
       [0.        , 0.362457  , 0.14816366, 1.        , 0.42708997,
        0.        , 0.        ],
       [0.        , 0.49069644, 0.35816398, 0.42708997, 1.        ,
        0.14014411, 0.        ],
       [0.        , 0.        , 0.        , 0.        , 0.14014411,
        1.        , 0.        ],
       [0.        , 0.        , 0.        , 0.        , 0.        ,
        0.        , 1.        ]])

公众号后台回复关键词 相似矩阵 , 可 获得该数据集

往期文章

中文文本分析相关资源汇总

cnsenti中文情绪情感分析库

70G上市公司定期报告数据集

两行代码读取pdf、docx文件

三行代码计算文本相似性

5个小问题带你理解列表推导式

文本数据清洗之正则表达式

Python网络爬虫与文本数据分析

综述:文本分析在市场营销研究中的应用

LabelStudio多媒体数据标注工具[5星推荐]

如何批量下载上海证券交易所上市公司年报

Loughran&McDonald金融文本情感分析库

如何使用Python快速构建领域内情感词典

Python数据分析相关学习资源汇总帖

漂亮~pandas可以无缝衔接Bokeh

YelpDaset: 酒店管理类数据集10+G

看在这么多数据面子上,给我点好看可好❤


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

码农翻身

码农翻身

刘欣 / 电子工业出版社 / 2018-6-1 / 69.00元

《码农翻身》用故事的方式讲解了软件编程的若干重要领域,侧重于基础性、原理性的知识。 《码农翻身》分为6章。第1章讲述计算机的基础知识;第2章侧重讲解Java的基础知识;第3章偏重Web后端编程;第4章讲解代码管理的本质;第5章讲述了JavaScript的历史、Node.js的原理、程序的链接、命令式和声明式编程的区别,以及作者十多年来使用各种编程语言的感受;第6章是作者的经验总结和心得体会,......一起来看看 《码农翻身》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具