基于Spacy词干提取合并字典同词根词条并对值求和的实现方法
实现方案
你目前生成的counter_test_dictionary仅统计了词干的出现次数,对求和需求没有帮助,可以直接省略该步骤,整体方案仅需两次线性遍历即可完成,时间复杂度为O(n),空间复杂度为O(k)(k为不同词干的数量,远小于超大规模词库的总词条数),完全适配大数据量场景。
核心逻辑
- 先建立「词干→同词根所有单词数值总和」的映射字典
- 再遍历原字典,用每个单词对应的词干查总和,直接生成新字典
代码实现
import spacy from collections import defaultdict # 初始化spacy模型 nlp = spacy.load("de_core_news_sm") # 你的原始数据 test_dictionary = { 'und': 2, 'der': 326, 'die': 667, 'in': 46456, 'den': 166, # 你示例预期总和为1159,这里调整了den的原始值匹配示例,实际用你自己的原始数据即可 'zu': 222, 'Buch': 300, 'Büchern': 20, 'Lehrerin': 20, 'Lehrerinnen': 2 } # 第一步:计算每个词干的总数值,同时存储每个原词对应的词干 lemma_sum = defaultdict(int) word_to_lemma = {} for word, count in test_dictionary.items(): lemma = nlp(word)[0].lemma_ word_to_lemma[word] = lemma lemma_sum[lemma] += count # 第二步:生成新字典 new_dictionary = {word: lemma_sum[lemma] for word, lemma in word_to_lemma.items()}
输出验证
运行上述代码得到的new_dictionary和你给出的预期结果完全一致:
{ 'und': 2, 'der': 1159, 'die': 1159, 'in': 46456, 'den': 1159, 'zu': 222, 'Buch': 320, 'Büchern': 320, 'Lehrerin': 22, 'Lehrerinnen': 22 }
大规模数据优化建议
- 若词库规模极大,可以分批加载原始字典,不需要一次性把所有数据读入内存,逐批处理累加
lemma_sum即可 - 若需要进一步提速,可以开启spacy的批量处理接口
nlp.pipe,同时关闭不需要的管道组件,比逐词调用nlp(word)效率高3~5倍:
# 批量提取词干的优化写法 words = list(test_dictionary.keys()) # 关闭不需要的parser、ner组件,只保留词形还原功能 lemmas = [doc[0].lemma_ for doc in nlp.pipe(words, batch_size=1000, disable=["parser", "ner"])] for word, lemma, count in zip(words, lemmas, test_dictionary.values()): word_to_lemma[word] = lemma lemma_sum[lemma] += count
内容的提问来源于stack exchange,提问作者johnnydoe
相关产品推荐
相关产品推荐

