You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Spacy词干提取合并字典同词根词条并对值求和的实现方法

实现方案

你目前生成的counter_test_dictionary仅统计了词干的出现次数,对求和需求没有帮助,可以直接省略该步骤,整体方案仅需两次线性遍历即可完成,时间复杂度为O(n),空间复杂度为O(k)(k为不同词干的数量,远小于超大规模词库的总词条数),完全适配大数据量场景。

核心逻辑

  1. 先建立「词干→同词根所有单词数值总和」的映射字典
  2. 再遍历原字典,用每个单词对应的词干查总和,直接生成新字典

代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:36:03