2013-04-24 14 views
10

Używam Lemmatizer Wordnet przez NLTK na Brown Corpus (w celu ustalenia, czy rzeczowniki w nim są używane bardziej w ich liczbie pojedynczej lub ich liczbie mnogiej).
tj from nltk.stem.wordnet import WordNetLemmatizer
l = WordnetLemmatizer()Czy można przyspieszyć program WordMat Lemmatizer?

Zauważyłem, że nawet najprostsze pytania, takie jak ten poniżej trwa dość długo (co najmniej sekundę lub dwie).
l("cats")

Przypuszczalnie jest to spowodowane połączeniem internetowa musi być wykonane do wordnet dla każdego zapytania? ..
Zastanawiam się, czy istnieje sposób, aby nadal korzystać z dr inż Lemmatizer ale to wykonać znacznie szybciej? Na przykład, czy w ogóle pomogłoby mi pobrać Wordnet na mój komputer? Lub jakieś inne sugestie?

Próbuję dowiedzieć się, czy Wordmat Lemmatizer można zrobić szybciej, niż próbować inny lemmatizer, ponieważ odkryłem, że działa najlepiej wśród innych, takich jak Porter i Lancaster.

Odpowiedz

1

Użyłem lemmatizer jak ten

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

To nie jest powolny w ogóle na moim komputerze. Aby to zrobić, nie ma potrzeby łączenia się z internetem.

16

Nie wysyła zapytań do Internetu, NLTK czyta WordNet z lokalnego komputera. Po uruchomieniu pierwszego zapytania, NLTK ładunki WordNet z dysku do pamięci:

>>> 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 

Jest dość powolny, jeśli masz do lemmatize wiele tysięcy fraz. Jednak jeśli wykonujesz wiele zbędnych zapytań, możesz uzyskać przyspieszenie przez buforowanie wyników funkcji:

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

lemmatize('dogs') 
+0

Kluczem jest to, że pierwsze zapytanie wykonuje również pewną inicjalizację. Potem jest szybki. – justhalf

+1

lru_cache jest świetny, ale niedostępny dla Pythona 2.7: można rozważyć użycie repoze.lru (http://docs.repoze.org/lru/) dla podobnej funkcji. – Vorty

+0

@Vorty Podany przeze mnie przykład wykorzystuje backport funktools Python 3, który ma lru_cache: https://github.com/MiCHiLU/python-functools32 – bcoughlan

Powiązane problemy