POS-теги в Scala

Я попытался пометить POS предложение в 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)

Я получил несоответствие типа ошибки ; найдено: java.lang.String Обязательно: java.util.List[_ <: edu.stanford.nlp.ling.HasWord] в строке val parse:Tree = lp.apply(s)

Я не знаю, правильно ли это делать или нет. Существуют ли другие простые способы пометки POS-предложений в Scala?

3 ответа

Решение

Я нашел очень простой способ сделать POS-теги в Scala

Шаг 1

Скачайте stanford tagger версии 3.2.0 по ссылке ниже

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

Шаг 2

Добавьте jar -файл stanford-postagger, находящийся в папке, в ваш проект, а также поместите файл english-left3words-distsim.tagger, присутствующий в папке моделей в вашем проекте.

Затем с помощью кода ниже вы можете пометить предложение в Scala

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

Вывод: My_PRP $ name_NN is_VBZ Rahul_NNP

Возможно, вы захотите рассмотреть инструментарий FACTORIE ( http://github.com/factorie/factorie). Это общая библиотека для машинного обучения и графических моделей, которая включает в себя обширный набор компонентов обработки естественного языка (токенизация, нормализация токенов, морфологический анализ, сегментация предложений, тегирование части речи, распознавание именованных объектов, анализ зависимостей, упоминание нахождение, корреляция).

Кроме того, он полностью написан на Scala и выпущен под лицензией Apache.

Документация в настоящее время скудна, но будет улучшаться в ближайшие месяцы.

Например, после завершения установки на основе Maven вы можете ввести в командной строке:

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

запустить многопоточный NLP-сервер с прослушиванием сокетов. Затем запросите его, отправив обычный текст на номер его сокета:

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

Выходной то

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

Конечно, есть программный API для всей этой функциональности.

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

будет выводить:

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

Я считаю, что API Stanford Parser несколько изменился, как это иногда бывает. apply имеет подпись, public Tree apply(java.util.List<? extends HasWord> words)и это то, что вы видите в сообщении об ошибке.

То, что вы должны использовать сейчас parse, который имеет подпись public Tree parse(java.lang.String sentence),

Другие вопросы по тегам