我希望在我的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。希望斯坦福分析师也能提供一些意见(我知道,要问的很多)。我发现的文档或示例代码的方式似乎很少。
答案 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>