Mam zestaw piklowanych dokumentów tekstowych, które chciałabym wykorzystać przy użyciu nltk's PorterStemmer
. Ze względów specyficznych dla mojego projektu chciałbym zrobić wynik wewnątrz widoku aplikacji django.trzpień nltk: indeks ciągów poza zakresem
Jednak po podziale dokumentów wewnątrz widoku django otrzymuję wyjątek IndexError: string index out of range
od PorterStemmer().stem()
dla ciągu znaków 'oed'
. W rezultacie, uruchamiając następujące:
# 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')
podnosi wymieniony błąd:
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
co teraz jest naprawdę dziwne jest uruchomiony ten sam Stemmer na tym samym ciąg zewnątrz Django (może to być oddzielna plik python lub interaktywna konsola pythona) nie powoduje błędów. Innymi słowy:
# test.py
from nltk.stem.porter import PorterStemmer
s = PorterStemmer()
print s.stem('oed')
następuje:
python test.py
# successfully prints 'o'
, co jest przyczyną tego problemu?
Czy używasz Pythona 2? To może być różnica w zestawie znaków - tylko zgadywanie. – alexis
Jakiej wersji NLTK używasz? Możesz to sprawdzić za pomocą 'nltk .__ version__' po zaimportowaniu. Być może używasz dwóch różnych wersji dla django i zewnętrznego pythona. Czy mógłbyś również sprawdzić wersję pythona, której używasz w django i uruchomić zewnętrzny skrypt? Przypuszczam, że zawsze jest '2.7', biorąc pod uwagę instrukcję' print'. –
Prawie niezwiązane z problemem, 's = PorterStemmer()' należy umieścić gdzieś w zmiennych globalnych. Umieszczenie ich w widoku oznacza załadowanie obiektu 'PorterStemmer' dla każdej strony, która ładuje tę funkcję widoku. – alvas