0

我正在尝试从 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") 确实为空。有任何想法吗?

4

1 回答 1

0

确保en-token.binen-pos-maxent.bin文件位于名为的目录opennlp中,并且类路径包含opennlp.

请注意,./当您执行 Groovy 脚本时,它包含在类路径中,因此如果您的opennlp目录与 Groovy 脚本位于同一目录中,并且您在该目录中时还调用了 Groovy 脚本,它应该可以工作(至少它可以工作)为了我)。但是,如果您在当前不在该目录中时执行脚本(例如,通过使用类似 的路径path/to/script.groovy),它将无法工作。在这种情况下,您可以使用 调用它groovy -cp path/to path/to/script.groovy,从而opennlp手动将目录的父目录放入类路径中。

于 2013-07-21T02:57:32.970 回答