2015-10-28 19 views
7

Viene visualizzato un errore quando si tenta di utilizzare la funzione precision da nltk.metrics.scores. Ho provato molte importazioni diverse ma senza successo.AttributeError: l'oggetto 'module' non ha attributo 'scores'

Ho esaminato i file nelle mie directory python (vedi sotto) e la funzione è lì, ma è solo "impossibile toccare questo/quello". Ho guardato:

/usr/local/lib/python2.7/dist-packages/nltk/metrics 
/usr/local/lib/python2.7/dist-packages/nltk/metrics/scores.py 

Questo è ciò che mio terminale sta mostrando me:

File "/home/login/projects/python-projects/test.py", line 39, in <module> 
    precision = nltk.metrics.scores.precision(correct[CLASS_POS], predicted[CLASS_POS]) 
AttributeError: 'module' object has no attribute 'scores' 

Nelle mie ricerche mi sono imbattuto su questo link, che mi dà due opzioni, ma non so come procedere a uno di questi:

  • la causa evidente di questo è che il settings.py non ha il bla directory contenente elencati in INSTALLED_APPS.
  • Una causa meno ovvia: riceverai questo errore anche se la directory non contiene un file __init__.py.
+1

prova ad aggiungere e file vuoto chiamato '__init __ py' a' /usr/local/lib/python2.7/dist-packages/nltk/metrics' quindi python può riconoscerlo come modulo e importarlo da esso. – Cyrbil

+0

Quale sistema operativo stai utilizzando? Come hai installato NLTK (pip o qualcos'altro)? Quale versione di NLTK e Python stai usando? Come hai importato nltk? Hai provato 'da nltk.metrics.score import precision? – alvas

+0

Nota l'errore nel mio commento precedente, volevo dire, hai provato 'da nltk.metrics.scores import precision? – alvas

risposta

11

In breve:

from nltk import precision 

a Long:

Questo è difficile. Il problema si è verificato a causa del modo in cui è stato imballato NLTK. Se guardiamo dir(nltk.metrics), non c'è niente al suo interno, oltre alignment_error_rate

>>> import nltk 
>>> dir(nltk.metrics) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'alignment_error_rate'] 

BTW, nella versione bordo sanguinamento della NLTK, alignment_error_rate è stato spostato a nltk.translate.metrics, vedere https://github.com/nltk/nltk/blob/develop/nltk/translate/metrics.py#L10. Il pacchetto nltk.translate è un po 'instabile perché è ancora in fase di sviluppo.

Tornando al pacchetto metriche, da https://github.com/nltk/nltk/blob/develop/nltk/metrics/__init__.py, vediamo questo:

from nltk.metrics.scores import   (accuracy, precision, recall, f_measure, 
              log_likelihood, approxrand) 
from nltk.metrics.confusionmatrix import ConfusionMatrix 
from nltk.metrics.distance  import (edit_distance, binary_distance, 
              jaccard_distance, masi_distance, 
              interval_distance, custom_distance, 
              presence, fractional_presence) 
from nltk.metrics.paice   import Paice 
from nltk.metrics.segmentation import windowdiff, ghd, pk 
from nltk.metrics.agreement  import AnnotationTask 
from nltk.metrics.association  import (NgramAssocMeasures, BigramAssocMeasures, 
              TrigramAssocMeasures, ContingencyMeasures) 
from nltk.metrics.spearman  import (spearman_correlation, ranks_from_sequence, 
             ranks_from_scores) 

fondamentalmente, ciò significa che le funzioni del pacchetto metriche è stato codificato e spinto fino a nltk.metrics.__init__.py manualmente. Quindi se le importazioni si fermano qui, dir(metrics), dovrebbero elencare tutte le metriche importate qui.

Ma a causa del livello più alto, a nltk.__init__.pyhttps://github.com/nltk/nltk/blob/develop/nltk/__init__.py#L131, i pacchetti sono stati importati utilizzando:

from nltk.metrics import * 

Ora tutte le metriche punteggio è stato importato al livello superiore che significa che si può fare:

>>> from nltk import precision 
>>> from nltk import spearman_correlation 
>>> from nltk import NgramAssocMeasures 

Tuttavia, è ancora possibile accedere a qualsiasi modulo di livello intermedio compreso tra nltk.metrics e non importato in nltk.metrics.__init__.py. Ma devi usare gli spazi dei nomi corretti come le funzioni vengono salvate nella loro rispettiva directory.Si noti che questi non verranno visualizzati in dir(nltk.metrics) ma sono modi validi per importare una funzione:.

>>> from nltk.metrics import spearman 
>>> from nltk.metrics import paice 
>>> from nltk.metrics import scores 
<function precision at 0x7fb584a34938> 
>>> scores.precision 
>>> spearman.spearman_correlation 
<function spearman_correlation at 0x7fb5842b3230> 
>>> from nltk.metrics.scores import precision 
>>> precision 
<function precision at 0x7fb584a34938> 
Problemi correlati