nlp文章相似度

1. 基于词袋模型(Bag of Words)

方法
  • 将文本表示为词频向量(如TF-IDF),通过余弦相似度计算相似性。

  • 优点:简单快速,适合短文本或主题明显的场景。

  • 缺点:忽略词序和语义信息。

实现步骤
python 复制代码
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权重)生成文本向量,再计算相似度。

  • 优点:捕捉词汇语义。

  • 缺点:无法处理词序和复杂语义。

实现步骤
python 复制代码
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)
python 复制代码
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)直接输出相似度分数。

  • 优点:端到端建模,精度高。

  • 缺点:需要训练数据,计算资源要求高。

python 复制代码
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加速向量检索。


注意事项

  1. 预处理文本(分词、去停用词、标准化)。

  2. 长文本需分段或截断处理。

  3. 多语言场景需选择对应预训练模型。

相关推荐
正在走向自律9 分钟前
AI绘画:解锁商业设计新宇宙(6/10)
人工智能·ai作画·ai绘画
htuhxf24 分钟前
TfidfVectorizer
python·自然语言处理·nlp·tf-idf·文本特征
佛州小李哥32 分钟前
AI安全最佳实践:AI云原生开发安全评估矩阵(上)
人工智能·科技·安全·ai·语言模型·aws·亚马逊云科技
CS创新实验室1 小时前
《机器学习数学基础》补充资料:仿射变换
人工智能·机器学习
道友老李1 小时前
【自然语言处理(NLP)】Bahdanau 注意力(Bahdanau Attention)原理及代码实现
人工智能·自然语言处理
天一生水water2 小时前
机理模型与数据模型融合的方式
人工智能
Naion2 小时前
吴恩达深度学习——优化神经网络
人工智能·深度学习·神经网络
几道之旅2 小时前
windows下玩转vllm:vllm简介
人工智能·python
道友老李2 小时前
【自然语言处理(NLP)】生成词向量:ELMo(Embedded from Language Models)原理及应用
人工智能·自然语言处理
江瀚视野2 小时前
苹果再度砍掉AR眼镜项目?AR真的是伪风口吗?
人工智能