Я пытаюсь создать простую систему рекомендаций, и я обнаружил, что с mahout это довольно легко сделать. У меня есть следующий код (я запускаю его на eclipse и все отлично работает:
package com.predictionmarketing.RecommenderApp;
import java.io.File;
import java.io.IOException;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.UserBasedRecommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
/**
* Java application, user based recommender system
*
*/
public class App
{
public static void main( String[] args )
{
// Modelo
DataModel model = null;
// Inicializar similaridad
UserSimilarity similarity = null;
// Leer .cv userID, itemID, value
try {
model = new FileDataModel(new File("data/dataset.csv"));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// Encontrar matriz de similaridad
try {
similarity = new PearsonCorrelationSimilarity(model);
} catch (TasteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, model);
UserBasedRecommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);
java.util.List<RecommendedItem> recommendations = null;
try {
recommendations = recommender.recommend(2, 3);
} catch (TasteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Mostrar Recomendaciones
for (RecommendedItem recommendation : recommendations) {
System.out.println(recommendation.getItemID());
}
}
}
Тем не менее, мне нужно запустить этот код онлайн, потому что я делаю приложение на PHP, и именно там возникает моя проблема. Есть ли способ запустить этот код на PHP, поэтому я могу использовать переменную "рекомендация"?
Вы можете запустить этот Java-код (скомпилированный первым) из php-кода с помощью shell_exec.
Но лучшее решение построит службу REST (или другую), чтобы сделать ее агностикой языка.
Для этого нет простого решения. Чтобы заставить его работать и общаться с PHP, вам нужно создать для него какой-то интерфейс. Например, создайте Java-сервлет и поместите его в контейнер Servlet (веб-сервер Java). Это самое простое, что я вижу сейчас.
Другое решение, которое вы могли бы рассмотреть также REST или SOAP-сервис, для обмена данными между этим Java-кодом и вашим PHP-приложением. Для этого также понадобится контейнер JavaEE.