Nltk: suara porter: indeks string di luar jangkauan

Dibuat pada 7 Jan 2017  ·  12Komentar  ·  Sumber: nltk/nltk

lihat posting stackoverflow berikut

pleaseverify

Komentar yang paling membantu

@fievelk Anda benar. Maaf, ya: Anda dapat menggunakan cabang develop atau 3.2.1 untuk menghilangkan bug.

Semua 12 komentar

Untuk referensi di masa mendatang, saya salin/tempel pertanyaan Anda di sini:


Saya memiliki satu set dokumen teks acar yang ingin saya hapus menggunakan nltk's PorterStemmer . Untuk alasan khusus untuk proyek saya, saya ingin melakukan stemming di dalam tampilan aplikasi Django.

Namun, ketika membendung dokumen di dalam tampilan Django, saya menerima pengecualian IndexError: string index out of range dari PorterStemmer().stem() untuk string 'oed' . Akibatnya, jalankan yang berikut:

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

memunculkan kesalahan yang disebutkan:

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

Sekarang yang benar-benar aneh adalah menjalankan stemmer yang sama pada string yang sama di luar Django (baik itu file python terpisah atau konsol python interaktif) tidak menghasilkan kesalahan. Dengan kata lain:

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

diikuti oleh:

python test.py
# successfully prints 'o'

apa yang menyebabkan masalah ini?

Saya telah menemukan bahwa masalah ini khusus untuk nltk versi 3.2.2. Awalnya, saya menjalankan test.py menggunakan ipython bukan python, seperti yang dinyatakan di atas. Entah bagaimana, saya dapat mengakses instalasi ipython di lingkungan root saya //anaconda/bin/ipython meskipun saya belum menentukan ipython di lingkungan virtual proyek Django saya (yang diaktifkan) //anaconda/envs/xkcd/bin/ . Akibatnya, ipython pasti telah menggunakan instalasi nltk yang didefinisikan di lingkungan root saya juga yang menjalankan versi 3.2.0.

Untuk memperjelas, saya telah menemukan bahwa PorterStemmer gagal membendung string 'oed' di nltk versi 3.2.2 tetapi tidak di nltk versi 3.2.0. Mengapa saya tidak tahu.

Sebagai catatan tambahan, saya menggunakan python 2 dalam kedua kasus. Lingkungan root saya menggunakan python 2.7.11 dan lingkungan proyek Django saya menggunakan python 2.7.13

Hai,
Maaf untuk ini (masalah). Maksud saya, saya tidak pernah menggunakan github, itu
tidak sengaja terjadi. Saya tidak tahu apa yang baru saja saya picu!

Pada 7 Januari 2017 23:47, "jkarimi91" [email protected] menulis:

Saya telah menemukan bahwa masalah ini khusus untuk nltk versi 3.2.2.
Awalnya, saya menjalankan test.py menggunakan ipython bukan python, seperti yang dinyatakan di atas.
Entah bagaimana, saya dapat mengakses instalasi ipython di root saya
lingkungan //anaconda/bin/ipython meskipun saya belum menentukan
ipython di lingkungan virtual saya yang saat ini diaktifkan
//anaconda/envs/xkcd/bin/. Akibatnya, ipython pasti menggunakan
nltk installtion didefinisikan di lingkungan root saya juga yang menjalankan versi
3.2.0.

Untuk memperjelas, saya telah menemukan bahwa PorterStemmer gagal membendung
string 'oed' di nltk versi 3.2.2 tetapi tidak di nltk versi 3.2.0. Kenapa aku
tidak tahu.


Anda menerima ini karena Anda berlangganan utas ini.
Balas email ini secara langsung, lihat di GitHub
https://github.com/nltk/nltk/issues/1581#issuecomment-271100268 , atau bisukan
benang
https://github.com/notifications/unsubscribe-auth/AVTBBiywlg5c81StFrrcNOsyuF610y9uks5rP9bLgaJpZM4LdV66
.

@ExplodingCabbage, bisakah Anda menyelidiki masalah ini? Satu-satunya komit yang dapat saya lihat di porter.py setelah 3.2 telah dirilis adalah d8402e3f43ce3b7a3c7ecb45c3b8b1f75c7124e2.

Ini adalah kode yang digunakan dalam contoh yang diberikan oleh @jkarimi91.

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

Men-debug kode di atas menggunakan pdb dari dalam _apply_rule_list() di porter.py , setelah beberapa iterasi Anda mendapatkan:

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

Pada titik ini metode _ends_double_consonant() mencoba melakukan word[-1] == word[-2] dan gagal.

Jika saya tidak salah, di NLTK 3.2 metode relatifnya adalah sebagai berikut:

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)

Sejauh yang saya bisa lihat, cek len(word) < 2 tidak ada di versi baru.

Mengubah _ends_double_consonant() menjadi sesuatu seperti ini akan berhasil:

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

Astaga. Ya, sepertinya saya memecahkan ini di https://github.com/nltk/nltk/commit/d8402e3f43ce3b7a3c7ecb45c3b8b1f75c7124e2 :(

Akan PR tes dan perbaikan malam ini.

Terima kasih @jkarimi91 , @fievelk , @ExplodingCabbage

Hai, saya mengalami masalah yang sama persis hari ini. Bisakah Anda menyarankan bagaimana saya bisa memperbaiki ini? Haruskah saya memperbarui paket apa pun?

Hai @santoshbs. Anda dapat menggunakan NLTK versi master atau merilis 3.2.1 untuk menghilangkan bug; itu hanya ada di versi 3.2.2 .

@ExplodingCabbage Saya pikir Anda mengacu pada develop cabang (bukan master ). Sangat mudah untuk bingung saya kira :)

@fievelk Anda benar. Maaf, ya: Anda dapat menggunakan cabang develop atau 3.2.1 untuk menghilangkan bug.

Terima kasih banyak atas penunjuknya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat