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

如何在Python中实现考虑输入顺序的非对称词相似度检测

非对称文本相似度实现方案

核心思路

放弃对称算法的双向等价性,改用单向匹配占比作为得分依据:

  • 计算similarity(text1, text2)时,统计text1中有多少词汇能在text2中找到匹配,再除以text1的总词汇数
  • 反过来similarity(text2, text1)则是统计text2中能匹配到text1的词汇数,除以text2的总词汇数

这种逻辑天然实现非对称效果,完全贴合你描述的场景:

第一个输入的所有词汇都包含在第二个输入中,但第二个输入仅有少量词汇存在于第一个输入中

比如你的示例:

  • text1 = "large bag cat"总词数3,全部能在text2 = "large bag dog wild"中匹配到,得分就是3/3=1.0
  • text2总词数4,只有"large""bag"能匹配到text1,得分就是2/4=0.5

具体实现步骤(Python示例)

  1. 文本预处理:拆分文本为词汇,统一大小写避免匹配误差,转集合加速查找
  2. 单向匹配统计:遍历第一个文本的词汇,统计在第二个文本词汇集合中的出现数量
  3. 计算得分:匹配数除以第一个文本的总词汇数,得到0-1区间的相似度得分

代码示例

def asymmetric_similarity(text1, text2):
    # 分词并统一大小写,转集合优化查找效率
    words1 = text1.lower().split()
    words2_set = set(text2.lower().split())
    
    # 统计text1中能匹配到text2的词汇数量
    match_count = sum(1 for word in words1 if word in words2_set)
    
    # 处理空输入的边界情况
    if len(words1) == 0:
        return 0.0
    
    # 返回匹配占比作为相似度得分
    return match_count / len(words1)

# 测试场景
print(asymmetric_similarity("large bag cat", "large bag dog wild"))  # 输出 1.0
print(asymmetric_similarity("large bag dog wild", "large bag cat"))  # 输出 0.5

扩展优化方向

  • 重复词汇处理:用collections.Counter统计词频,计算交集词频总和除以text1的词频总和,适配重复词汇场景
  • 模糊匹配:结合Levenshtein算法,设置编辑距离阈值,支持近似词汇(如"bag"和"bags")的匹配
  • 权重调整:给关键词设置更高权重,计算加权后的匹配占比,提升结果的业务贴合度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:52:05