【问题标题】:import NLTK fails when calling Python method from Java从 Java 调用 Python 方法时导入 NLTK 失败
【发布时间】:2012-11-22 20:46:16
【问题描述】:

首先,我在 MacBook 上使用 Eclipse 进行 Java 编码。我编写了一个使用 NLTK“进行自然语言处理”的 Python 代码,它运行良好。我尝试从 Java 调用一个简单的 Python 代码,它也按预期工作。

但是当我尝试调用使用 NLTK 的 Python 代码时,导入语句失败: “ImportError:没有名为 nltk 的模块”

似乎 Python 能够找到 NLTK 库,但在 Java 中却不能。

我尝试在 Python 代码和 Java 代码中都使用 import 语句,但没有成功。

这是 Python 代码:

#!/usr/local/bin/python
# coding: UTF-8
import os, sys
from nltk.tokenize import word_tokenize # Tokenizer
class RTE:
    def WordPhraseRate(self, Text):
        T_tokens = word_tokenize(Text)
.
.
.

这是 Java 代码:

import org.python.util.*;
import org.python.core.*;
import org.python.util.PythonInterpreter;

public class NLU_RTE
{
    public PythonInterpreter interpreter = null;
    public NLU_RTE()
    {
        PythonInterpreter.initialize(System.getProperties(), System.getProperties(), new String[0]);
        this.interpreter = new PythonInterpreter();
    }
    void execfile( final String fileName )
    {
        this.interpreter.execfile(fileName);
    }
    PyInstance createClass( final String className, final String opts )
    {
        return (PyInstance) this.interpreter.eval(className + "(" + opts + ")");
    }

    public static void main( String gargs[] )
    {
        NLU_RTE ie = new NLU_RTE();
        ie.execfile("/Users/Desktop/nlu.py");
        ie.interpreter.exec("from nltk.tokenize import word_tokenize # Tokenizer");
        String T="About two weeks before the trial started, I was in Shapiro's office in Century City."; // Text
        ie.interpreter.set("T", T);
        PyObject answer = ie.interpreter.eval("RTE('None').WordPhraseRate(T)");
        System.out.print(answer.toString());    

    }
}

【问题讨论】:

标签: java python python-2.7 jython nltk


【解决方案1】:

我不确定性能上有什么不同,但如果您不想担心桥接或其他问题,可以直接在 Java 中调用脚本。类似于以下内容。

Python,在名为 testing.py 的文件中:

#!/usr/local/bin/python
# coding: UTF-8
import os, sys
from nltk.tokenize import word_tokenize # Tokenizer

if __name__ == "__main__":
    # If you want to read from a file instead of passing data
    #text = open(sys.argv[1]).read()

    # read the first argument passed to script
    text = sys.argv[1]

    tokens = word_tokenize(text)
    print tokens

Java

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.File;

public class pythonfromjava{
    public static void main(String argv[]) {
        try{
            // for tilda expansion
            //if (filepath.startsWith("~" + File.separator)) {
                //filepath = System.getProperty("user.home") + filepath.substring(1);
            //}

            //ProcessBuilder builder = new ProcessBuilder("python", "-c", "import sys; import nltk; print \"whatever\"");
            ProcessBuilder builder = new ProcessBuilder("python", "testing.py", "four scores and seven years ago");
            builder.redirectErrorStream(true);
            Process p = builder.start();
            InputStream stdout = p.getInputStream();
            BufferedReader reader = new BufferedReader (new InputStreamReader(stdout));

            String line;
            while ((line = reader.readLine ()) != null) {
                System.out.println ("Stdout: " + line);
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

【讨论】:

  • 我尝试了这种方法,但我无法调用特定的 python 方法并在 Java 中捕获返回的值?
  • 你必须print在python中取出捕获的值,然后从stdout读取信息。或者您可以将数据写入文件并在 Java 中重新打开该文件。
  • 但是你能举一个你无法运行的代码的例子吗?
  • 这是我的问题中的确切代码。我使用了你的方法,但是如何将在 Java 中声明的变量发送到被调用的 python 代码。在java中我有这个变量: String T="试用开始前大约两周,我在世纪城夏皮罗的办公室。"; // 文本
  • 以及如何编辑我的python代码以接受来自java的变量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2019-10-02
相关资源
最近更新 更多