2013-08-24 13 views
11

Próbowałem tagu POS zdanie w Scala użyciu Stanford parser jak poniżejPOS tagowanie w 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) 

Dostałem błąd niezgodność typów; znaleziono: java.labg.String wymagane: java.util.List [_ <: edu.stanford.nlp.ling.HasWord] w linii val parsowania: Drzewo = lp.apply (e)

I nie wiem, czy to jest właściwy sposób, czy nie. Czy są jakieś inne łatwe sposoby na oznaczanie przez POS zdania w Scali?

Odpowiedz

4

znalazłem bardzo prosty sposób to zrobić POS tagowanie w Scala

Krok 1

Pobierz Stanford Taggera wersji 3.2.0 tworząc poniższy odnośnik

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

Krok 2

Dodaj Stanford-postagger jar w folderze do projektu, a także umieszczać plik -distsim.tagger angielski-left3words obecny w folderze modeli w twoim projekcie

Następnie, za pomocą poniższego kodu możesz pos tag zdanie w Scala

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

wyjściowa: My_PRP $ name_NN is_VBZ Rahul_NNP

+0

Istnieją wiązania scala, które czynią go jeszcze łatwiejszym! wykonanie instalacji zajmuje trochę czasu, ale wtedy cała ta sprawa zostaje skondensowana do pojedynczej linii. Biblioteka jest [tutaj] (https://github.com/gangeli/CoreNLP-Scala) –

12

Być może spodoba Ci się zestaw narzędzi FACTORIE (http://github.com/factorie/factorie). Jest to ogólna biblioteka do uczenia maszynowego i modeli graficznych, która obejmuje obszerny zestaw komponentów przetwarzania języka naturalnego (tokenizacja, normalizacja tokena, analiza morfologiczna, segmentacja zdań, oznaczanie części mowy, rozpoznawanie nazwanej encji, analiza zależności, wzmianka znalezienie, coreference).

Ponadto jest napisany w całości w Scala i jest wydany na licencji Apache.

Dokumentacja jest obecnie skąpa, ale będzie się poprawiać w nadchodzących miesiącach.

Na przykład, gdy instalacja Maven oparte jest gotowy można wpisać w wierszu poleceń:

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

uruchomienie wielowątkowy serwer NLP Gniazdo słuchania. Następnie zapytania go przez orurowanie zwykłego tekstu numeru gniazda:

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 

wyjście jest następnie

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 

oczywiście jest programowym API całej tej funkcji, jak również.

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

wyjście wola:

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

Właśnie dodałem factorie-1.0.0-M6.jar do ścieżki budowania i to pokazuje się błąd "Nie znaleziono: Wartość DocumentAnnotatorPipeline" na linii DocumentAnnotatorPipeline. proces (pos.POS1, doc). Czy muszę dodać więcej słoików, aby działało? – yAsH

+0

Potrzebujesz najnowszej wersji GitHub. Mamy nadzieję, że zrobimy kolejny kamień milowy w ciągu kilku tygodni. – mccallum

0

Wierzę, że API Stanford Parser zmieniła się nieco, jak to robi czasem. apply ma podpis, public Tree apply(java.util.List<? extends HasWord> words), i to jest to, co widzisz w komunikacie o błędzie.

Należy teraz użyć nazwy parse, która ma podpis public Tree parse(java.lang.String sentence).

Powiązane problemy