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

基于余弦相似度过滤字符串向量中的相似字符串需求

过滤相似字符串保留独特内容的解决方案

这个需求核心是基于词汇相似度的冗余内容剔除,关键要解决两个问题:如何准确计算字符串间的词汇相似度,以及如何按规则保留更丰富的内容。我用Python来给你实现一套完整的流程,步骤清晰,容易调整:

步骤1:文本预处理与相似度计算

首先我们需要把字符串转换成计算机能理解的数值向量,这里用TF-IDF向量(能更好体现词汇的重要性),然后用余弦相似度来衡量两个字符串的词汇重叠程度。

步骤2:制定筛选规则

遍历所有字符串对,当相似度超过30%(0.3)时,保留词汇数量更多的那个;如果词汇数相同,优先保留先出现的字符串。最后只留下和所有其他字符串相似度都低于30%的内容。

完整代码实现

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

def filter_similar_strings(strings, threshold=0.3):
    # 1. 预处理:将字符串转为TF-IDF向量(去除英文停用词,比如the/a等)
    vectorizer = TfidfVectorizer(stop_words='english')
    tfidf_matrix = vectorizer.fit_transform(strings)
    
    # 2. 计算两两余弦相似度矩阵
    cos_sim_matrix = cosine_similarity(tfidf_matrix)
    
    # 3. 初始化保留标记:默认所有字符串都保留
    keep = np.ones(len(strings), dtype=bool)
    
    # 4. 遍历所有两两组合(i < j,避免重复对比)
    for i in range(len(strings)):
        if not keep[i]:
            continue  # 已经标记为删除的,跳过对比
        for j in range(i + 1, len(strings)):
            if not keep[j]:
                continue
            # 获取当前对的相似度
            similarity = cos_sim_matrix[i][j]
            if similarity > threshold:
                # 计算两个字符串的独特词汇数量(也可以用总词数,看需求调整)
                vocab_count_i = len(set(strings[i].lower().split()))
                vocab_count_j = len(set(strings[j].lower().split()))
                
                # 标记词汇数更少的那个为删除
                if vocab_count_i > vocab_count_j:
                    keep[j] = False
                elif vocab_count_j > vocab_count_i:
                    keep[i] = False
                else:
                    # 词汇数相同,保留先出现的,删除后出现的
                    keep[j] = False
    
    # 5. 筛选最终保留的字符串
    filtered = [s for idx, s in enumerate(strings) if keep[idx]]
    return filtered

# 测试示例
sample_strings = [
    "The quick brown fox jumps over the lazy dog",
    "Quick brown fox jumps over lazy dog",
    "A cat sits on the windowsill",
    "Cat sitting on windowsill",
    "Dogs chase cats in the park",
    "Cats are chased by dogs in the park"
]

result = filter_similar_strings(sample_strings)
print("过滤后的独特字符串:")
for s in result:
    print("-", s)

关键细节说明

  • 词汇数量计算:代码里用的是len(set(strings[i].lower().split())),也就是独特词汇的数量,如果你想按总词数(包括重复)来判断,改成len(strings[i].split())即可。
  • 阈值调整:代码里默认阈值是0.3(30%),你可以根据实际需求调整threshold参数。
  • 停用词处理:如果是中文场景,把stop_words='english'换成中文停用词列表(比如自定义停用词集合),或者结合jieba等分词工具适配中文分词逻辑。
  • 重复对比避免:只遍历i < j的组合,避免重复计算同一对字符串,提升效率。

运行测试代码后,你会看到相似的字符串对(比如前两个、中间两个、最后两个)里,词汇更丰富的被保留下来,最终剩下的都是互相相似度低于30%的独特内容。

内容的提问来源于stack exchange,提问作者ALEX MATHEW

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:59:20