للرجوع إليها في المستقبل ، أنسخ / ألصق سؤالك هنا:
لدي مجموعة من المستندات النصية المخللة التي أود اشتقاقها باستخدام 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
للتخلص من الخطأ.
شكرا جزيلا للمؤشر.
التعليق الأكثر فائدة
fievelk أنت على حق تماما. عذرًا ، نعم: يمكنك استخدام الفرع
develop
أو3.2.1
للتخلص من الخطأ.