Nltk: ArabicStemmer AttributeError

Créé le 11 oct. 2017  ·  7Commentaires  ·  Source: nltk/nltk

Je n'arrive pas à endiguer certains termes arabes en utilisant SnowballStemmer. De nombreux termes sont résolus avec succès, mais certains termes provoquent le déclenchement d'une AttributeError. Veuillez voir ci-dessous pour un exemple minimal qui échoue sur le terme «de».

(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'
bug pleaseverify resolved tests

Commentaire le plus utile

@richbalmer Merci d'avoir signalé le problème.

@LBenzahia Pourriez-vous nous aider à vous pencher là-

Tous les 7 commentaires

@richbalmer Merci d'avoir signalé le problème.

@LBenzahia Pourriez-vous nous aider à vous pencher là-

Salut @richbalmer merci pour le rapport, le premier mot 'تسدد' est le meilleur radical possible car le radical arabe Snowball basé sur l'algorithme de dérivation léger traite les préfixes / suffixes, si vous recherchez la racine de "تسدد", vous pouvez utiliser ISRI (root -based stemmer / deep stemming), Le deuxième mot 'من' est un mot stop, vous devez utiliser un filtre de mot stop avant de commencer à utiliser Snowball ArabicStemmer, De plus, ce stemmer ne traite pas le cas lorsque le mot a 2 lettres.
Quoi qu'il en soit, j'ai résolu le problème dans ce PR # 1856.
Merci encore !

@LBenzahia merci d'avoir examiné cela si rapidement! Je suis en train:

  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

Ce qui semble également entraîner l'échec des tests sur Jenkins (https://nltk.ci.cloudbees.com/job/pull_request_tests/454/TOXENV=py27-jenkins,jdk=jdk8latestOnlineInstall/testReport/nose.failure/Failure/runTest /). Je pense que tout ce que vous avez à faire est de mettre # -*- coding: utf-8 -*- en haut de stem/util.py .

De plus, après avoir corrigé cela localement, j'obtiens un 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:

Cela pourrait valoir la peine de créer des chaînes Unicode pour ces mots vides.

A part ça, il semble que votre correctif fonctionne bien pour moi - merci encore!

ps Une autre suggestion: tester l'inclusion d'un ensemble est beaucoup plus rapide que l'inclusion d'une liste, il peut donc valoir la peine de faire de cette liste de mots vides un ensemble à la place.

@richbalmer utilisez-vous python2.7? ,

Cela pourrait valoir la peine de créer des chaînes Unicode pour ces mots vides.

fait pour python2.7, testez-le à nouveau et dites-moi, cela fonctionne très bien pour moi. j'ai mis à jour le PR

Oui, j'utilise 2.7. Vous cherchez bien @LBenzahia - merci encore!

J'ai toujours l'erreur:
AttributeError: l'objet 'ArabicStemmer' n'a pas d'attribut '_ArabicStemmer__conjugation_suffix_verb_present'

J'utilise python 3

@NouraAls résolu en PR

Cette page vous a été utile?
0 / 5 - 0 notes