см. следующий пост stackoverflow
Для дальнейшего использования я скопирую / вставлю ваш вопрос сюда:
У меня есть набор маринованных текстовых документов, которые я хотел бы остановить с помощью 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
чтобы избавиться от ошибки.
Большое спасибо за указатель.
Самый полезный комментарий
@fievelk, вы совершенно правы. Извините, да: вы можете использовать ветку
develop
или3.2.1
чтобы избавиться от ошибки.