Nltk: Pförtnerstimmen: Saitenindex außerhalb des zulässigen Bereichs

Erstellt am 7. Jan. 2017  ·  12Kommentare  ·  Quelle: nltk/nltk

siehe folgenden Stackoverflow-Beitrag

pleaseverify

Hilfreichster Kommentar

@fievelk du hast vollkommen recht. Entschuldigung, ja: Sie können entweder den develop Zweig oder 3.2.1 , um den Fehler zu beseitigen.

Alle 12 Kommentare

Für zukünftige Referenzen kopiere ich Ihre Frage hier:


Ich habe eine Reihe von eingelegten Textdokumenten, die ich mit PorterStemmer von nltk stämmen möchte. Aus projektspezifischen Gründen möchte ich das Stemming in einer Django-App-Ansicht durchführen.

Wenn ich jedoch die Dokumente in der Django-Ansicht stamme, erhalte ich eine IndexError: string index out of range Ausnahme von PorterStemmer().stem() für die Zeichenfolge 'oed' . Als Ergebnis führen Sie Folgendes aus:

# 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')

löst den genannten Fehler aus:

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

Was jetzt wirklich seltsam ist, ist, dass derselbe Stemmer auf demselben String außerhalb von Django ausgeführt wird (sei es eine separate Python-Datei oder eine interaktive Python-Konsole), die keinen Fehler erzeugt. Mit anderen Worten:

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

gefolgt von:

python test.py
# successfully prints 'o'

was verursacht dieses Problem?

Ich habe festgestellt, dass dieses Problem spezifisch für die nltk-Version 3.2.2 ist. Ursprünglich habe ich test.py mit Ipython und nicht mit Python ausgeführt, wie oben erwähnt. Irgendwie konnte ich in meiner Root-Umgebung //anaconda/bin/ipython auf die ipython-Installation zugreifen, obwohl ich ipython in der (aktivierten) virtuellen Umgebung meines Django-Projekts //anaconda/envs/xkcd/bin/ . Infolgedessen muss ipython auch die in meiner Root-Umgebung definierte nltk-Installation verwendet haben, die Version 3.2.0 ausführt.

Zur Verdeutlichung habe ich festgestellt, dass PorterStemmer die Zeichenfolge 'oed' in der nltk-Version 3.2.2 nicht abstammt, aber nicht in der nltk-Version 3.2.0. Warum ich keine Ahnung habe.

Als Randnotiz habe ich in beiden Fällen Python 2 verwendet. Meine Root-Umgebung verwendet Python 2.7.11 und die Umgebung meines Django-Projekts verwendet Python 2.7.13

Hey,
Entschuldigung für das (Problem). Ich meine, ich benutze nie github, es war
aus Versehen passiert. Ich weiß nicht, was ich gerade auslöse!

Am 7. Januar 2017 23:47 schrieb "jkarimi91" [email protected] :

Ich habe festgestellt, dass dieses Problem spezifisch für die nltk-Version 3.2.2 ist.
Ursprünglich habe ich test.py mit Ipython und nicht mit Python ausgeführt, wie oben angegeben.
Irgendwie konnte ich auf die ipython-Installation in meinem Root zugreifen
Umgebung //anaconda/bin/ipython obwohl ich es nicht angegeben hatte
ipython in meiner aktuell aktivierten virtuellen Umgebung
//anaconda/envs/xkcd/bin/. Infolgedessen muss ipython die
nltk-Installation auch in meiner Root-Umgebung definiert, die Version ausführt
3.2.0.

Zur Verdeutlichung habe ich festgestellt, dass der PorterStemmer die
string 'oed' in nltk-Version 3.2.2, aber nicht in nltk-Version 3.2.0. Warum ich
keine Ahnung.


Sie erhalten dies, weil Sie diesen Thread abonniert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/nltk/nltk/issues/1581#issuecomment-271100268 oder stumm
der Faden
https://github.com/notifications/unsubscribe-auth/AVTBBiywlg5c81StFrrcNOsyuF610y9uks5rP9bLgaJpZM4LdV66
.

@ExplodingCabbage könnten Sie dieses Problem bitte untersuchen? Der einzige Commit, den ich auf porter.py nachdem 3.2 veröffentlicht wurde, ist d8402e3f43ce3b7a3c7ecb45c3b8b1f75c7124e2.

Dies ist der Code, der im Beispiel von @jkarimi91 verwendet wird.

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

Beim Debuggen des obigen Codes mit pdb innerhalb von _apply_rule_list() in porter.py nach einigen Iterationen:

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

An diesem Punkt versucht die Methode _ends_double_consonant() , word[-1] == word[-2] auszuführen und schlägt fehl.

Wenn ich mich nicht irre, war in NLTK 3.2 die relative Methode die folgende:

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)

Soweit ich sehen kann, fehlt der len(word) < 2 Check in der neuen Version.

Das Ändern von _ends_double_consonant() in etwas wie folgt sollte funktionieren:

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)
      )

Huch. Ja, sieht so aus, als hätte ich das in https://github.com/nltk/nltk/commit/d8402e3f43ce3b7a3c7ecb45c3b8b1f75c7124e2 gebrochen:(

Werde heute Abend einen Test und einen Fix PR machen.

Danke @jkarimi91 , @fievelk , @ExplodingCabbage

Hallo, ich bin heute auf genau das gleiche Problem gestoßen. Könnten Sie mir bitte einen Vorschlag machen, wie ich das beheben könnte? Sollte ich irgendwelche Pakete aktualisieren?

Hallo @santoshbs. Sie können entweder die master Version von NLTK verwenden oder 3.2.1 freigeben, um den Fehler zu beseitigen; es existiert nur in der Version 3.2.2 .

@ExplodingCabbage Ich denke, Sie beziehen sich auf den Zweig develop (nicht master ). Es ist leicht zu verwirren, denke ich :)

@fievelk du hast vollkommen recht. Entschuldigung, ja: Sie können entweder den develop Zweig oder 3.2.1 , um den Fehler zu beseitigen.

Vielen Dank für den Hinweis.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen