Python中通用的文本相似度计算方法详解

 更新时间:2024年04月20日 11:47:05   作者:素素.陈  
这篇文章主要为大家详细介绍了三种Python中通用的文本相似度计算方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

一、最长公共子序列

最长公共子序列(Longest Common Subsequence,LCS)是指两个或多个序列中共同出现的一段连续序列,它在多个序列中都保持相同的顺序和连续性。在计算机科学中,寻找最长公共子序列是一个经典问题,通常通过动态规划算法解决。
动态规划算法解决最长公共子序列问题的步骤如下:

初始化状态数组:创建一个二维数组dp,其大小为(m+1)×(n+1),其中m和n分别是两个序列的长度。dp[i][j]表示序列1的前i个字符与序列2的前j个字符的最长公共子序列的长度。

填充状态数组:遍历两个序列,对于每一对字符,如果它们相同,则dp[i][j] = dp[i-1][j-1] + 1;如果不同,则dp[i][j] = max(dp[i-1][j], dp[i][j-1])。

找到最长公共子序列:dp数组的最后一个元素dp[m][n]就是两个序列的最长公共子序列的长度。可以通过回溯的方式找到具体的子序列。

python代码如下:

## 最长公共子序列计算最长公共子串-------------------
def LCS(str_a, str_b):
	if len(str_a) == 0 or len(str_b) == 0:
		return 0
	dp = [0 for _ in range(len(str_b) + 1)]
	for i in range(1, len(str_a) + 1):
		left_up = 0
		dp[0] = 0
		for j in range(1, len(str_b) + 1):
			left = dp[j-1]
			up = dp[j]
			if str_a[i-1] == str_b[j-1]:
				dp[j] = left_up + 1
			else:
				dp[j] = max([left, up])
			left_up = up
	return dp[len(str_b)]

#转换最长公共子序列为0-1之间的数值,结果越接近1,相似度越大
def LCS_Score(str_a, str_b):
	return np.round(LCS(str_a, str_b)*2/(len(str_a)+len(str_b)),2)

#LCS_Score(str_a, str_b)    


## 对dataframe的2列按照最长公共子序列计算相似度
## df: 数据来源变量
## col_name1、col_name2:用于计算相似度的2个列名
## simarity_score_name: 返回的相似度结果的列名
## 返回数据框,则simarity_score_name是用该计算方法对2列文本相似度的计算结果
def df_simarity_lcs(df , col_name1 , col_name2 , simarity_score_name):
    df[simarity_score_name] = list(map(lambda str_a, str_b:LCS_Score(str_a, str_b),df[col_name1],df[col_name2]))
    return df

二、Jaccard相似度(Jaccard Similarity)

基于集合的交集与并集的比值来计算相似度。

适用于短文本或关键词列表的比较。

## 采用集合的方法计算2个集合的相似度
def similarity(a, b):
    try:
        return len(a & b) / len(a | b)
    except ZeroDivisionError:
        return -1e-4

## 采用集合的方法计算一个数据框中2个列的文本相似度
## df: 数据来源变量
## col_name1、col_name2:用于计算相似度的2个列名
## simarity_score_name: 返回的相似度结果的列名
## 返回数据框,则simarity_score_name是用该计算方法对2列文本相似度的计算结果
#对dataframe的2列按照集合的方法计算相似度          
def df_simarity_jh(df , col_name1 , col_name2 , simarity_score_name):
    df[simarity_score_name] = list(map(lambda str_a, str_b:similarity(set(str_a), set(str_b)),df[col_name1],df[col_name2]))
    return df 

三、余弦相似度(Cosine Similarity)

通过计算两个文本向量在空间中的夹角余弦值来评估它们的相似度。

通常与词袋模型(BOW)或TF-IDF结合使用。

## vec1, vec2:待计算的向量
## 返回2个向量的相似度
def cosine_simi(vec1, vec2):
    from scipy import spatial
    return 1 - spatial.distance.cosine(vec1, vec2)

## 对dataframe的2列按照最长公共子序列计算相似度
## df: 数据来源变量
## col_name1、col_name2:用于计算相似度的2个列名
## simarity_score_name: 返回的相似度结果的列名
## 返回数据框,则simarity_score_name是用该计算方法对2列文本相似度的计算结果 
def df_simarity_cosine(df , col_name1 , col_name2 , simarity_score_name):
    df[simarity_score_name] = list(map(lambda str_a, str_b:cosine_simi(str_a, str_b),df[col_name1],df[col_name2]))
    return df

四、方法补充

除了上文的方法,小编还为大家整理了一些其他Python文件相似度计算的方法,希望对大家有所帮助

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)

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)

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)

这些方法可以根据具体需求进行选择和组合,为自然语言处理任务提供强大的文本相似度计算能力。在实际应用中,可能会遇到多种场景,例如推荐系统、自动问答和文本聚类等。在这些场景中,选择合适的文本相似度计算方法至关重要。

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)

到此这篇关于Python中通用的文本相似度计算方法详解的文章就介绍到这了,更多相关Python文本相似度计算内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python报错ValueError: cannot convert float NaN to integer的解决方法

    Python报错ValueError: cannot convert float NaN to intege

    在Python编程中,我们经常需要处理各种数据类型,包括浮点数和整数,然而,有时候我们可能会遇到一些意外的情况,比如将一个包含NaN(Not a Number)的浮点数转换为整数时,就会抛出错误,本文将探讨这个错误的原因,并给出几种可能的解决方案,需要的朋友可以参考下
    2024-09-09
  • python内置模块collections知识点总结

    python内置模块collections知识点总结

    这篇文章主要介绍了python内置模块collections知识点总结,有兴趣的朋友们学习下。
    2019-12-12
  • python基于opencv 实现图像时钟

    python基于opencv 实现图像时钟

    这篇文章主要介绍了python基于opencv 实现图像时钟的方法,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2021-01-01
  • Python threading多线程编程实例

    Python threading多线程编程实例

    这篇文章主要介绍了Python threading多线程编程实例,本文讲解了使用函数和线程类实现多线程编程的例子,需要的朋友可以参考下
    2014-09-09
  • Pytorch 搭建分类回归神经网络并用GPU进行加速的例子

    Pytorch 搭建分类回归神经网络并用GPU进行加速的例子

    今天小编就为大家分享一篇Pytorch 搭建分类回归神经网络并用GPU进行加速的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python中的Nonetype类型怎么判断

    Python中的Nonetype类型怎么判断

    这篇文章主要介绍了Python中的Nonetype类型怎么判断?具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python multiprocessing.Manager介绍和实例(进程间共享数据)

    Python multiprocessing.Manager介绍和实例(进程间共享数据)

    这篇文章主要介绍了Python multiprocessing.Manager介绍和实例(进程间共享数据),本文介绍了Manager的dict、list使用例子,同时介绍了namespace对象,需要的朋友可以参考下
    2014-11-11
  • 基于Python实现二维图像双线性插值

    基于Python实现二维图像双线性插值

    双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。本文将用Python实现二维图像双线性插值,感兴趣的可以了解下
    2022-06-06
  • Python如何爬取b站热门视频并导入Excel

    Python如何爬取b站热门视频并导入Excel

    这篇文章主要介绍了Python如何爬取b站热门视频并导入Excel,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Python如何将将模块分割成多个文件

    Python如何将将模块分割成多个文件

    这篇文章主要介绍了Python如何将将模块分割成多个文件,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08

最新评论