Python中的文本相似度的计算方法总结
作者:小小张说故事 发布时间:2021-02-08 08:40:37
在自然语言处理(NLP)领域,文本相似度计算是一个常见的任务。本文将介绍如何使用Python计算文本之间的相似度,涵盖了余弦相似度、Jaccard相似度和编辑距离等方法。
1. 余弦相似度
余弦相似度是一种衡量两个向量夹角的方法,用于衡量文本的相似度。首先,将文本转换为词频向量,然后计算两个向量之间的余弦值。
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
def calculate_cosine_similarity(text1, text2):
vectorizer = CountVectorizer()
corpus = [text1, text2]
vectors = vectorizer.fit_transform(corpus)
similarity = cosine_similarity(vectors)
return similarity[0][1]
text1 = "I love Python programming"
text2 = "Python programming is great"
cosine_similarity = calculate_cosine_similarity(text1, text2)
print(cosine_similarity)
2. Jaccard相似度
Jaccard相似度通过计算两个集合之间的交集和并集之间的比率来衡量相似性。
def calculate_jaccard_similarity(text1, text2):
set1 = set(text1.split())
set2 = set(text2.split())
intersection = len(set1.intersection(set2))
union = len(set1.union(set2))
return intersection / union
text1 = "I love Python programming"
text2 = "Python programming is great"
jaccard_similarity = calculate_jaccard_similarity(text1, text2)
print(jaccard_similarity)
3. 编辑距离(Levenshtein距离)
编辑距离是衡量两个字符串之间差异的一种方法,即将一个字符串转换为另一个字符串所需的最小单字符编辑操作(插入、删除或替换)次数。
import numpy as np
def calculate_levenshtein_distance(text1, text2):
m, n = len(text1), len(text2)
dp = np.zeros((m + 1, n + 1))
for i in range(m + 1):
dp[i][0] = i
for j in range(n + 1):
dp[0][j] = j
for i in range(1, m + 1):
for j in range(1, n + 1):
if text1[i - 1] == text2[j - 1]:
dp[i][j] = dp[i - 1][j - 1]
else:
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1
return dp[m][n]
text1 = "I love Python programming"
text2 = "Python programming is great"
levenshtein_distance = calculate_levenshtein_distance(text1, text2)
print(levenshtein_distance)
本文介绍了Python中常见的文本相似度计算方法,包括余弦相似度、Jaccard相似度和编辑距离。在实际应用中,可以根据问题的具体需求选择合适的相似度计算方法。以下是一些其他可用于计算文本相似度的方法:
4. TF-IDF
TF-IDF是一种统计方法,用于评估单词在文档集中的重要性。它可以将文本表示为向量,进而计算余弦相似度。
from sklearn.feature_extraction.text import TfidfVectorizer
def calculate_tfidf_cosine_similarity(text1, text2):
vectorizer = TfidfVectorizer()
corpus = [text1, text2]
vectors = vectorizer.fit_transform(corpus)
similarity = cosine_similarity(vectors)
return similarity[0][1]
text1 = "I love Python programming"
text2 = "Python programming is great"
tfidf_cosine_similarity = calculate_tfidf_cosine_similarity(text1, text2)
print(tfidf_cosine_similarity)
5. Word2Vec
Word2Vec是一种将单词表示为向量的模型,可以捕捉单词之间的语义关系。使用预训练的词向量模型,可以计算文本之间的相似度。
import gensim.downloader as api
from gensim import matutils
import numpy as np
def calculate_word2vec_similarity(text1, text2):
model = api.load("word2vec-google-news-300")
tokens1 = text1.split()
tokens2 = text2.split()
vec1 = np.mean([model[token] for token in tokens1 if token in model], axis=0)
vec2 = np.mean([model[token] for token in tokens2 if token in model], axis=0)
return matutils.cosine(vec1, vec2)
text1 = "I love Python programming"
text2 = "Python programming is great"
word2vec_similarity = calculate_word2vec_similarity(text1, text2)
print(word2vec_similarity)
6. Doc2Vec
Doc2Vec是一种将文档表示为向量的模型,可以捕捉文档之间的语义关系。与Word2Vec类似,可以使用预训练的Doc2Vec模型计算文本之间的相似度。
from gensim.models import Doc2Vec
from gensim.models.doc2vec import TaggedDocument
def calculate_doc2vec_similarity(text1, text2):
corpus = [TaggedDocument(text1.split(), ["text1"]), TaggedDocument(text2.split(), ["text2"])]
model = Doc2Vec(corpus, vector_size=100, window=5, min_count=1, workers=4)
vec1 = model.docvecs["text1"]
vec2 = model.docvecs["text2"]
return matutils.cosine(vec1, vec2)
text1 = "I love Python programming"
text2 = "Python programming is great"
doc2vec_similarity = calculate_doc2vec_similarity(text1, text2)
print(doc2vec_similarity)
这些方法可以根据具体需求进行选择和组合,为自然语言处理任务提供强大的文本相似度计算能力。在实际应用中,可能会遇到多种场景,例如推荐系统、自动问答和文本聚类等。在这些场景中,选择合适的文本相似度计算方法至关重要。
7. BERT
BERT(Bidirectional Encoder Representations from Transformers)是一种基于Transformer的预训练模型,用于捕捉上下文相关的单词表示。可以通过BERT模型将文本表示为向量,然后计算余弦相似度。
from sentence_transformers import SentenceTransformer
def calculate_bert_similarity(text1, text2):
model = SentenceTransformer("bert-base-nli-mean-tokens")
embeddings = model.encode([text1, text2])
similarity = cosine_similarity(embeddings)
return similarity[0][1]
text1 = "I love Python programming"
text2 = "Python programming is great"
bert_similarity = calculate_bert_similarity(text1, text2)
print(bert_similarity)
8. 结论
文本相似度计算在自然语言处理领域具有广泛的应用。本文介绍了Python中常见的文本相似度计算方法,包括余弦相似度、Jaccard相似度、编辑距离、TF-IDF、Word2Vec、Doc2Vec和BERT。在实际应用中,可以根据任务需求和数据特点选择合适的相似度计算方法,为解决实际问题提供支持。
来源:https://juejin.cn/post/7233782463078744101
猜你喜欢
- 在ASP中加密方法有对应的解密方法好象不多,现在根据前辈资料整理出在asp中加密与解密函数,根据RSA 算法实现的。什么是RSA?
- <% String st = ""; for(int i = 1; i <= 9;
- 这个我早就改好了一直没有放上来.现在发给大家用用注意这几个变量它们影响到提示框的效果代码:var rT=true;//允许图像过渡
- 一个用asp来处理jmail发信的过程,及使用方法. 发信时,直接调用这个过程就行了,很方便。<% dim
- 1、使用 append 函数来为列表 list 添加数据,默认将数据追加在末尾。# !usr/bin/env python# -*- cod
- 最新在学习Python的基础入门系列课程,今天学习到使用python 的内置库smtplib发送邮件内容。使用Python发送邮件步骤简单:
- 在写ASP网页时常用的检测代码:服务器现在时间:<% =now %>服务器CPU型号:<%=Request.ServerV
- 今天碰到这个极度郁闷的报错,搞了大半下午,才发现是ie的问题,忍不住大骂。例子是这样的:页面中有多处能出发菜单,并且菜单出现在触发点的旁边,
- 1、给滚动条换色 好多网站的滚动条不是系统默认的灰色,而是一些红色、蓝色的,请问这是如何做的?答:这个很好实现,插入下面的代码:<&n
- 什么是Css Hack?由于不同的浏览器,比如Internet Explorer 6,Internet Explorer 7,Mozilla
- 本文介绍了目前6种比较常用的进度条,让大家都能直观地看到脚本运行最新的进展情况1.普通进度条在代码迭代运行中可以自己进行统计计算,并使用格式
- scipy.misc.logsumexp函数的输入参数有(a, axis=None, b=None, keepdims=False, ret
- 序言:刚结束公司的三个月试用期,意味着我即将正式步入社会成为广大从事IT行业的一员。作为一个编程小白,无论从技术层面还是知识层面都是比较薄弱
- 大家知道,在js里encodeURIComponent 方法是一个比较常用的编码方法,但因工作需要,在asp里需用到此方法,查了好多资料,没
- 你一定很熟悉Youtube了,知道它是一个视频分享网站。是的,youtube目前十分流行,你也许会常常访问。这里有一些关于youtube u
- Python判断变量是否已经定义是一个非常重要的功能,本文就来简述这一功能的实现方法。其实Python中有很多方法可以实现判断一个变量是否已
- 切片从list或tuple中取部分元素。list = [1, 2, 3, 4]list[0 : 3] # [1, 2, 3]list[-2
- 这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。帮助蹲厕族、YP族、饭圈女孩在
- 如果你是个赛车手,并且按一下按钮就能够立即更换引擎而不需要把车开到车库里去换,那会是什么感觉呢?MySQL数据库为开发人员所做的就好像是按按
- mysql数据库没有增量备份的机制,当数据量太大的时候备份是一个很大的问题。还好mysql数据库提供了一种主从备份的机制,其实就是把主数据库