Пометка 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 требуется: java.util.List [_ <: edu.stanford.nlp.ling.HasWord] в строке val parse: Tree = lp.apply(s)
Я не знаю, правильно ли это делается или нет. Существуют ли какие-либо другие простые способы POS-маркировки предложения в Scala?
Ответы
Ответ 1
Я нашел очень простой способ сделать тег POS в Scala
Шаг 1
Загрузите stanford tagger версию 3.2.0 из нижеуказанной ссылки
http://nlp.stanford.edu/software/stanford-postagger-2013-06-20.zip
Шаг 2
Добавьте stanford-postagger jar, присутствующий в папке к вашему проекту, а также разместите файл 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
Ответ 2
Возможно, вам стоит рассмотреть инструментарий 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
. .
Ответ 3
Я считаю, что API Стэнфордского Парсера несколько изменился, как это иногда бывает. apply
имеет подпись, public Tree apply(java.util.List<? extends HasWord> words)
, и это то, что вы видите в сообщении об ошибке.
Теперь вы должны использовать parse
, который имеет подпись public Tree parse(java.lang.String sentence)
.