ess*_*ess 12 nltk wordnet lemmatization
我正在通过NLTK在Brown Corpus上使用Wordnet Lemmatizer(以确定其中的名词是否以其单数形式或复数形式使用更多).
即 from nltk.stem.wordnet import WordNetLemmatizer
l = WordnetLemmatizer()
我注意到即使是最简单的查询,例如下面的查询也需要相当长的时间(至少一两秒钟).
l("cats")
据推测,这是因为网络连接必须要WORDNET进行每个查询?..
我不知道是否有一种方法仍然使用WORDNET Lemmatizer但它执行得更快?例如,我可以帮助将Wordnet下载到我的机器上吗?还是其他任何建议?
我想弄清楚如果WORDNET Lemmatizer可以进行得更快,而不是尝试不同的lemmatizer,因为我发现它的工作原理最好在其他像波特和兰开斯特.
bco*_*lan 25
它不查询互联网,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
Run Code Online (Sandbox Code Playgroud)
如果你不得不将成千上万的短语弄清楚,那就相当慢了.但是,如果您正在执行大量冗余查询,则可以通过缓存函数的结果来获得一些加速:
from nltk.stem import WordNetLemmatizer
from functools32 import lru_cache
wnl = WordNetLemmatizer()
lemmatize = lru_cache(maxsize=50000)(wnl.lemmatize)
lemmatize('dogs')
Run Code Online (Sandbox Code Playgroud)
我像这样使用了词形还原器
from nltk.stem.wordnet import WordNetLemmatizer # to download corpora: python -m nltk.downloader all
lmtzr = WordNetLemmatizer() # create a lemmatizer object
lemma = lmtzr.lemmatize('cats')
Run Code Online (Sandbox Code Playgroud)
在我的机器上一点也不慢。无需连接到网络即可执行此操作。