1

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

我对 Java 完全陌生,但没有什么比双脚跳更有趣的了。

我怀疑以下代码不属于我的控制器,并且应该在模型中,但我只是看看此时我是否将所有部分都放在了正确的位置。

我从这个 SO question 中借用了这段代码,在 jruby 中实现了自定义 java 类,因为我找不到任何类型的示例代码。

#my 需要/imports/includes,包含多个版本以确保安全
需要'java'
#包括Java
需要'/media/sf_Ruby192/java_progs/parser/stanford-parser.jar'
#require '/media/sf_Ruby192/java_progs/parser/'
需要“红宝石”
include_class 'edu.stanford.nlp.parser.lexparser.LexicalizedParser'

类 ParseController < ApplicationController

    定义索引
lp = LexicalizedParser.new
    #检查常规Java是否正常工作
列表 = java.util.ArrayList.new
一个=“1”
b = "2"
list.add(a)
list.add(b)
d = 列表[0]
    返回渲染:文本 => 列表
    结尾
结尾

不幸的是,我得到了错误

java.lang.NullPointerException:空

当我包括

lp = LexicalizedParser.new

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

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

4

1 回答 1

1

我不这么认为。但我确实认为您需要阅读此解析器的工作原理。

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

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

换句话说,您获得了 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>
于 2011-11-24T03:05:15.687 回答