Python查找两个列表共同词的实现方法(适配词干提取匹配场景)
Python实现嵌套列表与词表的同根词匹配方案
核心前提:你的text_list已经完成词干提取,匹配前必须对words_list执行完全相同规则的词干提取,否则无法匹配interesting对应interest这类同根词。以下示例用和示例结果匹配的Porter词干规则做演示,实际使用时替换成你预处理text_list的同款词干提取逻辑即可。
方案1:集合交集法(性能最优,推荐大数据量场景使用)
集合的成员查找、交集操作时间复杂度极低,是无顺序要求场景下的首选方案:
from nltk.stem import PorterStemmer # 初始化词干提取器,和预处理text_list的配置保持一致 stemmer = PorterStemmer() text_list = [['i', 'am', 'interest' ,'for', 'this', 'subject'], ['this', 'is', 'a', 'second', 'sentence']] words_list = ['a', 'word', 'sentence', 'interesting'] # 拍平嵌套的text_list,转集合自动去重 text_vocab = set(word for sub_text in text_list for word in sub_text) # 对目标词表做同款词干提取,转集合 words_stem_vocab = set(stemmer.stem(word) for word in words_list) # 取交集得到共同词 same_words = list(text_vocab & words_stem_vocab)
该方法返回的结果顺序不固定,会包含所有匹配到的a、sentence、interest三个词。
方案2:顺序遍历法(可保留词表中的出现顺序)
如果需要最终结果严格按照词汇在words_list里的出现顺序返回,用遍历+集合去重的逻辑实现:
from nltk.stem import PorterStemmer stemmer = PorterStemmer() text_list = [['i', 'am', 'interest' ,'for', 'this', 'subject'], ['this', 'is', 'a', 'second', 'sentence']] words_list = ['a', 'word', 'sentence', 'interesting'] text_vocab = set(word for sub_text in text_list for word in sub_text) same_words = [] added = set() # 标记已加入结果的词,避免重复 for raw_word in words_list: stem_word = stemmer.stem(raw_word) if stem_word in text_vocab and stem_word not in added: same_words.append(stem_word) added.add(stem_word)
运行后same_words固定为['a', 'sentence', 'interest'],和示例输出完全一致。
方案3:函数式写法(简洁实现顺序匹配)
偏好函数式编程风格的话,可以用filter配合有序去重逻辑实现,代码更紧凑:
from nltk.stem import PorterStemmer stemmer = PorterStemmer() text_list = [['i', 'am', 'interest' ,'for', 'this', 'subject'], ['this', 'is', 'a', 'second', 'sentence']] words_list = ['a', 'word', 'sentence', 'interesting'] text_vocab = set(word for sub_text in text_list for word in sub_text) stemmed_words = [stemmer.stem(w) for w in words_list] # 过滤存在的词,同时按插入顺序去重(Python 3.7+字典默认保序) same_words = list(dict.fromkeys(filter(lambda w: w in text_vocab, stemmed_words)))
提示:如果使用Python 3.7以下版本,把去重逻辑替换为方案2里的
added集合标记逻辑即可。
注意事项
- 绝对不能跳过
words_list的词干提取步骤,否则interesting和预处理后的interest无法匹配,会漏结果 - 处理
text_list时要确保所有子列表的词汇都被纳入词集合,避免漏匹配 - 词干提取工具、参数必须和预处理
text_list时完全一致,否则词干规则不统一会出现匹配错误
内容的提问来源于stack exchange,提问作者Rina
相关产品推荐
相关产品推荐

