共计 4050 个字符,预计需要花费 11 分钟才能阅读完成。
在自然语言解决(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。在理论利用中,能够依据工作需要和数据特点抉择适合的类似度计算方法,为解决理论问题提供反对。