我尝试使用下面的Stanford解析器在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 required:java.util.List [_&lt ;: edu.stanford.nlp.ling.HasWord] 在行 val解析:Tree = lp.apply(s)
我不知道这是否是正确的做法。在Scala中有没有其他简单的方法来标记句子?
答案 0 :(得分:12)
您可能想要考虑FACTORIE工具包(http://github.com/factorie/factorie)。它是机器学习和图形模型的通用库,恰好包括一套广泛的自然语言处理组件(标记化,标记规范化,形态分析,句子分割,词性标注,命名实体识别,依赖性解析,提及发现,共同参与)。
此外,它完全用Scala编写,并在Apache License下发布。
文档目前很少,但未来几个月会有所改善。
例如,一旦完成基于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
. .
答案 1 :(得分:4)
我发现了一种在Scala中进行POS标记的非常简单的方法
第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 文件放在项目的models文件夹中< / p>
然后,使用下面的代码,您可以在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 :(得分:0)
我相信斯坦福分析器的API在某种程度上有所改变。 apply
具有签名public Tree apply(java.util.List<? extends HasWord> words)
,这是您在错误消息中看到的内容。
您现在应该使用的是parse
,其中包含签名public Tree parse(java.lang.String sentence)
。