Wordnet Lemmatizer能否加速?

19

我正在使用NLTK的Wordnet Lemmatizer来分析Brown语料库中的名词是更多地用单数形式还是复数形式。
例如:from nltk.stem.wordnet import WordNetLemmatizer
l = WordnetLemmatizer()

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

可能是因为每个查询都必须与Wordnet建立网页连接吗?..
我想知道是否有一种方法仍然可以使用Wordnet Lemmatizer,但使其执行速度更快?例如,下载Wordnet到我的计算机上会有所帮助吗? 或者有其他建议吗?

我正在尝试弄清楚Wordnet Lemmatizer是否可以变得更快,而不是尝试其他的lemmatizer,因为我发现它在与其他类似Porter和Lancaster的选项相比最好用。

2个回答

36
它不查询互联网,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')

1
关键在于第一个查询也执行了一些初始化操作。之后就很快了。 - justhalf
1
lru_cache很棒,但不适用于Python 2.7:可以考虑使用repoze.lru(http://docs.repoze.org/lru/)来实现类似的功能。 - Vorty
1
@Vorty 我给出的示例使用了 Python 3 functools 的后移版本,其中包含 lru_cache: https://github.com/MiCHiLU/python-functools32 - bcoughlan
Python 2.7 的话,只使用 functools 怎么样? - Jenna Kwon
1
这应该被标记为“已接受”,因为它提供了更多的细节,并提供了加速查询的指令。 - Desprit

3

我曾这样使用词形还原器

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

在我的电脑上完全没有慢的情况。不需要连接到网络就可以完成此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接