Search code examples
javamacosjrubyopennlp

Why the HelloWorld of opennlp library works fine on Java but doesn't work with Jruby?


I am getting this error:

SyntaxError: hello.rb:13: syntax error, unexpected tIDENTIFIER
public HelloWorld( InputStream data ) throws IOException {

The HelloWorld.rb is:

require "java"

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;

import opennlp.tools.postag.POSModel;
import opennlp.tools.postag.POSTaggerME;

public class HelloWorld {
    private POSModel model;

    public HelloWorld( InputStream data ) throws IOException {
    setModel( new POSModel( data ) );
    }

    public void run( String sentence ) {
    POSTaggerME tagger = new POSTaggerME( getModel() );
    String[] words = sentence.split( "\\s+" );
    String[] tags = tagger.tag( words );
    double[] probs = tagger.probs();

    for( int i = 0; i < tags.length; i++ ) {
    System.out.println( words[i] + " => " + tags[i] + " @ " + probs[i] );
    }
    }

    private void setModel( POSModel model ) {
    this.model = model;
    }

    private POSModel getModel() {
    return this.model;
    }

    public static void main( String args[] ) throws IOException {
    if( args.length < 2 ) {
    System.out.println( "HelloWord <file> \"sentence to tag\"" );
    return;
    }

    InputStream is = new FileInputStream( args[0] );
    HelloWorld hw = new HelloWorld( is );
    is.close();

    hw.run( args[1] );
    }
}

when running ruby HelloWorld.rb "I am trying to make it work"

when I run the HelloWorld.java "I am trying to make it work" it works perfectly, of course the .java doesn't contain the require java statement.

EDIT:

I followed the following steps.

The output for jruby -v :

jruby 1.6.7.2 (ruby-1.8.7-p357) (2012-05-01 26e08ba) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_35) [darwin-x86_64-java]

Solution

  • JRuby is a ruby implementation in Java, this means if you want to use JRuby, you have to use the ruby syntax. You can indeed use Java objects in JRuby, but using the ruby syntax – you just can’t use Java syntax.

    For example, frame = javax.swing.JFrame.new("Window") uses JFrame, but with a ruby syntax (i.e. JFrame.new rather than new JFrame).

    And so your code would be something like:

    require 'java'
    # Require opennlp jars
    Dir.glob('**/*.jar').each do |jar|
      require jar
    end
    
    java_import 'opennlp.tools.postag.POSTaggerME'
    java_import 'opennlp.tools.postag.POSModel'
    
    class HelloWorld
      def initialize(data)
        @model = POSModel.new(data)
      end
    
      def run(sentence)
        tagger = POSTaggerME.new(@model)
        words = sentence.split
        tags = tagger.tag(words)
        probs = tagger.probs
    
        probs.each_with_index do |p,i|
          puts "#{words[i]} => #{tags[i]} @ #{p}"
        end
      end
    end
    
    stream = File.new(ARGV[0]).to_java.getInStream
    HelloWorld.new(stream).run(ARGV[1])
    

    All. ruby. code.