楼主: Liebechunchun
23 0

NLP 文本相似度计算 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

小学生

14%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
40 点
帖子
3
精华
0
在线时间
0 小时
注册时间
2018-4-22
最后登录
2018-4-22

楼主
Liebechunchun 发表于 2025-11-21 18:24:31 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

NLP 文本相似度计算

在自然语言处理(NLP)领域中,文本相似度计算是一项核心基础任务,其目标是通过量化方式衡量两个文本片段之间的相近程度。该技术广泛应用于信息检索、问答系统、抄袭识别、推荐引擎等多个实际场景。

基本概念解析

语义相似度:关注的是两段文本在语义或含义上的接近性,即使用词不同但表达的意思相近,也认为具有高相似度。

字面相似度:侧重于比较文本之间词汇的直接重合情况,如共同词语的数量等。

向量空间模型:将文本转换为高维空间中的向量表示,便于进行数学运算和距离计算。

距离度量方法:用于评估向量间的关系,包括距离远近或方向一致性,从而反映文本的相似程度。

常见的文本相似度计算方法

1. 基于词频的技术

词袋模型(Bag of Words)

该方法将文本视为无序词语的集合,忽略语法与词序,仅统计词语出现频率。

示例代码:

from sklearn.feature_extraction.text import CountVectorizer
corpus = [
    '我喜欢自然语言处理',
    '我爱学习NLP技术',
    '文本相似度计算很有趣'
]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(X.toarray())

TF-IDF 方法

通过对词语频率进行加权,降低常见词的影响,突出关键词的作用。

[此处为图片2]

示例代码:

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
tfidf_matrix = tfidf.fit_transform(corpus)
print(tfidf_matrix.toarray())

2. 基于词向量的方法

Word2Vec 相似度分析

利用神经网络训练词向量,使语义相近的词在向量空间中位置更接近。

[此处为图片3]

示例代码:

from gensim.models import Word2Vec
sentences = [
    ['我','喜欢','自然语言处理'],
    ['我','爱','学习','NLP','技术'],
    ['文本','相似度','计算','很','有趣']
]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
vector = model.wv['自然语言处理']  # 获取指定词语的向量表示

句子向量构造

通过聚合句中所有词向量的平均值来生成整个句子的向量表示。

[此处为图片4]

示例代码:

import numpy as np
def sentence_vector(sentence, model):
    vectors = [model.wv[word] for word in sentence if word in model.wv]
    return np.mean(vectors, axis=0) if vectors else np.zeros(model.vector_size)

sentence_vec1 = sentence_vector(['我','喜欢','自然语言处理'], model)
sentence_vec2 = sentence_vector(['我','爱','NLP'], model)

3. 基于预训练模型的方法

BERT 模型计算相似度

BERT 能够捕捉上下文语义信息,提供更加精准的文本表示。

[此处为图片5]

示例代码:

from transformers import BertTokenizer, BertModel
import torch

tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertModel.from_pretrained('bert-base-chinese')

inputs = tokenizer("这是一个示例句子", return_tensors="pt")
outputs = model(**inputs)
last_hidden_states = outputs.last_hidden_state

常用的相似度度量指标对比

方法名称 公式 特点
余弦相似度 cos(θ) = (A·B)/(|A||B|) 忽略向量长度,专注于方向的一致性
欧氏距离 √Σ(Ai-Bi) 考虑向量在空间中的绝对位置差异
曼哈顿距离 Σ|Ai-Bi| 对异常值相对不敏感,适合稀疏数据
Jaccard相似度 |A∩B|/|A∪B| 适用于基于集合的文本匹配场景

代码实现示例

使用余弦相似度计算两个文本之间的相似性:

[此处为图片6]
from sklearn.metrics.pairwise import cosine_similarity
# 计算TF-IDF矩阵中前两篇文章的相似度
similarity = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix[1:2])
print(f"文本相似度: {similarity[0][0]:.4f}")

实际应用案例:新闻标题相似性检测

通过TF-IDF结合余弦相似度,可自动识别内容相近的新闻标题,避免重复推荐。

[此处为图片7]

示例代码:

import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity

# 标题样本数据
titles = [
    "苹果发布新款iPhone手机",
    "苹果公司推出最新智能手机",
    "微软公布季度财报",
    "谷歌宣布新的人工智能计划"
]

# 向量化并计算相似度矩阵
tfidf = TfidfVectorizer()
title_vectors = tfidf.fit_transform(titles)
similarity_matrix = cosine_similarity(title_vectors)

# 输出结果
print(similarity_matrix)
tfidf_matrix = tfidf.fit_transform(titles)
similarities = cosine_similarity(tfidf_matrix)

# 结果展示
df = pd.DataFrame(similarities, columns=titles, index=titles)
print(df)

相似度计算结果分析

以下为基于TF-IDF与余弦相似度模型得出的文本间相似性矩阵:

苹果发布新款iPhone手机 苹果公司推出最新智能手机 微软公布季度财报 谷歌宣布新的人工智能计划
苹果发布新款iPhone手机 1.000000 0.723417 0.000000 0.000000
苹果公司推出最新智能手机 0.723417 1.000000 0.000000 0.000000
微软公布季度财报 0.000000 0.000000 1.000000 0.204598
谷歌宣布新的人工智能计划 0.000000 0.000000 0.204598 1.000000

关键技术挑战与应对策略

1. 语义相近但词汇差异较大的文本处理

当两段文本在语义层面表达相似态度或主题,但使用了不同的词语时,传统方法可能难以捕捉其内在关联。

示例:
text1 = "我喜欢猫"
text2 = "我讨厌狗"

尽管两者用词相反且对象不同,但从情感倾向上看,均体现了说话者对特定动物的情绪态度。此类情况需要引入更深层次的语义理解机制。

2. 一词多义现象的识别与区分

自然语言中普遍存在多义词问题,同一词汇在不同上下文中含义截然不同。

示例:
text1 = "苹果很甜"         # 指水果
text2 = "苹果市值创新高"   # 指科技公司

若不结合上下文进行消歧,模型容易误判二者相关性。因此需采用上下文感知的表示方法,如上下文嵌入模型(Contextual Embeddings)来提升准确性。

3. 长文本之间的相似度评估

对于篇幅较长的文档,单纯依赖词频统计可能无法有效反映整体结构和主题一致性,需综合考虑段落层次、主题分布等因素。

推荐实践方案

重视数据预处理流程

  • 统一文本大小写格式,避免因大小写导致的特征分裂。
  • 移除常见停用词(如“的”、“是”、“在”等),减少噪声干扰。
  • 执行词干提取或词形还原,将不同形态的词汇归一化为原始形式。

依据应用场景选择合适算法

  • 短文本匹配:建议使用BERT等预训练语言模型,具备较强的语义捕捉能力。
  • 长文档比对:可优先采用TF-IDF结合余弦相似度的方法,兼顾效率与可解释性。
  • 实时系统需求:推荐部署轻量级模型如Word2Vec,满足低延迟响应要求。

优化计算性能

  • 面对大规模数据检索任务,可采用近似最近邻(ANN)算法加速相似项查找。
  • 集成高效向量搜索工具库,例如Faiss,显著提升高维空间中的匹配速度。

持续迭代与效果监控

  • 构建人工标注的评估样本集,用于定期检验模型输出质量。
  • 在生产环境中持续跟踪相似度系统的实际表现,及时发现偏差。
  • 根据业务变化和新增数据动态更新模型参数或替换底层技术框架。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:NLP 相似度 Similarities Transformers Similarity

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-5 19:17