2011-11-23 60 views
1

我正在尋找在我的rails應用程序中添加一些文本分析,並且在過去的幾天中一直在尋找任何教程或提示以瞭解如何實現此工作。jruby中的斯坦福分析器入門

我對Java完全陌生,但沒有喜歡雙腳跳躍。

我懷疑下面的代碼不屬於我的控制器,應該可能在模型中,但我只是看到在這一點上我是否已將所有部分放在正確的位置。

我從這個SO問題借用了這段代碼,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

我不這麼認爲。但我確實認爲你需要閱讀這個解析器的工作原理。

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> 
+0

感謝banzaiman,我已經通過了示例文檔,但我不得不承認,沒有代碼示例,我總是很難通過查看文檔來弄清楚。例如,在您鏈接到的lexparser頁面中,它包含多個LexicalizedParser()選項,其中沒有一個表示.new,並且列表中的第3個指定指向語法。我經常爲此苦苦掙扎,這就是爲什麼我更喜歡代碼示例來感受語言。但你得到了答案(請注意,這是你的代碼示例爲我解決了這個問題)。謝謝 – pedalpete