0

Groovy スクリプトで OpenNLP ツールを使用できるように、GitHub から次のコード スニペットを取得しようとしています。

( 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") は実際には null です。何か案は?

4

1 に答える 1

0

en-token.binおよびen-pos-maxent.binファイルが という名前のディレクトリにopennlpあり、クラスパスに の親ディレクトリが含まれていることを確認してくださいopennlp

Groovy./スクリプトを実行するとクラスパスに含まれるので、opennlpGroovy スクリプトと同じディレクトリにディレクトリがあり、そのディレクトリにいるときに Groovy スクリプトも呼び出す場合、動作するはずです (少なくとも動作しました)。私のため)。ただし、現在そのディレクトリにいないときに (たとえば、のようなパスを使用して) スクリプトを実行すると、機能しpath/to/script.groovyません。その場合、 を使用して呼び出すだけgroovy -cp path/to path/to/script.groovyで、ディレクトリの親ディレクトリをopennlp手動でクラスパスに入れることができます。

于 2013-07-21T02:57:32.970 に答える