16

我在 Brown Corpus 上通过 NLTK 使用 Wordnet Lemmatizer(以确定其中的名词是更多地以单数形式还是复数形式使用)。
IE from nltk.stem.wordnet import WordNetLemmatizer
l = WordnetLemmatizer()

我注意到即使是最简单的查询(例如下面的查询)也需要很长时间(至少一两秒)。
l("cats")

大概这是因为每个查询都必须与 Wordnet 建立网络连接?..
我想知道是否有办法仍然使用 Wordnet Lemmatizer 但它的执行速度要快得多?例如,将 Wordnet 下载到我的机器上对我有帮助吗?或者有什么其他建议?

我试图弄清楚 Wordnet Lemmatizer 是否可以做得更快,而不是尝试不同的 lemmatizer,因为我发现它在 Porter 和 Lancaster 等其他工具中效果最好。

4

2 回答 2

32

它不查询互联网,NLTK 从您的本地机器读取 WordNet。当您运行第一个查询时,NLTK 将 WordNet 从磁盘加载到内存中:

>>> from time import time
>>> t=time(); lemmatize('dogs'); print time()-t, 'seconds'
u'dog'
3.38199806213 seconds
>>> t=time(); lemmatize('cats'); print time()-t, 'seconds'
u'cat'
0.000236034393311 seconds

如果您必须对数千个短语进行词形还原,这会相当慢。但是,如果您正在执行大量冗余查询,则可以通过缓存函数的结果来获得一些加速:

from nltk.stem import WordNetLemmatizer
from functools32 import lru_cache
wnl = WordNetLemmatizer()
lemmatize = lru_cache(maxsize=50000)(wnl.lemmatize)

lemmatize('dogs')
于 2014-01-20T20:42:38.843 回答
2

我已经像这样使用了词形还原器

from nltk.stem.wordnet import WordNetLemmatizer # to download corpora: python -m    nltk.downloader all
lmtzr = WordNetLemmatizer() # create a lemmatizer object
lemma = lmtzr.lemmatize('cats')

在我的机器上一点也不慢。无需连接到网络即可执行此操作。

于 2013-06-14T21:18:25.633 回答