2016-02-28 14 views
1

Я пытаюсь найти способ импорта Java-мл в мой проект 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

Короче говоря, вы не можете запускать Java-код изначально в интерпретаторе CPython.

Во-первых, Python - это просто название спецификации для языка. Если вы используете Python, поставляемый вашей операционной системой (или загруженный с официального сайта Python), то вы используете CPython. CPython не имеет возможности интерпретировать код Java.

Однако, как вы упомянули, существует реализация Python для JVM под названием Jython. Jython - это реализация Python, которая работает на JVM и поэтому может взаимодействовать с модулями Java. Тем не менее, очень немногие люди работают с Jython, и поэтому вы будете немного поработать над тем, чтобы все работало правильно. Вам не нужно будет переписывать свой код Python на основе ванили (так как Jython может интерпретировать Python 2.x), но не все библиотеки (такие как numpy) будут поддерживаться.

Наконец, я думаю, вам нужно лучше понять алгоритм K-Средств, поскольку алгоритм неявно определяется в терминах евклидова расстояния. Использование любой другой метрики расстояния больше не будет рассматриваться как K-Means и может повлиять на сходимость алгоритма. См. here для получения дополнительной информации.


Опять же, вы не можете запускать Java-код изначально в интерпретаторе CPython. Конечно, существуют различные сторонние библиотеки, которые будут обрабатывать сортировку данных между Java и Python. Тем не менее, я согласен с тем, что для этого конкретного случая использования, скорее всего, вам лучше использовать встроенную библиотеку Python (что-то вроде K-Medoid в Scikit-Learn). По-моему, попытка перебраться на Java со всеми связанными с этим накладными расходами является чрезмерной проблемой для этой проблемы.

+0

Спасибо за ответ, однако мой код находится в Python 3, и Jython потребовал бы, чтобы я портировал его на Python 2, вы уверены, что я не могу вызвать JVM для выполнения этой функции. Я знаю, что когда использовал python Stanford POS в python, он всегда назывался jvm из python 3, и он мог запускать Java-классы. –

+0

В зависимости от содержимого вашего кода может случиться так, что Python 2 и Python 3 фактически не потребуют дополнительного кода. Существует очень значительное совпадение между двумя версиями. Во-вторых, когда вы говорите, что вы называете JVM, вы имеете в виду как вызов подпроцесса? Поскольку это, очевидно, возможно, хотя сортировка ваших данных между Python и Java может мне сложно. – BeRecursive

+0

Мои данные, введенные в kmeans, представлены в виде списка, поэтому теоретизация данных не должна быть слишком сложной. Похоже, что они используют вызов подпроцесса, поскольку они имеют в своем импорте 'от импорта подпроцесса PIPE' –

1

Чтобы ответить на ваш вопрос напрямую, Jython будет вашим лучшим выбором, если вы просто хотите импортировать Java-классы. Jython очень старательно совместим с Python 2.x и делает хорошую работу. Поэтому вам не придется тратить слишком много времени на переписывание кода. Просто запустите его с помощью Jython и посмотрите, что произойдет, а затем измените, что происходит.

Теперь для ответа Python: D. Вы можете использовать scikit для собственной реализации. Это, безусловно, будет быстрее, чем запустить что-нибудь в Jython.

Update

Я думаю 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 в python, он всегда назывался jvm из python 3, и он мог запускать Java-классы. –

+0

Общая проблема с Jython, перегруженные методы и способы их устранения - http://stackoverflow.com/questions/21329491/calling-right-overload-of-the-java-method-from-jython – David

+0

@benjrei Это может был задействован какой-то сокет/ip мост, веб-сайт Stanford POS tagger упоминается nltk, возможно, вы могли бы использовать это вместо этого? – David