1

文字列からエンティティを抽出するために、文字列に対して CRFClassifier を実行しようとしています。ここからスタンフォード NLP エンティティ認識エンジンの Ruby バインディングを使用しています: https://github.com/tiendung/ruby-nlp

独自のクラス (nlp.rb) で完全に正常に動作します。実行すると正常に動作ruby nlp.rbします。ただし、Rails アプリのコントローラーの 1 つにこのクラスのオブジェクトを作成しようとすると、何らかの理由で次のエラーが発生します。

java.lang.NoClassDefFoundError: edu/stanford/nlp/ie/crf/CRFClassifier

これは、単独では問題なく動作しますが、コントローラー内では動作しないコードです。

    def initialize
        Rjb::load('stanford-postagger.jar:stanford-ner.jar', ['-Xmx200m'])
        crfclassifier = Rjb::import('edu.stanford.nlp.ie.crf.CRFClassifier')
        maxentTagger = Rjb::import('edu.stanford.nlp.tagger.maxent.MaxentTagger')
        maxentTagger.init("left3words-wsj-0-18.tagger")
        sentence = Rjb::import('edu.stanford.nlp.ling.Sentence')
        @classifier = crfclassifier.getClassifierNoExceptions("ner-eng-ie.crf-4-conll.ser.gz")


    end


    def get_entities(sentence)
        sent = sentence
        @classifier.testStringInlineXML( sent )

    end

どちらの場合もまったく同じコードです。ここで何が起こっているのか、誰にもわかりません!?

前もって感謝します!

4

1 に答える 1

1

これが必要だと思います:

Rjb::load('/path/to/jar/stanford-postagger.jar:/path/to/jar/stanford-ner.jar', ['-Xmx200m'])

私はこれを試してみましたが、うまくいきます。lib に nlp とい​​うディレクトリを作成します。そこに jar を配置し、フル パスを使用して jar をロードするクラスを作成します。

したがって、次のようになります。

├── lib
│   ├── nlp
│   │   ├── stanford-ner.jar
│   │   └── stanford-postagger.jar
│   └── nlp.rb



require 'rjb'

class NLP
  def initialize
    pos_tagger = File.expand_path('../nlp/stanford-postagger.jar', __FILE__)
    ner = File.expand_path('../nlp/stanford-ner.jar', __FILE__)
    Rjb::load("#{pos_tagger}:#{ner}", ['-Xmx200m'])
    crfclassifier = Rjb::import('edu.stanford.nlp.ie.crf.CRFClassifier')
    maxentTagger = Rjb::import('edu.stanford.nlp.tagger.maxent.MaxentTagger')
    maxentTagger.init("left3words-wsj-0-18.tagger")
    sentence = Rjb::import('edu.stanford.nlp.ling.Sentence')
    @classifier = crfclassifier.getClassifierNoExceptions("ner-eng-ie.crf-4-conll.ser.gz")
  end


  def get_entities(sentence)
    sent = sentence
    @classifier.testStringInlineXML( sent )
  end
end

小さなテストクラス:

require_relative 'lib/nlp'

n = NLP.new
n.get_entities("Good afternoon Rajat Raina, how are you today?")

出力:

ruby t.rb
Loading classifier from /Users/brendan/code/ruby/ruby-nlp/ner-eng-ie.crf-4-conll.ser.gz ... done [1.2 sec].
Getting data from Good afternoon Rajat Raina, how are you today? (default encoding)
Good afternoon <PERSON>Rajat Raina</PERSON>, how are you today?
于 2014-01-24T21:41:22.983 に答える