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

基于段落常用词汇构建词典及相似度分析的代码实现求助

现有代码问题
  • 变量命名违规:使用Python内置类型名dict作为自定义变量名,会覆盖内置方法引发后续调用异常
  • 未定义变量lst:函数接收两个段落参数paragraph1、paragraph2,但代码未对输入文本做任何处理就直接遍历不存在的lst变量,运行直接报错
  • 变量拼写错误:遍历字典时定义的变量为vale,打印时误写为val,会抛出未定义报错
  • 逻辑缺失:仅实现了单份文本的词频统计逻辑,未涉及双段落词汇对比、相似度计算的相关逻辑
功能实现方案

实现思路

  1. 文本预处理:对输入的两个段落统一转小写、去除标点符号后分词,得到两个词列表
  2. 构建公共词典:合并两个词列表的所有去重词汇,作为统一的统计维度
  3. 生成词频向量:以公共词典为基准,分别统计两个段落中每个词汇的出现次数,生成等长的词频向量
  4. 计算相似度:通过余弦相似度公式计算两个词频向量的夹角余弦值,取值范围为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:45:05