2013-08-24 16 views
11

habe ich versucht, POS-Tag einen Satz in Scala mit der Stanford-Parser wie unterPOS-Tagging in Scala

val lp:LexicalizedParser = LexicalizedParser.loadModel("edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz"); 
lp.setOptionFlags("-maxLength", "50", "-retainTmpSubcategories") 
val s = "I love to play" 
val parse :Tree = lp.apply(s) 
val taggedWords = parse.taggedYield() 
println(taggedWords) 

Ich habe einen Fehler Typenkonflikt; gefunden: erforderlich java.lang.String: java.util.List [_ <: edu.stanford.nlp.ling.HasWord] in der Linie val Parse: Baum = lp.apply (e)

I Ich weiß nicht, ob dies der richtige Weg ist oder nicht. Gibt es noch andere einfache Möglichkeiten, einen Satz in Scala zu markieren?

Antwort

4

fand ich eine sehr einfache Art und Weise POS-Tagging in Scala

Schritt 1

Herunterladen Stanford Tagger Version 3.2 zu tun.0 bilden den Link unten

http://nlp.stanford.edu/software/stanford-postagger-2013-06-20.zip

Schritt 2

hinzufügen Stanford-postagger jar in dem Ordner zu einem Projekt und legen auch die Englisch-left3words-distsim.tagger Datei in dem Ordner Modelle in Ihrem Projekt

Dann können Sie mit dem Code unten einen Satz in Scala

pos pos
   val tagger = new MaxentTagger(
       "english-left3words-distsim.tagger") 
       val art_con = "My name is Rahul" 
       val tagged = tagger.tagString(art_con) 
       println(tagged) 

Ausgang: My_PRP $ name_NN is_VBZ Rahul_NNP

+0

Es gibt Scala-Bindungen, die es noch einfacher machen! Es braucht ein wenig Arbeit, um es zu installieren, aber dann wird das Ganze zu einer einzigen Zeile zusammengefasst. Die Bibliothek ist [hier] (https://github.com/gangeli/CoreNLP-Scala) –

12

Vielleicht möchten Sie das FACTORIE Toolkit (http://github.com/factorie/factorie) in Betracht ziehen. Es ist eine allgemeine Bibliothek für maschinelles Lernen und grafische Modelle, die eine umfangreiche Suite natürlicher Verarbeitungskomponenten enthält (Tokenisierung, Token-Normalisierung, morphologische Analyse, Satzsegmentierung, Wort-Teil-Kennzeichnung, Erkennung von benannten Entitäten, Abhängigkeitsanalyse, Erwähnung) Finden, Koreferenz).

Darüber hinaus ist es vollständig in Scala geschrieben, und es ist unter der Apache-Lizenz veröffentlicht.

Die Dokumentation ist derzeit spärlich, wird sich aber in den kommenden Monaten verbessern.

Zum Beispiel, wenn Maven-basierte Installation abgeschlossen ist, können Sie in der Befehlszeile eingeben:

bin/fac nlp --pos1 --parser1 --ner1 

einen Buchse Hören Multi-Threaded-NLP-Server zu starten. Abfrage dann von Klartext in seine Steckdose kochend:

echo "Mr. Jones took a job at Google in New York. He and his Australian wife moved from New South Wales on 4/1/12." | nc localhost 3228 

Der Ausgang dann

1  1  Mr.    NNP  2  nn  O 
2  2  Jones   NNP  3  nsubj U-PER 
3  3  took   VBD  0  root O 
4  4  a    DT  5  det  O 
5  5  job    NN  3  dobj O 
6  6  at    IN  3  prep O 
7  7  Google   NNP  6  pobj U-ORG 
8  8  in    IN  7  prep O 
9  9  New    NNP  10  nn  B-LOC 
10  10  York   NNP  8  pobj L-LOC 
11  11  .    .  3  punct O 

12  1  He    PRP  6  nsubj O 
13  2  and    CC  1  cc  O 
14  3  his    PRP$ 5  poss O 
15  4  Australian  JJ  5  amod U-MISC 
16  5  wife   NN  6  nsubj O 
17  6  moved   VBD  0  root O 
18  7  from   IN  6  prep O 
19  8  New    NNP  9  nn  B-LOC 
20  9  South   NNP  10  nn  I-LOC 
21  10  Wales   NNP  7  pobj L-LOC 
22  11  on    IN  6  prep O 
23  12  4/1/12   NNP  11  pobj O 
24  13  .    .  6  punct O 

Natürlich ist es eine programmatische API, um alle diese Funktionalität als auch.

import cc.factorie._ 
import cc.factorie.app.nlp._ 
val doc = new Document("Education is the most powerful weapon which you can use to change the world.") 
DocumentAnnotatorPipeline(pos.POS1).process(doc) 
for (token <- doc.tokens) 
    println("%-10s %-5s".format(token.string, token.posLabel.categoryValue)) 

AUSGABE:

Education NN 
is   VBZ 
the  DT 
most  RBS 
powerful JJ 
weapon  NN 
which  WDT 
you  PRP 
can  MD 
use  VB 
to   TO 
change  VB 
the  DT 
world  NN 
.   .  
+0

ich nur factorie-1.0.0-M6.jar zu dem Build-Pfad hinzugefügt und es zeigt den Fehler "nicht gefunden: Wert DocumentAnnotatorPipeline" on line DocumentAnnotatorPipeline. Prozess (pos.POS1, doc). Muss ich noch weitere Gläser hinzufügen, damit es funktioniert? – yAsH

+0

Sie benötigen die neueste Version von GitHub. Wir hoffen, in ein paar Wochen einen weiteren Meilenstein zu erreichen. – mccallum

0

Ich glaube, die API des Stanford-Parser etwas geändert hat, wie es manchmal der Fall ist. apply hat die Signatur public Tree apply(java.util.List<? extends HasWord> words), und das ist, was Sie in der Fehlermeldung sehen.

Was Sie jetzt verwenden sollten, ist parse, die die Signatur public Tree parse(java.lang.String sentence) hat.