2013-04-24 5 views
10

Я использую Lemmatizer Wordnet через NLTK на Brown Corpus (чтобы определить, используются ли в нем существительные больше в их единственной форме или их множественной форме).
т.е. from nltk.stem.wordnet import WordNetLemmatizer
l = WordnetLemmatizer()Возможно ли ускорить работу Wordmat Lemmatizer?

Я заметил, что даже самые простые запросы, такие как один ниже занимает довольно много времени (по крайней мере, второго или два).
l("cats")

Предположительно это происходит потому, что интернет-соединение должно быть сделано, чтобы Wordnet для каждого запроса? ..
мне интересно, если есть способ по-прежнему использовать WordNet лемматизатор, но он выполняет гораздо быстрее? Например, поможет ли мне вообще скачать Wordnet на мою машину? Или любые другие предложения?

Я пытаюсь выяснить, может ли Lemmatizer Wordnet ускоряться, а не пытаться использовать другой lemmatizer, потому что я нашел, что он работает лучше всего среди других, таких как Porter и Lancaster.

ответ

1

Я использовал лемматизатор как этот

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

Это не замедлит вообще на моей машине. Для этого нет необходимости подключаться к сети.

16

Он не запрашивает Интернет, 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 

Это довольно медленно, если вы должны lemmatize много тысяч фраз. Однако, если вы выполняете множество избыточных запросов, вы можете получить некоторое ускорение путем кэширования результатов функции:

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

lemmatize('dogs') 
+0

Ключ в том, что первый запрос также выполняет некоторую инициализацию. После этого все быстро. – justhalf

+1

lru_cache замечательный, но недоступный для Python 2.7: можно использовать repoze.lru (http://docs.repoze.org/lru/) для аналогичной функции. – Vorty

+0

@Vorty Пример, который я дал, использует backport из Python 3 functools, который имеет lru_cache: https://github.com/MiCHiLU/python-functools32 – bcoughlan

Смежные вопросы