Ich kann bestimmte arabische Begriffe mit dem SnowballStemmer nicht eindämmen. Viele Begriffe werden erfolgreich gestemmt, aber einige Begriffe führen dazu, dass ein AttributeError ausgelöst wird. Im Folgenden finden Sie ein minimales Beispiel, das beim Begriff "von" fehlschlägt.
(anaconda2-4.4.0) richard-balmer-macbook:~ richardbalmer$ pip freeze | grep nltk
nltk==3.2.5
(anaconda2-4.4.0) richard-balmer-macbook:~ richardbalmer$ ipython
Python 2.7.13 |Anaconda custom (x86_64)| (default, Dec 20 2016, 23:05:08)
Type "copyright", "credits" or "license" for more information.
IPython 5.3.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: from nltk.stem.snowball import SnowballStemmer
In [2]: stemmer = SnowballStemmer('arabic')
In [3]: stemmer.stem(u'تسدد')
Out[3]: u'\u062a\u0633\u062f\u062f'
In [4]: stemmer.stem(u'من')
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-4-ffa733106049> in <module>()
----> 1 stemmer.stem(u'من')
/Users/richardbalmer/.pyenv/versions/anaconda2-4.4.0/lib/python2.7/site-packages/nltk/stem/snowball.pyc in stem(self, word)
762 modified_word = self.__Suffix_Verb_Step2b(modified_word)
763 if not self.suffix_verb_step2b_success:
--> 764 modified_word = self.__Suffix_Verb_Step2a(modified_word)
765 if self.is_noun:
766 modified_word = self.__Suffix_Noun_Step2c2(modified_word)
/Users/richardbalmer/.pyenv/versions/anaconda2-4.4.0/lib/python2.7/site-packages/nltk/stem/snowball.pyc in __Suffix_Verb_Step2a(self, token)
533 break
534
--> 535 if suffix in self.__conjugation_suffix_verb_present and len(token) > 5:
536 token = token[:-2] # present
537 self.suffix_verb_step2a_success = True
AttributeError: 'ArabicStemmer' object has no attribute '_ArabicStemmer__conjugation_suffix_verb_present'
@richbalmer Vielen Dank, dass Sie das Problem gemeldet haben.
@LBenzahia Könnten Sie helfen, dies zu untersuchen? Danke im Voraus!
Hallo @richbalmer, danke für die Meldung. Das erste Wort 'تسدد' ist der bestmögliche Stamm, da der auf einem leichten Stemming-Algorithmus basierende arabische Schneeball-Stemmer Präfixe / Suffixe behandelt. Wenn Sie nach der Wurzel von "تسدد" suchen, können Sie ISRI (Wurzel) verwenden -basierter Stemmer / Deep Stemming), Das zweite Wort 'من' ist ein Stoppwort. Sie sollten den Stoppwortfilter verwenden, bevor Sie Snowball ArabicStemmer verwenden. Auch dieser Stemmer behandelt den Fall nicht, wenn das Wort 2 Buchstaben hat.
Wie auch immer, ich habe das Problem in dieser PR # 1856 behoben.
Danke nochmal !
@LBenzahia, danke, dass hast ! Ich erhalte:
File "/Users/richardbalmer/src/nltk/nltk/stem/util.py", line 24
arabic_stopwords = ['إذ',
^
SyntaxError: Non-ASCII character '\xd8' in file /Users/richardbalmer/src/nltk/nltk/stem/util.py on line 24, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
Dies scheint auch dazu zu führen, dass die Tests auf Jenkins fehlschlagen (https://nltk.ci.cloudbees.com/job/pull_request_tests/454/TOXENV=py27-jenkins,jdk=jdk8latestOnlineInstall/testReport/nose.failure/Failure/runTest) /). Ich denke, alles was Sie tun müssen, ist # -*- coding: utf-8 -*-
an die Spitze von stem/util.py
.
Nachdem ich das lokal behoben habe, erhalte ich außerdem eine UnicodeWarning:
/Users/richardbalmer/src/nltk/nltk/stem/snowball.py:748: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
if word in arabic_stopwords:
Es könnte sich lohnen, diese Stoppwörter zu Unicode-Zeichenfolgen zu machen.
Ansonsten sieht es so aus, als ob dein Fix für mich gut funktioniert - nochmals vielen Dank!
ps Ein weiterer Vorschlag: Das Testen der Set-Inklusion ist viel schneller als das Einfügen von Listen. Daher kann es sinnvoll sein, diese Stoppwortliste stattdessen zu einem Set zu machen.
@richbalmer benutzt du python2.7? ,
Es könnte sich lohnen, diese Stoppwörter zu Unicode-Zeichenfolgen zu machen.
getan für Python2.7, testen Sie es erneut und sagen Sie mir, es funktioniert gut für mich. Ich habe die PR aktualisiert
Ja, ich benutze 2.7. Sieht gut aus @LBenzahia - nochmals
Immer noch den Fehler:
AttributeError: Das Objekt 'ArabicStemmer' hat kein Attribut '_ArabicStemmer__conjugation_suffix_verb_present'.
Ich benutze Python 3
@NouraAls in PR gelöst
Hilfreichster Kommentar
@richbalmer Vielen Dank, dass Sie das Problem gemeldet haben.
@LBenzahia Könnten Sie helfen, dies zu untersuchen? Danke im Voraus!