2016-02-28 75 views
1

我一直在试图找到一种将Java-ml导入到我的python项目中的方法。我的jar文件与我的项目位于同一路径中。将Java类导入到python项目中

我想将它用于kmeans聚类,因为它允许我更改距离度量。我想知道,不管你是否提出了一个实现,我是否能够将一个不同的java类作为参数传递给函数?

我试着使用:

import sys 

sys.path.append(r"C:\Users\X\Desktop\X\javaml-0.1.7\javaml-0.1.7.jar") 

import net.sf.javaml as jml 

test = jml.clustering.Kmeans() 

我认为使用Jython,但是我不确定它是如何工作的,目前还不清楚我是否能继续使用闲置,是否我将不得不重新编写我的项目。

最后我考虑使用PyJNIus,但它根本不工作。

+0

使用PyJNIus是一个很好的办法做到这一点。我建议用这个来调试你的问题。还有其他库可以让你以类似的方式调用Java代码。 – inclement

回答

1

简而言之,您不能在CPython解释器中本地运行Java代码。首先,Python只是该语言规范的名称。如果您使用的是您的操作系统提供的Python(或从官方Python网站下载),那么您正在使用CPython。 CPython无法解释Java代码。

但是,正如您所提到的,JVM的一个名为Jython的Python实现。 Jython是一个在JVM上运行的Python实现,因此可以与Java模块交互。但是,很少有人使用Jython,因此您将自行处理所有事情,使其正常工作。你不需要重写你的vanilla Python代码(因为Jython可以解释Python 2.x),但是并不是所有的库(比如numpy)都会被支持。

最后,我认为你需要更好地理解K-Means算法,因为该算法是用欧几里德距离隐式定义的。使用任何其他距离度量将不再被视为K均值,并可能影响算法的收敛。有关更多信息,请参阅here


此外,您不能在CPython解释器中本地运行Java代码。当然,还有各种第三方库可以处理Java和Python之间的数据编组。然而,我支持我的声明这个特定的用例你可能更好地使用本地Python库(如Scikit-Learn K-Medoid的东西)。在我看来,尝试通过Java调用所有相关的开销,对于这个问题是过度的。

+0

感谢您的回应,但是我的代码是在Python 3中,而且Jython需要我将它移植到Python 2中,您确定我无法调用JVM来执行此功能。我知道当我在Python中使用Stanford POS tagger时,它总是从python 3中调用jvm,并且它能够运行java类。 –

+0

根据你的代码的内容,它可能是Python 2和Python 3实际上不需要额外的代码。两个版本之间有非常显着的重叠。其次,当你说调用JVM时,你的意思是像一个子进程调用?因为很明显可能,尽管在Python和Java之间编组数据可能很困难。 – BeRecursive

+0

我的数据以kmeans输入时都是列表形式,所以在理论上编组数据不应该太难。看起来他们确实使用了子进程调用,因为他们在import子进程中'从子进程import PIPE' –

1

要直接“回答”你的问题,如果你只是想导入Java类,Jython将是你最好的选择。 Jython努力尽可能地与Python 2.x兼容并且做得很好。所以你不必花太多时间重写代码。只需简单地使用Jython运行它,看看会发生什么,然后修改什么时候休息。

现在为Python的答案:D。您可能希望使用scikit作为本地实现。它肯定比在Jython中运行任何东西都快。

更新

我觉得Py4J模块是你在找什么。它通过在Java代码中运行服务器来工作,Python代码将与Java服务器通信。关于“Py4J”的唯一好处是它为您提供了锅炉板代码。您可以非常轻松地设置您自己的客户端/服务器,无需额外的模块。不过,我认为这与Pythons原生模块相比并不是一个更好的选择。

参考

How to import Java class w/ Jython

Scikit - K-Means

+0

感谢您的回应,但是我的代码是在Python 3中,而Jython会要求我将它全部移植到Python 2中,您确定我无法调用JVM来执行此功能。我知道当我在Python中使用Stanford POS tagger时,它总是从python 3中调用jvm,并且它能够运行java类。 –

+0

Jython的常见问题,重载的方法,以及如何处理它们 - http://stackoverflow.com/questions/21329491/calling-right-overload-of-the-java-method-from-jython – David

+0

@benjrei它可能有一些socket/ip桥涉及,斯坦福POS机的网站提到nltk,也许你可以用它来代替? – David