2013-08-24 6 views
11

ho cercato di tag POS una frase in Scala utilizzando Stanford parser come qui di seguitoPOS etichettatura a 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) 

ho ottenuto un errore di tipo non corrispondente ; trovato: java.lang.String richiesto: java.util.List [_ <: edu.stanford.nlp.ling.HasWord] nella linea val parse: albero = lp.apply (s)

I non so se questo sia il modo giusto di farlo o no. Esistono altri modi semplici per la codifica POS di una frase in Scala?

risposta

4

ho trovato un modo molto semplice da fare POS tag a Scala

Fase 1

Scarica Stanford Tagger versione 3.2.0 formare sul link qui sotto

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

Fase 2

Aggiungere stanford-postagger vaso presente nella cartella al progetto e anche posizionare il file di-distsim.tagger english-left3words presente nella cartella dei modelli nel tuo progetto

Quindi, con il codice seguente puoi posare tag una frase in Scala

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

uscita: My_PRP $ name_NN is_VBZ Rahul_NNP

+0

Ci sono collegamenti scala che rendono ancora più semplice! ci vuole un po 'di lavoro da installare, ma poi tutta questa cosa si condensa in una singola riga. La biblioteca è [qui] (https://github.com/gangeli/CoreNLP-Scala) –

12

Si potrebbe prendere in considerazione il toolkit FACTORIE (http://github.com/factorie/factorie). Si tratta di una libreria generale per l'apprendimento automatico e modelli grafici che comprende una vasta suite di componenti di elaborazione del linguaggio naturale (tokenizzazione, normalizzazione dei token, analisi morfologica, segmentazione della frase, tag di parte del discorso, riconoscimento di entità con nome, analisi di dipendenza, menzione ricerca, coreferenza).

Inoltre è scritto interamente in Scala ed è rilasciato con la licenza Apache.

La documentazione è attualmente scarsa, ma migliorerà nei prossimi mesi.

Ad esempio, una volta l'installazione Maven-based è terminato è possibile digitare sulla riga di comando:

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

per lanciare un server NLP multi-threaded socket di ascolto. Poi interrogare convogliando testo normale al suo numero di socket:

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 

L'uscita è quindi

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 

Naturalmente v'è un'API di programmazione di tutte queste funzionalità pure.

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)) 

stamperà:

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

Ho appena aggiunto factorie-1.0.0-M6.jar al percorso di generazione e sta mostrando l'errore "non trovato: il valore DocumentAnnotatorPipeline" on line DocumentAnnotatorPipeline. processo (pos.POS1, doc). Devo aggiungere altri barattoli per farlo funzionare? – yAsH

+0

Hai bisogno della versione all'avanguardia di GitHub. Speriamo di fare un'altra pietra miliare in un paio di settimane. – mccallum

0

Credo API della Stanford Parser è cambiato leggermente, come fa a volte. apply ha la firma, public Tree apply(java.util.List<? extends HasWord> words) e questo è ciò che viene visualizzato nel messaggio di errore.

Quello che dovresti usare ora è parse, che ha la firma public Tree parse(java.lang.String sentence).