실제로이 문제를 해결하는 방법에 대한 세부 정보를 추가하기로 결정했습니다. 중요한 수정을 한 후 나중에 객체 지향적으로 만들었습니다. 이것은 이해를 쉽게하기위한 간단한 설명 일뿐입니다.
여기에 TranslatingClientRecommender
의 작은 래퍼 인 WebClientRecommender
클래스가 있습니다. 여기
package suggester.client.recommender;
import java.io.File;
import java.io.Reader;
import java.net.URI;
import java.util.Arrays;
import java.util.List;
import net.myrrix.client.MyrrixClientConfiguration;
import net.myrrix.client.translating.TranslatedRecommendedItem;
import org.apache.mahout.cf.taste.common.TasteException;
/**
*
* @author Nilesh Chakraborty
*/
public class WebClientRecommender extends AbstractClientRecommender {
public WebClientRecommender(MyrrixClientConfiguration myrrixClientConfiguration) {
super(myrrixClientConfiguration);
}
@Override
public List<TranslatedRecommendedItem> recommend(String idListFile, String recommendTo, String recommendType, int howMany) throws TasteException {
clientRecommender.addItemIDs(new File(idListFile));
List<TranslatedRecommendedItem> recommendations = clientRecommender.recommend(recommendTo, howMany, false, new String[]{recommendType});
return recommendations;
}
@Override
public List<TranslatedRecommendedItem> recommendAnonymous(String idListFile, String recommendType, int howMany, String[] list) throws TasteException {
clientRecommender.addItemIDs(new File(idListFile));
float[] values = new float[list.length];
Arrays.fill(values, 30);
List<TranslatedRecommendedItem> recommendations = clientRecommender.recommendToAnonymous(list, values, howMany, new String[]{recommendType}, "testID");
return recommendations;
}
public List<TranslatedRecommendedItem> recommendAnonymous(URI idListFile, String recommendType, int howMany, String[] list) throws TasteException {
clientRecommender.addItemIDs(new File(idListFile));
float[] values = new float[list.length];
Arrays.fill(values, 30);
List<TranslatedRecommendedItem> recommendations = clientRecommender.recommendToAnonymous(list, values, howMany, new String[]{recommendType}, "testID");
return recommendations;
}
@Override
public void ingest(Reader csvReader) throws TasteException {
clientRecommender.ingest(csvReader);
}
}
는 AbstractClientRecommender
입니다 :
package suggester.client.recommender;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.myrrix.client.ClientRecommender;
import net.myrrix.client.MyrrixClientConfiguration;
import net.myrrix.client.translating.TranslatedRecommendedItem;
import net.myrrix.client.translating.TranslatingClientRecommender;
import org.apache.mahout.cf.taste.common.TasteException;
/**
*
* @author nilesh
*/
abstract class AbstractClientRecommender {
protected TranslatingClientRecommender clientRecommender;
public AbstractClientRecommender(MyrrixClientConfiguration myrrixClientConfiguration) {
try {
clientRecommender = new TranslatingClientRecommender(new ClientRecommender(myrrixClientConfiguration));
} catch (IOException ex) {
Logger.getLogger(CLIClientRecommender.class.getName()).log(Level.SEVERE, null, ex);
}
}
public abstract List<TranslatedRecommendedItem> recommend(String idListFile, String recommendTo, String recommendType, int howMany) throws TasteException;
public abstract List<TranslatedRecommendedItem> recommendAnonymous(String idListFile, String recommendType, int howMany, String[] list) throws TasteException;
public void ingest(String csvFile) throws TasteException {
}
public void ingest(Reader csvReader) throws TasteException {
}
}
지금, 나는 사용자 정의 서블릿에 WebClientRecommender
클래스를 사용하고 있습니다. 여기 SuggesterServlet
는 다음과 같습니다
package suggester.client.servlets;
import com.google.common.base.Splitter;
import suggester.client.recommender.WebClientRecommender;
import java.io.IOException;
import java.net.URL;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.myrrix.client.MyrrixClientConfiguration;
import net.myrrix.web.servlets.AbstractMyrrixServlet;
/**
*
* @author nilesh
*/
public abstract class AbstractSuggesterServlet extends AbstractMyrrixServlet {
static final Splitter SLASH = Splitter.on('/').omitEmptyStrings();
private WebClientRecommender recommender;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
MyrrixClientConfiguration config = new MyrrixClientConfiguration();
config.setHost(request.getServerName());
config.setPort(request.getServerPort());
recommender = new WebClientRecommender(config);
}
protected final WebClientRecommender getClientRecommender() {
return recommender;
}
}
이제, 우리가 SuggesterServlet
로 이동합니다
package suggester.client.servlets;
import com.google.common.collect.Iterables;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URISyntaxException;
import java.util.List;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.myrrix.client.translating.TranslatedRecommendedItem;
import org.apache.mahout.cf.taste.common.TasteException;
/**
*
* @author nilesh
*/
public class SuggesterServlet extends AbstractSuggesterServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
super.doGet(request, response);
String pathInfo = request.getPathInfo();
String[] pathComponents = Iterables.toArray(SLASH.split(pathInfo), String.class);
if (pathComponents.length == 0) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return;
}
try {
List<TranslatedRecommendedItem> recommended = getClientRecommender().recommendAnonymous(getPropFilePath("proplist").toURI(), request.getParameter("type"), getHowMany(request), pathComponents);
output(request, response, recommended);
} catch (URISyntaxException use) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, use.toString());
} catch (NamingException ne) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, ne.toString());
} catch (TasteException te) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, te.toString());
}
}
protected final void output(HttpServletRequest request,
ServletResponse response,
List<TranslatedRecommendedItem> items) throws IOException {
PrintWriter writer = response.getWriter();
// Always print JSON
writer.write('[');
boolean first = true;
for (TranslatedRecommendedItem item : items) {
if (first) {
first = false;
} else {
writer.write(',');
}
writer.write("[\"");
writer.write(item.getItemID());
writer.write("\",");
writer.write(Float.toString(item.getValue()));
writer.write(']');
}
writer.write(']');
}
}
다음은 소품 파일의 읽기 및합니다 (Myrrix REST 서블릿에 연결)를 TranslatingClientRecommender
에 문자열 ID를 추가 , 사용자 정의 서블릿 (HAS-A 관계) 내에 TranslatingClientRecommender
을 사용합니다. 이는 기본적으로 내가 한 일입니다. 내 사용자 정의 서블릿을 목록에 추가하기 위해 Myrrix의 web.xml을 수정해야했습니다. 모든 것이 Tomcat의 단일 응용 프로그램 내에서 실행될 수 있습니다.
찾은 해결책을 게시 할 수 있습니까? :) – ksiomelo
@ksiomelo 방금 추가 한 답변을 확인하십시오. 희망이 도움이됩니다. – Nilesh
감사합니다 Nilesh, 대단히 감사하겠습니다. – ksiomelo