java.lang.NoClassDefFoundError Rails应用程序中的CRFClassifier

时间:2014-01-24 21:29:21

标签: ruby nlp stanford-nlp named-entity-recognition

我正在尝试在字符串上运行CRFClassifier以从字符串中提取实体。我从这里使用了用于Stanford NLP实体识别器的Ruby绑定:https://github.com/tiendung/ruby-nlp

它在自己的类上说完全正常(nlp.rb)。当我运行ruby nlp.rb时它运行正常。但是,我试图在我的rails应用程序中的一个控制器中创建此类的对象,由于某种原因我收到以下错误:

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

在这两种情况下都是完全相同的代码。任何人都知道这里发生了什么!?

提前致谢!

1 个答案:

答案 0 :(得分:1)

我认为你需要这个:

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

我刚试过这个并且它有效。在lib中创建一个名为nlp的目录。将罐子放在那里,然后创建一个使用完整路径加载罐子的类:

所以你最终得到:

├── 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?