使用Python pandas实现句子相似词分组替换的技术咨询
问题根因
- 原有代码提前将句子截断只保留第一个词处理,自然无法输出完整句子
- 原有匹配逻辑是整句相似度匹配,没有针对句子中的单个词汇做替换处理,不符合需求
修正后可运行代码
import pandas as pd from fuzzywuzzy import fuzz # 相似度阈值,可自行调整 SIMILARITY_THRESHOLD = 90 def replace_similar_words_in_column(column_values): # 第一步:按出现顺序构建词汇映射表,相似词映射到首次出现的基准词 benchmark_words = [] word_mapping = {} # 先遍历所有句子的所有词,构建映射 for sentence in column_values: if pd.isna(sentence): continue words = str(sentence).split() for word in words: if word in word_mapping: continue # 对比已有基准词 matched_benchmark = None for b_word in benchmark_words: if fuzz.ratio(word, b_word) >= SIMILARITY_THRESHOLD: matched_benchmark = b_word break if matched_benchmark: word_mapping[word] = matched_benchmark else: word_mapping[word] = word benchmark_words.append(word) # 第二步:用映射表替换所有句子中的词,保留完整句子结构 processed_sentences = [] for sentence in column_values: if pd.isna(sentence): processed_sentences.append(sentence) continue words = str(sentence).split() replaced_words = [word_mapping.get(word, word) for word in words] processed_sentences.append(' '.join(replaced_words)) return processed_sentences # 主逻辑 if __name__ == '__main__': df = pd.read_csv('input.txt') # 遍历每列单独处理 for col in df.columns: df[col] = replace_similar_words_in_column(df[col].tolist()) # 输出结果 print(df) # 如需保存结果可取消下一行注释 # df.to_csv('output.csv', index=False)
逻辑说明
- 每列数据单独处理,保证不同列的词汇映射互不干扰
- 先按句子出现顺序遍历所有词汇,相似度符合要求的词统一映射到首次出现的基准词
- 替换时只换匹配到的相似词,句子其余部分完全保留,符合保留完整句子的要求
- 自带空值处理逻辑,不会因为空数据报错
- 如需不区分大小写匹配,可将相似度计算行修改为
if fuzz.ratio(word.lower(), b_word.lower()) >= SIMILARITY_THRESHOLD:
内容的提问来源于stack exchange,提问作者user14436938
相关产品推荐
相关产品推荐

