import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* è¾å
¥ï¼holeç±æ£ç¡®çæ¡å¡«å
åçgroumï¼ä»¥åtop10ç»æéåï¼ä¸æ£ç¡®çæ¡ä¸ºç»æéåä¸ç第ä¸ä¸ªå
ç´
*/
public class CreateDataSet {
static HashMap pathCounter;
static Map API2Index;
/**
* 读åapi2indexçMap
* @param file
* @throws IOException
*/
private static void getPathCounter(File file) throws IOException {
pathCounter = new HashMap<>();
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String row;
String path; Integer num;
while ((row = bufferedReader.readLine()) != null) {
path = row.split(" ")[0];
num = new Integer(row.split(" ")[1]);
pathCounter.put(path, num);
}
bufferedReader.close();
fileReader.close();
}
/**
* å建éç¨äºSVM_Rankçæ°æ®é
* 对å个Groumè¿è¡å¤ç
* å¨åtop-10ç»ææ¿æ¢çæ¶åï¼åpathæ°ç®çæ¥è¯¢
* @param groum holeç±æ£ç¡®çæ¡å¡«å
åçgroum
* @param results top10ç»æéå, results第ä¸ä¸ªä¸ºæ£ç¡®çæ¡
*/
public static void create(Groum groum, List results, int qId, File file, PrintWriter pW, Map A2I) throws IOException {
getPathCounter(file);
API2Index = A2I;
Map nodeMap = groum.getNodeMap();
GroumNode groumNode = null;
List startList = null;
String rows = null;
for (String id : nodeMap.keySet()) {
groumNode = nodeMap.get(id);
if (groumNode.getOriginalApi().equals(results.get(0))) {
startList = new ArrayList<>();
startList.add(id);
List> outList = GetPath.getAllPath(groum, startList, 4); // æ¤å¤æå¾å°çpath表示æ¯ä½¿ç¨Mapä¸çAPIçindexææ
rows = createRows(outList, results, groumNode.getApi(), qId);
writeFile(pW, rows);
}
}
}
/**
* å°Stringå为Listï¼å¹¶å¾å°å¡«å
holeçPathï¼aPathï¼ä»¥åé¤å»hole以å¤çå©ä½APIç»æçPathï¼bPathï¼
* @param list
* @param id
* @param result
* @return
*/
private static List convertListToStringAndGetAPathBPath(List list, String id, String result) {
List ret = new ArrayList();
StringBuilder aPath = new StringBuilder();
StringBuilder bPath = new StringBuilder();
boolean ifStarted = false;
boolean ifMeetHole = false;
for (String item : list) {
if (item.equals(id)) {
aPath.append(result);
aPath.append(",");
}
else {
aPath.append(item);
bPath.append(item);
aPath.append(",");
bPath.append(",");
}
}
if (aPath.charAt(aPath.length() - 1) == ',') aPath.deleteCharAt(aPath.length() - 1);
if (bPath.charAt(bPath.length() - 1) == ',') bPath.deleteCharAt(bPath.length() - 1);
ret.add(aPath.toString());
ret.add(bPath.toString());
return ret;
}
/**
* æå»ºå½¢å¼ä¸º"3 qid:1 1:1 2:1 3:0 4:0.2 5:0"æ¯è¡æ°æ®å
* @param outList 使ç¨holeæ½åçPath
* @param results top10ç»æé
* @param id æ£ç¡®çæ¡å¨Mapä¸çId
* @param qId æ°æ®å
ä¸çqid
*/
private static String createRows(List> outList, List results, String id, int qId) {
StringBuilder rows = new StringBuilder();
List midRes = null;
double feature = 0;
int featureId = 1;
boolean ifFirst = true;
String resultId;
for (String result : results) {
if (ifFirst) {
rows.append("2"); // æ£ç¡®çæ¡çrankå¼ä¸º2
ifFirst = false;
}
else {
rows.append("1"); // éæ£ç¡®çæ¡çrankå¼å为1
}
rows.append(" ");rows.append("qid:");rows.append(qId);rows.append(" ");
featureId = 1;
boolean ifFirstFeature = true;
for (List path : outList) {
resultId = API2Index.get(result);
midRes = convertListToStringAndGetAPathBPath(path, id, resultId);
if (midRes.get(1).length() == 1) continue;
System.out.println(midRes.get(1));
System.out.println(midRes.get(0));
feature = (double)pathCounter.getOrDefault(midRes.get(1), 0) / pathCounter.getOrDefault(midRes.get(0), 1); // æ¤å¤å¯¹aå¼è®¾å®æå°ä¸º1
if (ifFirstFeature) ifFirstFeature = false;
else rows.append(" ");
rows.append(featureId);rows.append(":");rows.append(feature);
++featureId;
}
rows.append("\n");
}
return rows.toString();
}
/**
* å°ä¸ä¸ªGroumçæ°æ®éåå
¥æä»¶
* @param pW
* @param rows
*/
private static void writeFile(PrintWriter pW, String rows) {
pW.write(rows);
}
}