开始使用Stanford Parser的jruby

时间:2011-11-23 19:46:17

标签: ruby-on-rails jruby stanford-nlp

我希望在我的rails应用程序中添加一些文本解析,并且过去几天一直在寻找任何有关如何使其工作的教程或提示。

我对Java完全不熟悉,但没有什么能像双脚一样跳进去。

我怀疑以下代码不属于我的控制器,并且可能应该在模型中,但我只是看到我是否在这一点上把所有部分都放在了正确的位置。

我从这个问题implementing custom java class in jruby借用了这段代码,因为我无法找到任何类型的示例代码。

#my requires/imports/includes, included multiple versions to be safe
require 'java'
#include Java
require '/media/sf_Ruby192/java_progs/parser/stanford-parser.jar'
#require '/media/sf_Ruby192/java_progs/parser/'
require 'rubygems'
include_class 'edu.stanford.nlp.parser.lexparser.LexicalizedParser'

class ParseController < ApplicationController

    def index
lp = LexicalizedParser.new
    #check if regular Java is working
list = java.util.ArrayList.new 
a = "1"
b = "2"
list.add(a)
list.add(b)
d = list[0]
    return render :text => list
    end
end

不幸的是,我收到了错误

java.lang.NullPointerException: null

当我加入

lp = LexicalizedParser.new
我一切都错了吗?当我注释掉lp = ...时,我得到了列表输出,所以jruby正在工作,我可以在我的rails应用程序中编写java并获得输出。

有人可以指出我正确的方向,也许告诉我这段代码有什么问题,但希望实际上让我直截了当地说我应该如何使用jruby和rails。希望斯坦福分析师也能提供一些意见(我知道,要问的很多)。我发现的文档或示例代码的方式似乎很少。

1 个答案:

答案 0 :(得分:1)

我不这么认为。但我确实认为你需要阅读这个解析器是如何工作的。

根据http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/parser/lexparser/LexicalizedParser.html,默认构造函数的工作方式如下:

  

从先前序列化的构造新的LexicalizedParser对象   语法从属性读取   edu.stanford.nlp.SerializedLexicalizedParser,或默认文件   位置。

换句话说,您正在获取NPE,因为默认构造函数无法找到足够的信息来创建解析器。

如果您从斯坦福获取二进制发行版,则会在grammar目录中找到相应的语法。例如:

$ jruby -S irb
irb(main):001:0> require 'java'
=> true
irb(main):002:0> require 'stanford-parser.jar'
=> true
irb(main):003:0> java_import Java::edu.stanford.nlp.parser.lexparser.LexicalizedParser
=> Java::EduStanfordNlpParserLexparser::LexicalizedParser
irb(main):004:0> lp = LexicalizedParser.new("grammar/englishPCFG.ser.gz")
Loading parser from serialized file grammar/englishPCFG.ser.gz ... done [2.5 sec].
=> #<Java::EduStanfordNlpParserLexparser::LexicalizedParser:0x7d627b8b>