【问题标题】:Faster Lemmatization techniques in PythonPython中更快的词形还原技术
【发布时间】:2016-10-27 10:51:45
【问题描述】:

我正在尝试使用 NLTK Word Net Lemmatizer 找到一种更快的方法来对列表(名为 text)中的单词进行词形还原。显然这是我整个程序中最耗时的步骤(使用 cProfiler 找到相同的步骤)。

以下是我正在尝试优化速度的一段代码 -

def lemmed(text):
    l = len(text)
    i = 0
    wnl = WordNetLemmatizer()
    while (i<l):
        text[i] = wnl.lemmatize(text[i])
        i = i + 1
    return text

使用词形还原器会使我的表现降低 20 倍。任何帮助将不胜感激。

【问题讨论】:

  • 将什么的性能降低 20 倍?您需要词形还原的表格做什么?
  • @rmalouf 如果我删除此功能,我的程序运行速度会快 20 倍。我需要在对其运行算法之前对数据进行预处理。因此需要词形还原形式。
  • 我问的原因是有比 wordnet 更快的 lemmatizers/stemmers,但它们也给出了不同的结果。答案将取决于您的算法究竟需要什么作为输入,以及您的应用程序需要多快才能足够快。如果不知道目标是什么的详细信息,就很难知道如何回答这样的问题。
  • @rmalouf 我很想知道更快的词形还原器。我的输入是从文档中 OCR 的单词列表,我希望根据单词对该文档进行分类。我知道标签,因此如果有任何帮助,它将属于监督学习。

标签: python performance python-3.x nltk lemmatization


【解决方案1】:

如果您有几个内核可用,请尝试使用multiprocessing 库:

from nltk import WordNetLemmatizer
from multiprocessing import Pool

def lemmed(text, cores=6): # tweak cores as needed
    with Pool(processes=cores) as pool:
        wnl = WordNetLemmatizer()
        result = pool.map(wnl.lemmatize, text)
    return result


sample_text = ['tests', 'friends', 'hello'] * (10 ** 6)

lemmed_text = lemmed(sample_text)

assert len(sample_text) == len(lemmed_text) == (10 ** 6) * 3

print(lemmed_text[:3])
# => ['test', 'friend', 'hello']

【讨论】:

  • 感谢您的精彩回答,我得到了 4 倍的加速(使用 6 个内核)_,但更令人困惑的是使用 core =1** 时的加速是**~10 倍。我正在尝试使用不同数量的核心,但似乎时间模式是 8 > 6 > 4 > 2 > 1 核心,这对我来说毫无意义。您能解释一下为什么这种模式以及使用 Pool 是如何改变这种模式的吗?
  • 随着内核或线程数量的增加,上下文切换通常会降低性能,在这种情况下,执行将阻塞,直到最慢的池完成。您可能还会看到不同的结果,具体取决于进入的数组的大小。一旦你开始使用线程或多个工作线程,事情总是会变得更加模糊,这就是为什么在你真正需要它之前一直保存它总是有帮助的!
  • 就加速而言,直接映射可能比现有的变量分配提供了改进。只要能行,就随它去吧!
  • 感谢@alecrasmussen 的解释。我会 +1 这个答案,但我似乎还没有足够的声望点来做到这一点。
  • 使用多处理池对大约 50 个单词的文本进行词形还原平均需要 76 秒,但没有它会更快(2 秒)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 2013-07-15
  • 1970-01-01
  • 2017-06-21
相关资源
最近更新 更多