Extraer frases nominales de NLTK utilizando python

Soy nuevo tanto en python como en nltk. He convertido el código de https://gist.github.com/alexbowe/879414 al código que se indica a continuación para que se ejecute para muchos documentos / fragmentos de texto. Pero tengo el siguiente error

Traceback (most recent call last): File "E:/NLP/PythonProgrames/NPExtractor/AdvanceMain.py", line 16, in  result = np_extractor.extract() File "E:\NLP\PythonProgrames\NPExtractor\NPExtractorAdvanced.py", line 67, in extract for term in terms: File "E:\NLP\PythonProgrames\NPExtractor\NPExtractorAdvanced.py", line 60, in get_terms for leaf in self.leaves(tree): TypeError: leaves() takes 1 positional argument but 2 were given 

¿Puede alguien ayudarme a solucionar este problema. Tengo que extraer frases nominales de millones de reseñas de productos. Utilicé el kit Standford NLP usando Java, pero fue extremadamente lento, así que pensé que usar nltk en python sería mejor. Por favor también recomiende si hay alguna solución mejor.

 import nltk from nltk.corpus import stopwords stopwords = stopwords.words('english') grammar = r""" NBAR: {*} # Nouns and Adjectives, terminated with Nouns NP: {} {} # Above, connected with in/of/etc... """ lemmatizer = nltk.WordNetLemmatizer() stemmer = nltk.stem.porter.PorterStemmer() class NounPhraseExtractor(object): def __init__(self, sentence): self.sentence = sentence def execute(self): # Taken from Su Nam Kim Paper... chunker = nltk.RegexpParser(grammar) #toks = nltk.regexp_tokenize(text, sentence_re) # #postoks = nltk.tag.pos_tag(toks) toks = nltk.word_tokenize(self.sentence) postoks = nltk.tag.pos_tag(toks) tree = chunker.parse(postoks) return tree def leaves(tree): """Finds NP (nounphrase) leaf nodes of a chunk tree.""" for subtree in tree.subtrees(filter=lambda t: t.label() == 'NP'): yield subtree.leaves() def normalise(word): """Normalises words to lowercase and stems and lemmatizes it.""" word = word.lower() word = stemmer.stem_word(word) word = lemmatizer.lemmatize(word) return word def acceptable_word(word): """Checks conditions for acceptable word: length, stopword.""" accepted = bool(2 <= len(word) <= 40 and word.lower() not in stopwords) return accepted def get_terms(self,tree): for leaf in self.leaves(tree): term = [self.normalise(w) for w, t in leaf if self.acceptable_word(w)] yield term def extract(self): terms = self.get_terms(self.execute()) matches = [] for term in terms: for word in term: matches.append(word) return matches 

Usted necesita:

  • decorar cada uno de normalize , acceptable_word y se leaves con @staticmethod, o
  • agregue un parámetro self como el primer parámetro de estos métodos.

Está llamando a self.leaves que pasará self como primer parámetro implícito al método de las leaves (pero su método solo toma un solo parámetro). Hacer estos métodos estáticos, o agregar un parámetro self solucionará este problema.

(tus llamadas posteriores a self.acceptable_word y self.normalize tendrán el mismo problema)

Puede leer sobre los métodos estáticos de Python en sus documentos , o posiblemente desde un sitio externo que puede ser más fácil de digerir.