POS-маркировка в Scala
Я попытался пометить предложение в 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.ленг.Требуется строка: java.утиль.Список[_ в строке val parse: Tree = lp.apply (s)
Я не знаю, является ли это правильный способ сделать это или нет. Есть ли другие простые способы пометить предложение в Scala?
3 ответов
вы могли бы рассмотреть factorie toolkit (http://github.com/factorie/factorie). Это общая библиотека для машинного обучения и графических моделей, которая включает в себя обширный набор компонентов обработки естественного языка (токенизация, нормализация токенов, морфологический анализ, сегментация предложений, маркировка части речи, распознавание именованных сущностей, анализ зависимостей, поиск упоминаний, coreference).
кроме того написано полностью в Scala, и он выпущен под лицензией Apache.
документация в настоящее время негусто, но будет улучшаться в ближайшие месяцы.
например, после завершения установки на основе Maven вы можете ввести в командной строке:
bin/fac nlp --pos1 --parser1 --ner1
запустить сокет-слушать многопоточная НЛП сервер. Затем запросите его, отправив простой текст на номер сокета:
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
. .
Я нашел очень простой способ сделать POS-тегирование в Scala
Шаг 1
скачать stanford tagger версии 3.2.0 образуют ссылку ниже
http://nlp.stanford.edu/software/stanford-postagger-2013-06-20.zip
Шаг 2
добавить Стэнфорд-postagger jar присутствует в папке вашего проекта, а также поместите английский-left3words-distsim.Таггер!-Файл -5--> присутствует в папке models в вашем проекте
затем с помощью кода ниже вы можете пометить предложение в 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
Я считаю, что API Стэнфордского парсера несколько изменился, как это иногда бывает. apply
имеет подпись, public Tree apply(java.util.List<? extends HasWord> words)
, а это то, что вы видите в сообщении об ошибке.
что вы должны использовать сейчас parse
, в котором имеется подпись public Tree parse(java.lang.String sentence)
.