Можно ли ускорить работу Wordmat Lemmatizer?
Я использую Lemmatizer Wordnet через NLTK на Brown Corpus (чтобы определить, используются ли в нем существительные больше в их единственной форме или их множественной форме).
т.е. from nltk.stem.wordnet import WordNetLemmatizer
l = WordnetLemmatizer()
Я заметил, что даже самые простые запросы, такие как приведенные ниже, занимают довольно много времени (по крайней мере, секунду или два).
l("cats")
Предположительно, это связано с тем, что для каждого запроса необходимо создать веб-соединение для Wordnet.
Мне интересно, есть ли способ по-прежнему использовать Wordnet Lemmatizer, но он работает намного быстрее? Например, поможет ли мне вообще скачать Wordnet на мою машину?
Или любые другие предложения?
Я пытаюсь выяснить, может ли Lemmatizer Wordnet ускоряться, а не пытаться использовать другой lemmatizer, потому что я нашел, что он работает лучше всего среди других, таких как Porter и Lancaster.
Ответы
Ответ 1
Я использовал lemmatizer, как этот
from nltk.stem.wordnet import WordNetLemmatizer #To download corpora: python -m nltk.downloader all
lmtzr=WordNetLemmatizer()#create a lemmatizer object
lemma = lmtzr.lemmatize('cats')
На моей машине совсем не медленно. Для этого нет необходимости подключаться к сети.
Ответ 2
Он не запрашивает интернет, 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')