Ruby on rails 开始使用jruby中的Stanford解析器

Ruby on rails 开始使用jruby中的Stanford解析器,ruby-on-rails,jruby,stanford-nlp,Ruby On Rails,Jruby,Stanford Nlp,我希望在我的rails应用程序中添加一些文本解析,在过去几天里,我一直在寻找关于如何使其工作的任何教程或提示 我对Java是完全陌生的,但没有什么比用两只脚跳进去更好的了 我怀疑下面的代码不属于我的控制器,应该在一个模型中,但我只是看看我是否在这一点上把所有的部分都放在了正确的位置 我从这个问题中借用了这段代码,因为我很难找到任何类型的示例代码 #my requires/imports/includes, included multiple versions to be safe require

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

我对Java是完全陌生的,但没有什么比用两只脚跳进去更好的了

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

我从这个问题中借用了这段代码,因为我很难找到任何类型的示例代码

#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 #my requires/imports/includes,包含多个版本以确保安全 需要“java” #包括Java 需要“/media/sf_Ruby192/java_progs/parser/stanford parser.jar” #需要“/media/sf_Ruby192/java_progs/parser/” 需要“rubygems” 包括_类“edu.stanford.nlp.parser.lexparser.LexicalizedParser” 类ParseControllerlist 结束 结束 不幸的是,我犯了错误

java.lang.NullPointerException: null java.lang.NullPointerException:null 当我包括

lp = LexicalizedParser.new lp=LexicalizedParser.new 我做错了什么吗?当我注释掉lp=…,我得到了列表输出,因此jruby正在工作,我可以在rails应用程序中编写java并获得输出


有人能给我指出正确的方向吗?也许能告诉我这段代码有什么问题,但希望能让我明白如何使用jruby和rails。希望斯坦福语法分析器也能提供一些信息(我知道,这有很多问题要问)。我找到的文档或示例代码似乎很少

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

根据,默认构造函数的工作方式如下:

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

换句话说,您得到NPE是因为默认构造函数找不到足够的信息来创建解析器

如果您从Stanford获取二进制发行版,则可以在
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>
$jruby-S irb
irb(主):001:0>需要“java”
=>正确
irb(main):002:0>需要'stanford parser.jar'
=>正确
irb(main):003:0>java_导入java::edu.stanford.nlp.parser.lexparser.LexicalizedParser
=>Java::EdustanfordnlparserExparser::LexicalizedParser
irb(main):004:0>lp=LexicalizedParser.new(“grammar/englishPCFG.ser.gz”)
正在从序列化文件grammar/englishPCFG.ser.gz加载解析器。。。完成[2.5秒]。
=> #

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

根据,默认构造函数的工作方式如下:

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

换句话说,您得到NPE是因为默认构造函数找不到足够的信息来创建解析器

如果您从Stanford获取二进制发行版,则可以在
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>
$jruby-S irb
irb(主):001:0>需要“java”
=>正确
irb(main):002:0>需要'stanford parser.jar'
=>正确
irb(main):003:0>java_导入java::edu.stanford.nlp.parser.lexparser.LexicalizedParser
=>Java::EdustanfordnlparserExparser::LexicalizedParser
irb(main):004:0>lp=LexicalizedParser.new(“grammar/englishPCFG.ser.gz”)
正在从序列化文件grammar/englishPCFG.ser.gz加载解析器。。。完成[2.5秒]。
=> #

谢谢banzaiman,我已经阅读了示例文档,但是我必须承认,没有代码示例,我总是发现仅仅通过查看文档就很难理解问题。例如,在链接到的lexparser页面中,它包含多个LexicalizedParser()选项,其中没有一个选项是.new,列表中的第三个选项指定指向语法。我经常遇到这种情况,这就是为什么我更喜欢代码示例来感受这种语言。但是您得到了答案(注意,是您的代码示例为我解决了这个问题)。感谢Hanks banzaiman,我已经阅读了示例文档,但是我必须承认,没有代码示例,我总是发现仅仅通过查看文档就很难弄清楚事情。例如,在链接到的lexparser页面中,它包含多个LexicalizedParser()选项,其中没有一个选项是.new,列表中的第三个选项指定指向语法。我经常遇到这种情况,这就是为什么我更喜欢代码示例来感受这种语言。但是您得到了答案(注意,是您的代码示例为我解决了这个问题)。谢谢