2010-09-17 4 views
9

J'utilise Stanford Parser pour analyser les relations de dépendance entre les mots, mais j'ai aussi besoin de l'étiquetage des mots. Cependant, dans le fichier ParseDemo.java, le programme affiche uniquement l'arbre de marquage. J'ai besoin de marquage de chaque mot comme ceci:Comment obtenir POS marquage à l'aide de Stanford Parser

My/PRP$ dog/NN also/RB likes/VBZ eating/VBG bananas/NNS ./. 

pas comme ça:

(ROOT 
    (S 
    (NP (PRP$ My) (NN dog)) 
    (ADVP (RB also)) 
    (VP (VBZ likes) 
     (S 
     (VP (VBG eating) 
      (S 
      (ADJP (NNS bananas)))))) 
    (. .))) 

Qui peut me aider? Merci beaucoup.

Répondre

12

Si vous êtes principalement intéressé à manipuler les balises dans un programme, et ne pas besoin de la fonctionnalité TreePrint, vous pouvez simplement obtenir les mots dans la catégorie d'une liste:

LexicalizedParser lp = 
    LexicalizedParser.loadModel("edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz"); 
Tree parse = lp.apply(Arrays.asList(sent)); 
List taggedWords = parse.taggedYield();  
+0

Qu'est-ce que lp? .... –

+1

Un LexicalizedParser ... édité ci-dessus. –

+0

@ChristopherManning Comment cela peut-il être réalisé en python –

3

Lors de l'exécution edu.stanford.nlp.parser.lexparser.LexicalizedParser sur la ligne de commande, vous souhaitez utiliser:

-outputFormat "wordsAndTags" 

Programatically, utilisez la classe TreePrint construit avec FormatString = "wordsAndTags" et appelez printTree , comme ceci:

TreePrint posPrinter = new TreePrint("wordsAndTags", yourPrintWriter); 
posPrinter.printTree(yourLexParser.getBestParse()); 
2
String[] sent = { "This", "is", "an", "easy", "sentence", "." }; 
List<CoreLabel> rawWords = Sentence.toCoreLabelList(sent); 
Tree parse = lp.apply(rawWords); 
ArrayList ar=parse.taggedYield(); 
System.out.println(ar.toString()); 
+0

qu'est-ce que 'lp' ici? Vous avez manqué de l'expliquer. – talha06

+1

@ talha06: Je suppose que c'est un LexicalizedParser – citronas

+0

Oui, c'est un LexicalizedParser. –

0

Cette réponse est un peu vieillot alors j'ai décidé d'ajouter mon propre. Donc, avec la version Stanford Parser 3.6.0 (dépendances maven):

<dependency> 
     <groupId>edu.stanford.nlp</groupId> 
     <artifactId>stanford-parser</artifactId> 
     <version>3.6.0</version> 
    </dependency> 
    <dependency> 
     <groupId>edu.stanford.nlp</groupId> 
     <artifactId>stanford-corenlp</artifactId> 
     <version>3.6.0</version> 
    </dependency> 
    <dependency> 
     <groupId>edu.stanford.nlp</groupId> 
     <artifactId>stanford-corenlp</artifactId> 
     <version>3.6.0</version> 
     <classifier>models</classifier> 
    </dependency> 

 private static MaxentTagger tagger = new MaxentTagger(MaxentTagger.DEFAULT_JAR_PATH); 
     public String getTaggedString(String someString) { 

      String taggedString = tagger.tagString(someString); 
      return taggedString; 
     } 

Cela retour I_PRP claim_VBP the_DT rights_NNS pour 'I claim the rights'

Donc, si vous voulez détecter les verbes dans une phrase en utilisant java et stanford parser vous pouvez le faire:

public boolean containsVerb(String someString) { 
     String taggedString = tagger.tagString(someString); 
     String[] tokens = taggedString.split(" "); 
     for (String tok : tokens){ 
      String[] taggedTokens = tok.split("_"); 
      if (taggedTokens[1].startsWith("VB")){ 
       return true; 
      } 

     } 
     return false; 
}