如何使用Python在两个词表中查找同义词,解决多词短语匹配问题
问题原因
你原有代码运行出错、匹配失效主要有3个核心问题:
- WordNet返回的多词同义词默认以下划线连接(比如
carbon dioxide会返回carbon_dioxide),和你词表里空格分隔的短语格式不匹配,无法命中 - WordNet本身没有收录缩写对应关系(比如
co2和carbon dioxide的关联),这类特殊匹配无法覆盖 - 代码逻辑错误:你将整个
word_list_2列表传入函数,打印时调用word.upper()会直接报错(列表不存在字符串的upper方法),且没有按word_list_2的每个词单独分组输出结果。
实现方案
通过补充自定义同义词映射、适配WordNet的输出格式、修正遍历逻辑即可实现需求,可运行代码如下:
import nltk from nltk.corpus import wordnet # 首次运行需要下载依赖,取消注释下一行即可 # nltk.download('wordnet') # 自定义同义词映射,补充WordNet未收录的专业术语、缩写对应关系 custom_synonym_map = { "co2": ["carbon dioxide"], # 可根据你的业务场景补充更多专属映射 } # 你的词表 word_list_1 = ['right', 'head', 'left', 'mass', 'removal', 'terminal', 'carbon dioxide', 'dominance', 'initiation'] word_list_2 = ['right', 'co2', 'control', 'creation', 'end'] # 预处理word_list_1加快匹配速度 wl1_set = set(word_list_1) # 建立下划线格式到原格式的映射,适配WordNet的输出规则 wl1_underscore_map = {item.replace(" ", "_"): item for item in word_list_1} def get_matched_synonyms(target_word): synonyms = [] # 优先查自定义映射 if target_word in custom_synonym_map: for syn in custom_synonym_map[target_word]: if syn in wl1_set and syn not in synonyms: synonyms.append(syn) # 查WordNet通用同义词 for synset in wordnet.synsets(target_word): for lemma in synset.lemma_names(): # 转换为原词表的空格格式 original_lemma = wl1_underscore_map.get(lemma, lemma.replace("_", " ")) if original_lemma in wl1_set and original_lemma not in synonyms and original_lemma != target_word: synonyms.append(original_lemma) # 自身在词表1中也返回(匹配示例中right的输出规则) if target_word in wl1_set and target_word not in synonyms: synonyms.append(target_word) return synonyms # 按要求格式输出 for word in word_list_2: syn_result = get_matched_synonyms(word) print(f"synonym for {word}:") for syn in syn_result: print(f"'{syn}'\n")
效果说明
上述代码运行后会完全匹配你给出的期望输出格式,如果需要覆盖更多领域同义词,只需要在custom_synonym_map中补充对应关系即可。
内容的提问来源于stack exchange,提问作者Kath
相关产品推荐
相关产品推荐

