2015-10-28 2 views
7

Я получаю сообщение об ошибке при попытке использовать функцию precision от nltk.metrics.scores. Я пробовал много разных импортов, но безуспешно.AttributeError: объект 'module' не имеет атрибутов 'score'

Я просмотрел файлы в своих каталогах python (см. Ниже), и функция есть, но просто «не может коснуться этого/этого». Я посмотрел на:

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

Это то, что мой терминал показывает мне:

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' 

В моих поисков я наткнулся на эту link, который дает мне два варианта, но я не знаю, как перейдите к любому из них:

  • Очевидной причиной этого является то, что у settings.py нет каталога, содержащего blah, указанного в INSTALLED_APPS.
  • Менее очевидная причина: вы также получите эту ошибку, если каталог не содержит файл __init__.py.
+1

попробуйте добавить и пустой файл с именем '__init __ py' в' /usr/local/lib/python2.7/dist-packages/nltk/metrics', поэтому python может распознать его как модуль для импорта из него. – Cyrbil

+0

Какая ОС вы используете? Как вы установили NLTK (пип или что-то еще)? Какую версию NLTK и python вы используете? Как вы импортировали nltk? Вы пробовали 'from nltk.metrics.score import precision'? – alvas

+0

Обратите внимание на опечатку в моем предыдущем комментарии, я хотел сказать, вы пробовали 'from nltk.metrics.scores import precision'? – alvas

ответ

11

Короче:

from nltk import precision 

При продолжительном:

Это сложно. Проблема возникла из-за того, что NLTK был упакован. Если мы посмотрим на dir(nltk.metrics), нет ничего внутри, кроме alignment_error_rate

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

BTW, в кровоточащих краях версии NLTK, alignment_error_rate был перемещен в nltk.translate.metrics см https://github.com/nltk/nltk/blob/develop/nltk/translate/metrics.py#L10. Пакет nltk.translate немного нестабилен, потому что он все еще находится в стадии разработки.

Возвращаясь к пакету метрик, от https://github.com/nltk/nltk/blob/develop/nltk/metrics/__init__.py, мы видим это:

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) 

в основном, это означает, что функции из пакета метрик были вручную кодируются и толкнули до nltk.metrics.__init__.py. Поэтому, если импорт остановится здесь, dir(metrics), были бы перечислены все импортируемые здесь показатели.

Но поскольку на более высоком уровне, в nltk.__init__.pyhttps://github.com/nltk/nltk/blob/develop/nltk/__init__.py#L131, пакеты были импортированы с помощью:

from nltk.metrics import * 

Теперь все метрики балл был импортирован на верхнем уровне означает, что вы можете сделать:

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

Но вы все равно можете получить доступ к любым модулям промежуточного уровня, которые находятся в пределах nltk.metrics, которые не импортируются в nltk.metrics.__init__.py. Но вы должны использовать правильные пространства имен как функции сохранения в соответствующем каталоге.Обратите внимание, что они не будут отображаться в dir(nltk.metrics), но действительные способы импорта функции:.

>>> 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> 
Смежные вопросы