You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已实现分词文档聚类,如何计算文档与目标文档的相似度距离?

嘿,这问题其实是你已掌握的聚类思路的延伸,咱们从你现有的基础出发,一步步实现单篇目标文档与其他文档的相似度/距离计算:

步骤1:完善分词与文本准备

首先先把你的分词函数补全(这里用NLTK的分词工具做示例,你可以替换成自己的分词逻辑),同时准备好目标文档和原始文档列表:

import nltk
from nltk.tokenize import word_tokenize
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity, cosine_distances

# 第一次运行需要下载分词资源
nltk.download('punkt')

# 完善你的分词函数(可根据需求添加停用词过滤、词干提取等)
def word_tokenizer(sentence):
    # 分词后转小写,保留核心词汇
    tokens = word_tokenize(sentence.lower())
    return tokens

# 你的原始文档列表
texts = [ "This is a test", "This is something else", "This is also a test" ]
# 目标文档(替换成你实际要对比的文档)
target_doc = "This is a test document"
# 把目标文档加入列表,方便统一做向量化处理
all_texts = [target_doc] + texts
步骤2:将文本转为可计算的向量

文本无法直接计算距离,咱们用TF-IDF(最常用的文本向量化方法)把所有文档转换成数值向量:

# 初始化TF-IDF向量器,指定自定义分词函数
tfidf = TfidfVectorizer(tokenizer=word_tokenizer)
# 拟合所有文本,生成向量矩阵
tfidf_matrix = tfidf.fit_transform(all_texts)
步骤3:计算目标文档与其他文档的相似度/距离

现在目标文档对应矩阵的第0行,其他文档是第1-3行。用余弦相似度(值越接近1表示越相似)或余弦距离(值越接近0表示越相似)来计算:

# 提取目标文档的向量
target_vector = tfidf_matrix[0]
# 计算目标向量与其他所有文档的余弦相似度
similarities = cosine_similarity(target_vector, tfidf_matrix[1:])[0]
# 计算余弦距离(1 - 余弦相似度,更直观体现"距离")
distances = cosine_distances(target_vector, tfidf_matrix[1:])[0]

# 格式化输出结果
for idx, (sim, dist) in enumerate(zip(similarities, distances), 1):
    print(f"文档 {idx}: 相似度 = {sim:.4f}, 距离 = {dist:.4f}")

运行后你会得到类似这样的结果:

文档 1: 相似度 = 0.7559, 距离 = 0.2441
文档 2: 相似度 = 0.3333, 距离 = 0.6667
文档 3: 相似度 = 0.6547, 距离 = 0.3453
额外小贴士
  • 如果你的分词逻辑包含停用词过滤、词干/词形还原,直接把这些逻辑加到word_tokenizer函数里就行,TF-IDF向量器会自动调用。
  • 文本领域优先用余弦相似度/距离,它不关心文档长度,只关注词汇分布的相似性,比欧氏距离更适合。
  • 如果文档数量很大,可以用sklearn.neighbors.NearestNeighbors来快速找到Top N最相似的文档,比遍历所有文档更高效。

内容的提问来源于stack exchange,提问作者buydadip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:32:25