2013-04-24 19 views
10

Brown Corpus'ta NLTK aracılığıyla Wordnet Lemmatizer'ı kullanıyorum (içindeki isimlerin tekil veya daha çoğul hallerinde daha fazla kullanıldığını belirlemek için).
yani from nltk.stem.wordnet import WordNetLemmatizer
l = WordnetLemmatizer()Wordnet Lemmatizer'ı hızlandırmak mümkün mü?

Böyle biri olarak bile en basit sorgular aşağıda (en azından ikinci bir veya iki) oldukça uzun zaman alır fark ettik. Bir web bağlantısı her bir sorgu için WordNet yapılmalıdır çünkü
l("cats")

Tahminen bu hala WordNet Lemmatizer kullanmak için bir yol olup olmadığını merak ediyorum ama çok daha hızlı gerçekleştirmek gelmiş
..? mi? Örneğin, Wordnet'i makineme indirmemde yardımcı olur mu? Veya başka önerileriniz var mı?

Wordnet Lemmatizer'ın farklı bir lemmatizer'i denemek yerine daha hızlı yapılıp yapılamayacağını anlamaya çalışıyorum, çünkü Porter ve Lancaster gibi diğerlerinin en iyi çalıştığını gördüm.

cevap

1

Ben Benim makinede hiç gecikmez bu

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

gibi lemmatizer kullandım. Bunu yapmak için web'e bağlanmaya gerek yoktur.

16

İnterneti sorgulamayan NLTK, yerel makinenizden WordNet okur. Eğer belleğe diskten ilk sorgu NLTK yükler WordNet çalıştırdığınızda:

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

ifadelerin binlerce lemmatize varsa oldukça yavaştır. Eğer gereksiz sorguları yapıyoruz Ancak, sen işlevinin sonuçlarını önbelleğe alarak bazı hıza alabilirsiniz:

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

lemmatize('dogs') 
+0

anahtar, ilk sorgu ayrıca bazı başlatma gerçekleştirmesidir. Bundan sonra hızlı. – justhalf

+1

lru_cache harika ama Python 2.7 için mevcut değil: benzer bir özellik için repoze.lru (http://docs.repoze.org/lru/) kullanmayı düşünebilirsiniz. – Vorty

+0

@Vorty Verdiğim örnek, lyt_cache'e sahip Python 3 functools'un backport'unu kullanıyor: https://github.com/MiCHiLU/python-functools32 – bcoughlan