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

标签:Python,文本,相似度
0
投稿

猜你喜欢

  • 利用Python制作动态排名图的实现代码

    2022-02-04 07:40:51
  • SQL Server误设置max server memory的处理方法

    2024-01-21 14:01:22
  • SQL Server中row_number函数用法入门介绍

    2024-01-26 22:45:04
  • python利用后缀表达式实现计算器功能

    2022-08-26 03:25:35
  • 如何使用Pytorch搭建模型

    2022-07-18 10:34:27
  • 让我们一起来学习一下什么是javascript的闭包

    2024-04-17 10:11:43
  • Vue3 defineExpose要在方法声明定义以后使用的教程

    2024-05-21 10:30:03
  • 6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)

    2022-09-15 16:00:46
  • 教你使用Python画棵圣诞树完整代码

    2022-04-12 11:29:57
  • FFrpc python客户端lib使用解析

    2023-09-06 00:12:20
  • Python快速将ppt制作成配音视频课件的操作方法

    2022-05-18 04:51:17
  • 带例子详解Sql中Union和Union ALL的区别

    2024-01-23 01:45:00
  • Python实现二维曲线拟合的方法

    2021-08-26 12:38:01
  • numpy中轴处理的实现

    2021-08-14 12:06:16
  • mysql SQL语句积累

    2024-01-13 06:18:45
  • Django REST framework内置路由用法

    2022-04-06 14:22:35
  • PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)

    2024-05-03 15:13:22
  • 解决编码问题:UnicodeDecodeError: 'utf-8' codec can't decod

    2023-03-25 02:45:59
  • 关于go-zero单体服务使用泛型简化注册Handler路由的问题

    2023-08-30 20:19:08
  • 用python读写excel的方法

    2021-11-11 10:10:50
  • asp之家 网络编程 m.aspxhome.com