2013-04-24 12 views
10

Ich benutze den Wordnet Lemmatizer über NLTK auf dem Brown Corpus (um festzustellen, ob die Substantive mehr in ihrer Singularform oder ihrem Plural verwendet werden).
heißt from nltk.stem.wordnet import WordNetLemmatizer
l = WordnetLemmatizer()Ist es möglich, Wordnet Lemmizer zu beschleunigen?

ich bemerkt habe, dass selbst die einfachsten Fragen wie die unten dauert ziemlich lange Zeit (mindestens ein oder zwei Sekunden).
l("cats")

Vermutlich ist dies, weil eine Web-Verbindung muss für jede Abfrage Wordnet gemacht werden? ..
Ich frage mich, ob es eine Möglichkeit ist immer noch die Wordnet Lemmatizer zu verwenden, aber es viel schneller durchführen? Würde es mir zum Beispiel helfen, Wordnet auf meinen Rechner herunterzuladen? Oder irgendwelche anderen Vorschläge?

Ich versuche herauszufinden, ob der Wordnet Lemmatizer schneller gemacht werden kann, anstatt einen anderen Lemmatizer auszuprobieren, weil ich herausgefunden habe, dass er unter anderen wie Porter und Lancaster am besten funktioniert.

Antwort

1

Ich habe die Lemmatizer wie diese überhaupt auf meinem Rechner

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

verwendet Es ist nicht langsam. Sie müssen dazu keine Verbindung zum Internet herstellen.

16

Es fragt nicht das Internet ab, liest NLTK WordNet von Ihrem lokalen Computer. Wenn Sie die erste Abfrage ausführen, NLTK lädt WordNet von der Festplatte in den Arbeitsspeicher:

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

Es ist ziemlich langsam, wenn Sie viele tausend Sätze lemmatize haben. Wenn Sie jedoch viele redundante Abfragen durchführen, können Sie eine Beschleunigung erzielen, indem Sie die Ergebnisse der Funktion zwischenspeichern:

+0

Der Schlüssel ist, dass die erste Abfrage auch einige Initialisierung durchführt. Danach ist es schnell. – justhalf

+1

lru_cache ist großartig, aber nicht verfügbar für Python 2.7: man kann repoze.lru (http://docs.repoze.org/lru/) für ein ähnliches Feature verwenden. – Vorty

+0

@Vorty Das Beispiel, das ich gab, verwendet den Backport von Python 3 functools, der lru_cache hat: https://github.com/MiCHiLU/python-functools32 – bcoughlan