我在Brown Corpus上通过NLTK使用Wordnet Lemmatizer(以确定其中的名词是否以其单数形式或复数形式使用更多)。
即from nltk.stem.wordnet import WordNetLemmatizer
l = WordnetLemmatizer()
我注意到即使是最简单的查询,例如下面的查询也需要很长时间(至少一两秒钟)。
l("cats")
可能这是因为每个查询都必须与Wordnet建立网络连接? 我想知道是否还有一种方法可以使用Wordnet Lemmatizer,但它的运行速度要快得多吗?例如,我可以帮助将Wordnet下载到我的机器上吗? 还是其他任何建议?
我正在试图弄清楚Wordnet Lemmatizer是否可以制作得更快,而不是尝试使用不同的变形器,因为我发现它在Porter和Lancaster等其他工作中效果最好。
答案 0 :(得分:23)
它不会查询互联网,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 :(得分: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')
我的机器上一点也不慢。没有必要连接到网络来执行此操作。