NLP(九) 文本相似度问题
原文链接:http://www.one2know.cn/nlp9/
- 多个维度判别文本之间相似度
- 情感维度 Sentiment/Emotion
- 感官维度 Sense
- 特定词的出现
- 词频 TF
逆文本频率 IDF
构建N个M维向量,N是文档总数,M是所有文档的去重词汇量 - 余弦相似度:
A,B分别是两个词的向量
import nltk
import math
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
class TextSimilarityExample:
def __init__(self):
self.statements = [ # 例句
'ruled india',
'Chalukyas ruled Badami',
'So many kingdoms ruled India',
'Lalbagh is a botanical garden in India',
]
def TF(self,sentence):
words = nltk.word_tokenize(sentence.lower()) # 分词,都化成小写
freq = nltk.FreqDist(words) # 计算词频分布,词和词频组成的字典
dictionary = {}
for key in freq.keys():
norm = freq[key] / float(len(words)) # 把词频正则化
dictionary[key] = norm
return dictionary # 返回 词:词频
def IDF(self):
def idf(TotalNumberOfDocuments,NumberOfDocumentsWithThisWord):
return 1.0 + math.log(TotalNumberOfDocuments/NumberOfDocumentsWithThisWord)
# idf = 1 + log(总文件数/含该词的文件数)
numDocuments = len(self.statements) # 总文档数
uniqueWords = {} # 不重复的 字典
idfValues = {} # 词:IDF 字典
for sentence in self.statements: # 得到每个句子的 词:含该词文章数量 字典
for word in nltk.word_tokenize(sentence.lower()):
if word not in uniqueWords:
uniqueWords[word] = 1
else:
uniqueWords[word] += 1
for word in uniqueWords: # 词:含该词文章数量 字典 => 词:IDF 字典
idfValues[word] = idf(numDocuments,uniqueWords[word])
return idfValues
def TF_IDF(self,query): # 返回每句话的向量
words = nltk.word_tokenize(query.lower())
idf = self.IDF() # IDF 由所有文档求出
vectors = {}
for sentence in self.statements: # 遍历所有句子
tf = self.TF(sentence) # TF 由单个句子得出
for word in words:
tfv = tf[word] if word in tf else 0.0
idfv = idf[word] if word in idf else 0.0
mul = tfv * idfv
if word not in vectors:
vectors[word] = []
vectors[word].append(mul) # 字典里添加元素7
return vectors
def displayVectors(self,vectors): # 显示向量内容
print(self.statements)
for word in vectors:
print("{} -> {}".format(word,vectors[word]))
def cosineSimilarity(self):
vec = TfidfVectorizer() # 创建新的向量对象
matrix = vec.fit_transform(self.statements) # 计算所有文本的TF-IDF值矩阵
for j in range(1,5):
i = j - 1
print("\tsimilarity of document {} with others".format(j))
similarity = cosine_similarity(matrix[i:j],matrix) # scikit库的余弦相似度函数
print(similarity)
def demo(self):
inputQuery = self.statements[0] # 第一个句子作为输入查询
vectors = self.TF_IDF(inputQuery) # 建立第一句的向量
self.displayVectors(vectors) # 屏幕上显示所有句子的TF×IDF向量
self.cosineSimilarity() # 计算输入句子与所有句子的余弦相似度
if __name__ == "__main__":
similarity = TextSimilarityExample()
similarity.demo()
输出:
['ruled india', 'Chalukyas ruled Badami', 'So many kingdoms ruled India', 'Lalbagh is a botanical garden in India']
ruled -> [0.6438410362258904, 0.42922735748392693, 0.2575364144903562, 0.0]
india -> [0.6438410362258904, 0.0, 0.2575364144903562, 0.18395458177882582]
similarity of document 1 with others
[[1. 0.29088811 0.46216171 0.19409143]]
similarity of document 2 with others
[[0.29088811 1. 0.13443735 0. ]]
similarity of document 3 with others
[[0.46216171 0.13443735 1. 0.08970163]]
similarity of document 4 with others
[[0.19409143 0. 0.08970163 1. ]]
NLP(九) 文本相似度问题的更多相关文章
- NLP点滴——文本相似度
[TOC] 前言 在自然语言处理过程中,经常会涉及到如何度量两个文本之间的相似性,我们都知道文本是一种高维的语义空间,如何对其进行抽象分解,从而能够站在数学角度去量化其相似性.而有了文本之间相似性的度 ...
- 【NLP】文本相似度
http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html
- 从0到1,了解NLP中的文本相似度
本文由云+社区发表 作者:netkiddy 导语 AI在2018年应该是互联网界最火的名词,没有之一.时间来到了9102年,也是项目相关,涉及到了一些AI写作相关的功能,为客户生成一些素材文章.但是, ...
- NLP文本相似度
NLP文本相似度 相似度 相似度度量:计算个体间相似程度 相似度值越小,距离越大,相似度值越大,距离越小 最常用--余弦相似度: 一个向量空间中两个向量夹角的余弦值作为衡量两个个体之间差异的大小 余 ...
- 【NLP】Python实例:基于文本相似度对申报项目进行查重设计
Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起 ...
- NLP文本相似度(TF-IDF)
本篇博文是数据挖掘部分的首篇,思路主要是先聊聊相似度的理论部分,下一篇是代码实战. 我们在比较事物时,往往会用到“不同”,“一样”,“相似”等词语,这些词语背后都涉及到一个动作——双方的比 ...
- Finding Similar Items 文本相似度计算的算法——机器学习、词向量空间cosine、NLTK、diff、Levenshtein距离
http://infolab.stanford.edu/~ullman/mmds/ch3.pdf 汇总于此 还有这本书 http://www-nlp.stanford.edu/IR-book/ 里面有 ...
- TF-IDF 文本相似度分析
前阵子做了一些IT opreation analysis的research,从产线上取了一些J2EE server运行状态的数据(CPU,Menory...),打算通过训练JVM的数据来建立分类模型, ...
- 文本相似度算法——空间向量模型的余弦算法和TF-IDF
1.信息检索中的重要发明TF-IDF TF-IDF是一种统计方法,TF-IDF的主要思想是,如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分 ...
- 【机器学习】使用gensim 的 doc2vec 实现文本相似度检测
环境 Python3, gensim,jieba,numpy ,pandas 原理:文章转成向量,然后在计算两个向量的余弦值. Gensim gensim是一个python的自然语言处理库,能够将文档 ...
随机推荐
- python模块知识二 random -- 随机模块、序列化 、os模块、sys -- 系统模块
4.random -- 随机模块 a-z:97 ~ 122 A-Z :65 ~ 90 import random #浮点数 print(random.random())#0~1,不可指定 print( ...
- win7 磁盘碎片整理
最近每天早上开机,都出现开机正常,但是所有软件都没法点开,性能特别差: 咨询了运维小伙伴,提示可以整理下电脑磁盘碎片试试.那么如何整理呢,如下详细说明 1.先整理C盘,打开我的电脑,在C盘上,右击-- ...
- IDEA自定义配置
目录 1 常规设置 1 修改字体大小 2 创建文件时 增加注释信息 3 项目编码为UTF-8 4 properties 文件编码为UTF-8且Transparent native-to-ascii c ...
- 续集:白菜的内涵,更新nand分区为ubifs,替换overlay
在上一篇真千兆路由的极限之OPENWRT MAKE, 某品牌白菜价QCA9558/QCA9880/QCA8337N纯种组合OS搭建时记中附带了128M nand的空间图示,在ar71xx profil ...
- 破解EFCore扩展Dll --- Z.EntityFramework.Extensions.EFCore
安装 Z.EntityFramework.Extensions.EFCore Install-Package Z.EntityFramework.Extensions.EFCore -Version ...
- 记录用友T+接口对接的心酸历程
前言:公司的业务主要是对接财务系统做单据传输或者凭证处理的,难免少不了和各大财务软件做数据对接,其中当然是必须通过接口来传递数据了.于是乎,用友T+的版本来了,对接的工作自然是我来做,可没想到就是这样 ...
- Unity经典游戏教程之:合金弹头
版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...
- xpath定位的一些方法
- viewpager_轮播
public class MainActivity extends Activity { private ViewPager pager; private int[] id={R.layout.lay ...
- .Net Core2.1 秒杀项目一步步实现CI/CD(Centos7.2)系列一:k8s高可用集群搭建总结以及部署API到k8s
前言:本系列博客又更新了,是博主研究很长时间,亲自动手实践过后的心得,k8s集群是购买了5台阿里云服务器部署的,这个集群差不多搞了一周时间,关于k8s的知识点,我也是刚入门,这方面的知识建议参考博客园 ...