Маркировка POS в Scala

Я попытался пометить POS-тегом предложение в Scala, используя синтаксический анализатор Stanford, как показано ниже.

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 required: java.util.List[_ ‹: edu.stanford.nlp.ling.HasWord] в строке val parse :Tree = lp.apply(s)< /сильный>

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


person yAsH    schedule 24.08.2013    source источник


Ответы (3)


Вы можете рассмотреть набор инструментов 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   
.          .    
person mccallum    schedule 24.08.2013
comment
Я только что добавил factory-1.0.0-M6.jar в путь сборки, и он показывает, что ошибка не найдена: значение DocumentAnnotatorPipeline в строке DocumentAnnotatorPipeline.process(pos.POS1, doc). Нужно ли мне добавлять больше банок, чтобы заставить его работать? - person yAsH; 28.08.2013
comment
Вам нужна самая современная версия с GitHub. Мы надеемся сделать еще одну веху через пару недель. - person mccallum; 28.08.2013

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

Шаг 1

Загрузите Stanford tagger версии 3.2.0 по ссылке ниже.

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

Шаг 2

Добавьте банку 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

person yAsH    schedule 29.10.2013
comment
Есть привязки scala, которые делают это еще проще! для установки требуется немного работы, но затем все это сжимается до одной строки. Библиотека находится здесь - person Ritwik Bose; 01.04.2015

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

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

person prash    schedule 25.08.2013