Nltk: أصوات العتال: فهرس السلسلة خارج النطاق

تم إنشاؤها على ٧ يناير ٢٠١٧  ·  12تعليقات  ·  مصدر: nltk/nltk

انظر المنشور التالي

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 (سواء كان ملف بيثون منفصل أو وحدة تحكم بيثون تفاعلية) لا ينتج عنه أي خطأ. بعبارة أخرى:

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

تليها:

python test.py
# successfully prints 'o'

ما سبب هذه المشكلة؟

لقد وجدت أن هذه المشكلة خاصة بالإصدار 3.2.2 من nltk. في الأصل ، قمت بتشغيل test.py باستخدام ipython وليس python ، كما هو مذكور أعلاه. بطريقة ما ، تمكنت من الوصول إلى تثبيت ipython في بيئتي الجذرية //anaconda/bin/ipython على الرغم من أنني لم أحدد ipython في بيئة مشروع django الافتراضية (المنشطة) //anaconda/envs/xkcd/bin/ . نتيجة لذلك ، لابد أن ipython كان يستخدم nltk installtion المحدد في بيئة الجذر الخاصة بي أيضًا والتي تعمل بالإصدار 3.2.0.

للتوضيح ، اكتشفت أن PorterStemmer فشل في إيقاف السلسلة 'oed' في إصدار nltk 3.2.2 ولكن ليس في الإصدار 3.2.0 من nltk. لماذا ليس لدي فكرة.

كملاحظة جانبية ، كنت أستخدم python 2 في كلتا الحالتين. تستخدم بيئة الجذر الخاصة بي لغة python 2.7.11 وتستخدم بيئة مشروع django الخاص بي لغة python 2.7.13

مهلا،
آسف لهذه (المشكلة) ، أعني أنني لم أستخدم جيثب أبدًا ، لقد كان كذلك
حدث عن طريق الخطأ. لا أعرف ما الذي أطلقه للتو!

في 7 كانون الثاني (يناير) 2017 الساعة 11:47 مساءً ، كتب "jkarimi91" [email protected] :

لقد وجدت أن هذه المشكلة خاصة بالإصدار 3.2.2 من nltk.
في الأصل ، قمت بإجراء test.py باستخدام ipython وليس python ، كما هو مذكور أعلاه.
بطريقة ما ، تمكنت من الوصول إلى تثبيت ipython في جذر
البيئة // anaconda / bin / ipython على الرغم من أنني لم أحددها
ipython في بيئتي الافتراضية النشطة حاليًا
// anaconda / envs / xkcd / bin /. نتيجة لذلك ، لابد أن ipython كان يستخدم الامتداد
nltk installtion المحدد في بيئة الجذر الخاصة بي وكذلك الذي يقوم بتشغيل الإصدار
3.2.0.

للتوضيح ، لقد اكتشفت أن PorterStemmer فشل في وقف ملف
السلسلة 'oed' في الإصدار 3.2.2 من nltk ولكن ليس في الإصدار 3.2.0 من nltk. لماذا أنا
ليس لدي فكرة.

-
أنت تتلقى هذا لأنك مشترك في هذا الموضوع.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على 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 :(

سوف العلاقات العامة اختبار وإصلاح الليلة.

شكرا @ jkarimi91 ، fievelk ، ExplodingCabbage

مرحبًا ، لقد واجهت نفس المشكلة اليوم. هل يمكن أن تقترحوا كيف يمكنني الحصول على إصلاح لهذا؟ هل يجب علي تحديث أي حزم؟

مرحبا @ santoshbs. يمكنك إما استخدام إصدار NLTK master أو إصدار 3.2.1 للتخلص من الخطأ ؛ إنه موجود فقط في الإصدار 3.2.2 .

ExplodingCabbage أعتقد أنك تشير إلى الفرع develop (وليس master ). أعتقد أنه من السهل الخلط بينكما :)

fievelk أنت على حق تماما. عذرًا ، نعم: يمكنك استخدام الفرع develop أو 3.2.1 للتخلص من الخطأ.

شكرا جزيلا للمؤشر.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

alvations picture alvations  ·  4تعليقات

chaseireland picture chaseireland  ·  3تعليقات

libingnan54321 picture libingnan54321  ·  3تعليقات

vezeli picture vezeli  ·  3تعليقات

alvations picture alvations  ·  4تعليقات