2017-01-07 2 views
1

Ich verwende derzeit die Python-Schnittstelle für den Stanford-Parser.Stanford Parser für Python: Ausgabeformat

from nltk.parse.stanford import StanfordParser 
    import os 

    os.environ['STANFORD_PARSER'] ='/Users/au571533/Downloads/stanford-parser-full-2016-10-31' 
    os.environ['STANFORD_MODELS'] = '/Users/au571533/Downloads/stanford-parser-full-2016-10-31' 
    parser=StanfordParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz") 

    new=list(parser.raw_parse("The young man who boarded his usual train that Sunday afternoon was twenty-four years old and fat. ")) 
    print new 

Der Ausgang I sieht wie folgt aus etwas bekommen:

[Tree('ROOT', [Tree('S', [Tree('NP', [Tree('NP', [Tree('DT', ['The']), Tree('JJ', ['young']), Tree('NN', ['man'])]), Tree('SBAR', [Tree('WHNP', [Tree('WP', ['who'])]), Tree('S', [Tree('VP', [Tree('VBD', ['boarded']), Tree('NP', [Tree('PRP$', ['his']), Tree('JJ', ['usual']), Tree('NN', ['train'])]), Tree('NP', [Tree('DT', ['that']), Tree('NNP', ['Sunday'])])])])])]), Tree('NP', [Tree('NN', ['afternoon'])]), Tree('VP', [Tree('VBD', ['was']), Tree('NP', [Tree('NP', [Tree('JJ', ['twenty-four']), Tree('NNS', ['years'])]), Tree('ADJP', [Tree('JJ', ['old']), Tree('CC', ['and']), Tree('JJ', ['fat'])])])]), Tree('.', ['.'])])])] 

Allerdings habe ich nur den Teil der Rede Etiketten benötigen, deshalb würde Ich mag eine Ausgabe in einem Format haben, wie Wort aussieht /Etikett.

In Java ist es möglich, -outputFormat 'wordsAndTags' anzugeben und es gibt genau das, was ich will. Irgendein Hinweis, wie man das in Python implementiert?

Hilfe wäre sehr geschätzt. Danke!

PS:. Versucht, die Stanford POSTagger zu verwenden, aber es ist bei weitem weniger genau auf einige der Wörter, die mich interessieren

+0

Können Sie in einem Beispiel bearbeiten, wie die Ausgabe aussehen soll? –

+0

Für den Satz im obigen Code, etwas wie: ['The/DT', 'jung/JJ', 'man/NN'], entweder eine Liste von stringähnlichen Elementen oder eine Liste von Tupeln oder einer Tabelle gut. Die Quintessenz ist: Ich brauche nicht die Dependency Tree Informationen, sondern nur Teile der Sprache für jedes Wort. Vielen Dank! :) – roberta

Antwort

1

Wenn man sich the NLTK classes for the Stanford parser anschaut, kann man sehen, dass das die raw_parse_sents() Methode doesn‘ t senden Sie die -outputFormat wordsAndTags Option, die Sie möchten, und sendet stattdessen -outputFormat Penn. Wenn Sie eine eigene Klasse von StanfordParser ableiten, können Sie diese Methode überschreiben und das Format wordsAndTags angeben.

from nltk.parse.stanford import StanfordParser 

class MyParser(StanfordParser): 

     def raw_parse_sents(self, sentences, verbose=False): 
     """ 
     Use StanfordParser to parse multiple sentences. Takes multiple sentences as a 
     list of strings. 
     Each sentence will be automatically tokenized and tagged by the Stanford Parser. 
     The output format is `wordsAndTags`. 

     :param sentences: Input sentences to parse 
     :type sentences: list(str) 
     :rtype: iter(iter(Tree)) 
     """ 
     cmd = [ 
      self._MAIN_CLASS, 
      '-model', self.model_path, 
      '-sentences', 'newline', 
      '-outputFormat', 'wordsAndTags', 
     ] 
     return self._parse_trees_output(self._execute(cmd, '\n'.join(sentences), verbose)) 
+0

Klingt gut! Wäre es möglich, dass Sie ein schnelles Beispiel dafür zeigen, wie es geht? Ich bin noch nicht so ein guter Programmierer: D Danke! – roberta

+0

Danke! Immer noch ein kleines Problem: Es wird die Fehlermeldung "MyParser hat kein Attribut '_make_tree'" ausgegeben, was anscheinend von _parse_trees_output in stanford.py> GenericStanfordParser (ParserI) benötigt wird. Danke für Ihre Hilfe! – roberta

+0

Ah, ich verstehe. Versuchen Sie stattdessen, von "StanfordParser" zu erben. –

Verwandte Themen