我正在尝试使用GitHub中的以下代码片段,以便可以在Groovy脚本中使用OpenNLP工具。
(来自https://gist.github.com/nagaimasato/1178725的OpenNLP类)
#!/usr/bin/env groovy
@Grapes(
@Grab(
group='org.apache.opennlp',
module='opennlp-tools',
version='1.5.3'
)
)
import opennlp.tools.tokenize.*
import opennlp.tools.postag.*
OpenNLP nlp = new OpenNLP()
def tokens = nlp.workTokenize("Hello world")
println tokens
class OpenNLP {
static TokenizerModel tokenizerModel
static POSModel posModel
static {
def classLoader = OpenNLP.class.classLoader
classLoader.getResource('opennlp/en-token.bin').withInputStream {
tokenizerModel = new TokenizerModel(it)
}
classLoader.getResource('opennlp/en-pos-maxent.bin').withInputStream {
posModel = new POSModel(it)
}
}
Tokenizer tokenizer
POSTagger tagger
OpenNLP() {
tokenizer = new TokenizerME(tokenizerModel)
tagger = new POSTaggerME(posModel)
}
List workTokenize(String text) {
return tokenizer.tokenize(text)
}
List posTag(List tokens) {
return [tokens, tagger.tag(tokens)].transpose()
}
}当我尝试运行脚本时,我得到了以下错误:
Caught: java.lang.ExceptionInInitializerError
java.lang.ExceptionInInitializerError
at Greetings.class$(Greetings.groovy)
at Greetings.$get$$class$OpenNLP(Greetings.groovy)
at Greetings.run(Greetings.groovy:13)
Caused by: java.lang.NullPointerException: Cannot invoke method withInputStream() on null object
at OpenNLP.<clinit>(Greetings.groovy:25)
... 3 more我将en-token.bin和en-pos-maxent.bin放在脚本可以找到的正确位置,但是当我打印它时,classLoader.getResource("opennlp/en-token.bin")确实是空的。有什么想法吗?
发布于 2013-07-21 10:57:33
确保en-token.bin和en-pos-maxent.bin文件位于名为opennlp的目录中,并且类路径包含opennlp的父目录。
请注意,当您执行Groovy脚本时,./包含在类路径中,因此,如果您的opennlp目录与Groovy脚本位于同一目录中,并且您也在该目录中调用了Groovy脚本,那么它应该可以工作(至少对我来说是这样)。但是,如果您在当前不在该目录中的情况下执行脚本(例如,使用像path/to/script.groovy这样的路径),它将不起作用。在这种情况下,您可以只使用groovy -cp path/to path/to/script.groovy调用它,从而将opennlp目录的父目录手动放入类路径中。
https://stackoverflow.com/questions/16178297
复制相似问题