如何在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.0text2总词数4,只有"large""bag"能匹配到text1,得分就是2/4=0.5
具体实现步骤(Python示例)
- 文本预处理:拆分文本为词汇,统一大小写避免匹配误差,转集合加速查找
- 单向匹配统计:遍历第一个文本的词汇,统计在第二个文本词汇集合中的出现数量
- 计算得分:匹配数除以第一个文本的总词汇数,得到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
相关产品推荐
相关产品推荐

