2016-02-28 99 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