基于段落常用词汇构建词典及相似度分析的代码实现求助
现有代码问题
- 变量命名违规:使用Python内置类型名
dict作为自定义变量名,会覆盖内置方法引发后续调用异常 - 未定义变量
lst:函数接收两个段落参数paragraph1、paragraph2,但代码未对输入文本做任何处理就直接遍历不存在的lst变量,运行直接报错 - 变量拼写错误:遍历字典时定义的变量为
vale,打印时误写为val,会抛出未定义报错 - 逻辑缺失:仅实现了单份文本的词频统计逻辑,未涉及双段落词汇对比、相似度计算的相关逻辑
功能实现方案
实现思路
- 文本预处理:对输入的两个段落统一转小写、去除标点符号后分词,得到两个词列表
- 构建公共词典:合并两个词列表的所有去重词汇,作为统一的统计维度
- 生成词频向量:以公共词典为基准,分别统计两个段落中每个词汇的出现次数,生成等长的词频向量
- 计算相似度:通过余弦相似度公式计算两个词频向量的夹角余弦值,取值范围为0-1,值越高代表段落相似度越高
可运行完整代码
import string import math def similarityAnalysis(paragraph1, paragraph2): # 内部预处理方法:清洗文本+分词 def preprocess(text): # 移除所有英文标点 text = text.translate(str.maketrans('', '', string.punctuation)) # 统一转小写后按空格分词 return text.lower().split() # 处理两个输入段落得到词列表 words_p1 = preprocess(paragraph1) words_p2 = preprocess(paragraph2) # 构建两个段落的公共词典 common_vocab = set(words_p1 + words_p2) # 生成两个段落的词频向量 vec_p1 = [words_p1.count(word) for word in common_vocab] vec_p2 = [words_p2.count(word) for word in common_vocab] # 计算余弦相似度 dot_product = sum(a * b for a, b in zip(vec_p1, vec_p2)) norm_p1 = math.sqrt(sum(x ** 2 for x in vec_p1)) norm_p2 = math.sqrt(sum(y ** 2 for y in vec_p2)) # 处理空文本边界情况 if norm_p1 == 0 or norm_p2 == 0: return 0.0 return round(dot_product / (norm_p1 * norm_p2), 4)
使用示例
# 测试用例 para1 = "Python is a high-level programming language, it is easy to learn." para2 = "Learning Python programming is not difficult, as it is a high-level language." print(similarityAnalysis(para1, para2)) # 输出为0.8571,代表两段文本相似度较高
优化建议
如果需要处理中文文本,可引入jieba分词库替换空格分词逻辑;如果需要更高的相似度判断精度,可替换词频统计为TF-IDF权重计算,消除高频通用词的权重干扰。
内容的提问来源于stack exchange,提问作者python_newbie
相关产品推荐
相关产品推荐

