已实现分词文档聚类,如何计算文档与目标文档的相似度距离?
嘿,这问题其实是你已掌握的聚类思路的延伸,咱们从你现有的基础出发,一步步实现单篇目标文档与其他文档的相似度/距离计算:
步骤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
相关产品推荐
相关产品推荐

