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

如何在DataFrame字符串相似度匹配结果中关联对应文档名

问题原因

你无法获取正确对应文档名是两处逻辑错误导致的:

  • 调用chain.from_iterable把所有文档的分句打平成了无归属的一维句子列表,直接丢失了句子和所属文档的映射关系
  • 处理单个句子时,内层循环遍历全表索引给doc_name赋值,循环结束后doc_name永远是DataFrame最后一行的文档名,和当前处理的句子没有任何关联
修复代码

不需要提前打平句子列表,直接逐行遍历DataFrame,处理每一行时同步拿到当前行的文档名,再遍历该行下的所有分句计算相似度,从根源上保留归属关系,修改后可直接运行的代码如下:

results = []
threshold = 0
# 提前计算搜索query的嵌入,避免循环内重复计算消耗性能
search_sentence_embeddings = model.encode(你的搜索字符串变量)

# 逐行遍历数据表,同步获取文档名和对应分句
for _, row in main_df.iterrows():
    doc_name = row['Document name']
    sentences = row['Sentence_Tokenize_rules']
    # 遍历当前文档下的所有分句计算相似度
    for sent in sentences:
        sent_emb = model.encode(sent)
        sim_score = cosine_sim(search_sentence_embeddings, sent_emb)
        if sim_score > threshold:
            results.append((sent, sim_score, doc_name))

# 整理排序结果
result_df = pd.DataFrame(
    results, 
    columns=['Matching Sentence', 'Similarity Score', 'Document name']
)
result_df.sort_values("Similarity Score", ascending=False, inplace=True)
# 输出Top10匹配结果
print(result_df.head(10))
可选优化点
  • 不要把搜索语句的嵌入计算写在循环内,重复计算会大幅拖慢运行速度
  • 文档量级较大时可以批量传入句子列表给model.encode(),比逐句编码性能高3~10倍
  • 可以把相似度阈值从0调整到0.4~0.6区间,提前过滤完全不相关的结果,减少排序开销
  • 原代码中结果列名Docuemnt name存在拼写错误,已修正为Document name

运行后输出的结果会完全匹配你预期的格式,每个匹配句子都会关联到正确的所属文档名称。

内容的提问来源于stack exchange,提问作者Abdul Wahab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:01:11