Nltk: голоса носильщика: индекс строки вне диапазона

Созданный на 7 янв. 2017  ·  12Комментарии  ·  Источник: nltk/nltk

см. следующий пост stackoverflow

pleaseverify

Самый полезный комментарий

@fievelk, вы совершенно правы. Извините, да: вы можете использовать ветку develop или 3.2.1 чтобы избавиться от ошибки.

Все 12 Комментарий

Для дальнейшего использования я скопирую / вставлю ваш вопрос сюда:


У меня есть набор маринованных текстовых документов, которые я хотел бы остановить с помощью nltk PorterStemmer . По причинам, характерным для моего проекта, я хотел бы выполнить стемминг внутри представления приложения django.

Однако при остановке документов внутри представления django я получаю исключение IndexError: string index out of range от PorterStemmer().stem() для строки 'oed' . В итоге запущено следующее:

# xkcd_project/search/views.py
from nltk.stem.porter import PorterStemmer

def get_results(request):
    s = PorterStemmer()
    s.stem('oed')
    return render(request, 'list.html')

вызывает указанную ошибку:

Traceback (most recent call last):
  File "//anaconda/envs/xkcd/lib/python2.7/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "//anaconda/envs/xkcd/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "//anaconda/envs/xkcd/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/jkarimi91/Projects/xkcd_search/xkcd_project/search/views.py", line 15, in get_results
    s.stem('oed')
  File "//anaconda/envs/xkcd/lib/python2.7/site-packages/nltk/stem/porter.py", line 665, in stem
    stem = self._step1b(stem)
  File "//anaconda/envs/xkcd/lib/python2.7/site-packages/nltk/stem/porter.py", line 376, in _step1b
    lambda stem: (self._measure(stem) == 1 and
  File "//anaconda/envs/xkcd/lib/python2.7/site-packages/nltk/stem/porter.py", line 258, in _apply_rule_list
    if suffix == '*d' and self._ends_double_consonant(word):
  File "//anaconda/envs/xkcd/lib/python2.7/site-packages/nltk/stem/porter.py", line 214, in _ends_double_consonant
    word[-1] == word[-2] and
IndexError: string index out of range

Теперь, что действительно странно, запуск того же стеммера в той же строке вне django (будь то отдельный файл python или интерактивная консоль python) не вызывает ошибок. Другими словами:

# test.py
from nltk.stem.porter import PorterStemmer
s = PorterStemmer()
print s.stem('oed')

с последующим:

python test.py
# successfully prints 'o'

что вызывает эту проблему?

Я обнаружил, что эта проблема характерна для nltk версии 3.2.2. Первоначально я запускал test.py используя ipython, а не python, как указано выше. Каким-то образом я смог получить доступ к установке ipython в моей корневой среде //anaconda/bin/ipython хотя я не указал ipython в (активированной) виртуальной среде моего проекта django //anaconda/envs/xkcd/bin/ . В результате ipython должен был использовать установку nltk, определенную в моей корневой среде, которая запускает версию 3.2.0.

Чтобы уточнить, я обнаружил, что PorterStemmer не удается остановить строку 'oed' в nltk версии 3.2.2, но не в nltk версии 3.2.0. Почему я понятия не имею.

Кстати, в обоих случаях я использовал python 2. Моя корневая среда использует python 2.7.11, а моя среда проекта django использует python 2.7.13.

Привет,
Извините за эту (проблему). Я имею в виду, что я никогда не использую github, это было
случайно случилось. Я не знаю, что я только что запускаю!

7 января 2017 г. в 23:47 "jkarimi91" [email protected] написал:

Я обнаружил, что эта проблема характерна для nltk версии 3.2.2.
Первоначально я запускал test.py, используя ipython, а не python, как указано выше.
Каким-то образом я смог получить доступ к установке ipython в моем корне
среда // anaconda / bin / ipython, хотя я не указал
ipython в моей активированной виртуальной среде
// анаконда / envs / xkcd / bin /. В результате ipython должен был использовать
nltk installtion также определен в моей корневой среде, которая запускает версию
3.2.0.

Чтобы уточнить, я обнаружил, что PorterStemmer не может остановить
строка 'oed' в nltk версии 3.2.2, но не в nltk версии 3.2.0. Почему я
понятия не имею.

-
Вы получаете это, потому что подписаны на эту ветку.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/nltk/nltk/issues/1581#issuecomment-271100268 или отключить звук
нить
https://github.com/notifications/unsubscribe-auth/AVTBBiywlg5c81StFrrcNOsyuF610y9uks5rP9bLgaJpZM4LdV66
.

@ExplodingCabbage, не могли бы вы разобраться в этой проблеме? Единственная фиксация, которую я вижу в porter.py после того, как 3.2 была выпущена, - это d8402e3f43ce3b7a3c7ecb45c3b8b1f75c7124e2.

Это код, использованный в примере, предоставленном @ jkarimi91.

from nltk.stem.porter import PorterStemmer
s = PorterStemmer()
print s.stem('oed')

Отладка приведенного выше кода с использованием pdb из _apply_rule_list() в porter.py , после нескольких итераций вы получите:

>>> rule
(u'at', u'ate', None)
>>> word
u'o'

На этом этапе метод _ends_double_consonant() пытается выполнить word[-1] == word[-2] и терпит неудачу.

Если не ошибаюсь, в NLTK 3.2 относительный метод был следующим:

def _doublec(self, word):
    """doublec(word) is TRUE <=> word ends with a double consonant"""
    if len(word) < 2:
        return False
    if (word[-1] != word[-2]):      
        return False        
    return self._cons(word, len(word)-1)

Насколько я понимаю, в новой версии отсутствует проверка len(word) < 2 .

Изменение _ends_double_consonant() на что-то вроде этого должно сработать:

def _ends_double_consonant(self, word):
      """Implements condition *d from the paper

      Returns True if word ends with a double consonant
      """
      if len(word) < 2:
          return False
      return (
          word[-1] == word[-2] and
          self._is_consonant(word, len(word)-1)
      )

Ой. Да, похоже, я сломал это в https://github.com/nltk/nltk/commit/d8402e3f43ce3b7a3c7ecb45c3b8b1f75c7124e2 :(

Будет PR тест и исправление сегодня вечером.

Спасибо @ jkarimi91 , @fievelk , @ExplodingCabbage

Привет, сегодня я столкнулся с той же проблемой. Не могли бы вы подсказать, как я могу исправить это? Стоит ли обновлять какие-либо пакеты?

Привет @santoshbs. Вы можете использовать версию NLTK master или выпустить 3.2.1 чтобы избавиться от ошибки; он существует только в версии 3.2.2 .

@ExplodingCabbage Я думаю, вы имеете в виду ветку develop (а не master ). Думаю, легко запутаться :)

@fievelk, вы совершенно правы. Извините, да: вы можете использовать ветку develop или 3.2.1 чтобы избавиться от ошибки.

Большое спасибо за указатель.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

chaseireland picture chaseireland  ·  3Комментарии

libingnan54321 picture libingnan54321  ·  3Комментарии

stevenbird picture stevenbird  ·  3Комментарии

Chris00 picture Chris00  ·  3Комментарии

DavidNemeskey picture DavidNemeskey  ·  4Комментарии