如何在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
相关产品推荐
相关产品推荐

