1. 基于词袋模型(Bag of Words)
方法:
-
将文本表示为词频向量(如TF-IDF),通过余弦相似度计算相似性。
-
优点:简单快速,适合短文本或主题明显的场景。
-
缺点:忽略词序和语义信息。
实现步骤:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
texts = ["文章1内容", "文章2内容", "文章3内容"]
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(texts)
similarity = cosine_similarity(tfidf_matrix[0], tfidf_matrix[1])
print(similarity[0][0]) # 输出两篇文章的相似度
2. 基于词向量(Word Embedding)
方法:
-
使用预训练的词向量(如Word2Vec、GloVe)表示文本,通过词向量平均或加权平均(如TF-IDF权重)生成文本向量,再计算相似度。
-
优点:捕捉词汇语义。
-
缺点:无法处理词序和复杂语义。
实现步骤:
import numpy as np
from gensim.models import KeyedVectors
# 加载预训练词向量(示例)
model = KeyedVectors.load_word2vec_format("word2vec.bin", binary=True)
def text_to_vector(text):
words = text.split()
vectors = [model[word] for word in words if word in model]
return np.mean(vectors, axis=0) if vectors else np.zeros(model.vector_size)
vec1 = text_to_vector("文章1内容")
vec2 = text_to_vector("文章2内容")
similarity = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
print(similarity)
3. 基于句向量(Sentence Embedding)
方法:
-
使用预训练模型(如BERT、Sentence-BERT)直接生成句向量,计算余弦相似度。
-
优点:捕捉上下文和深层语义。
-
缺点:计算成本较高。
实现步骤(使用Sentence-BERT):
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
sentences = ["文章1内容", "文章2内容"]
embeddings = model.encode(sentences)
similarity = cosine_similarity([embeddings[0]], [embeddings[1]])[0][0]
print(similarity)
4. 基于文本匹配模型
方法:
-
使用深度学习模型(如Siamese Network、BERT)直接输出相似度分数。
-
优点:端到端建模,精度高。
-
缺点:需要训练数据,计算资源要求高。
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
text1 = "文章1内容"
text2 = "文章2内容"
inputs = tokenizer(text1, text2, return_tensors="pt", padding=True, truncation=True)
outputs = model(**inputs)
similarity = torch.sigmoid(outputs.logits).item() # 假设模型输出为相似度概率
print(similarity)
5. 其他方法
-
Jaccard相似度:基于词集合的重合度。
-
BM25:基于词频和文档长度的改进相似度算法(常用于搜索引擎)。
-
主题模型(LDA):通过主题分布计算相似度。
选择建议:
-
简单场景:TF-IDF + 余弦相似度。
-
语义相似度:Sentence-BERT或BERT。
-
大规模应用:BM25或Faiss加速向量检索。
注意事项:
-
预处理文本(分词、去停用词、标准化)。
-
长文本需分段或截断处理。
-
多语言场景需选择对应预训练模型。