2013-04-24 7 views
10

Utilizzo il Wordnet Lemmatizer tramite NLTK sul corpo marrone (per determinare se i nomi in esso contenuti vengono utilizzati più nella loro forma singolare o nella loro forma plurale).
cioè from nltk.stem.wordnet import WordNetLemmatizer
l = WordnetLemmatizer()È possibile velocizzare Wordnet Lemmatizer?

Ho notato che anche le query più semplici, come quello qui sotto prende molto tempo (almeno uno o due secondi).
l("cats")

Presumibilmente questo è perché una connessione web deve essere fatto per Wordnet per ogni query? ..
Mi chiedo se c'è un modo per utilizzare ancora la Wordnet Lemmatizer ma averlo eseguire molto più velocemente? Ad esempio, sarebbe utile per me scaricare Wordnet sul mio computer? O altri suggerimenti?

Sto cercando di capire se il Lemmatizer di Wordnet può essere fatto più veloce piuttosto che provare un diverso lemmatizer, perché ho trovato che funziona meglio, tra gli altri, come Porter e Lancaster.

risposta

1

Ho usato il lemmatizer come questo

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

Non è affatto lento sulla mia macchina. Non è necessario connettersi al Web per farlo.

16

Non esegue query su Internet, NLTK legge WordNet dal computer locale. Quando si esegue la prima query, carichi NLTK WordNet dal disco in memoria:

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

È piuttosto lento se dovete lemmatize molte migliaia di frasi. Tuttavia, se si sta facendo un sacco di domande ridondanti, è possibile ottenere un po 'di aumento di velocità mettendo in cache i risultati della funzione:

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

lemmatize('dogs') 
+0

La chiave è che, la prima query esegue anche qualche inizializzazione. Dopo ciò è veloce. – justhalf

+1

lru_cache è ottimo ma non disponibile per Python 2.7: si può considerare l'utilizzo di repoze.lru (http://docs.repoze.org/lru/) per una funzione simile. – Vorty

+0

@Vorty L'esempio che ho fornito utilizza il backport dei functools Python 3 che ha lru_cache: https://github.com/MiCHiLU/python-functools32 – bcoughlan