/*
TagRecommender:
A framework to implement and evaluate algorithms for the recommendation
of tags.
Copyright (C) 2013 Dominik Kowald
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package processing;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedSet;
import java.util.Timer;
import java.util.concurrent.TimeUnit;
import com.google.common.base.Stopwatch;
import common.Bookmark;
import common.MemoryThread;
import common.PerformanceMeasurement;
import common.Utilities;
import file.PredictionFileWriter;
import file.BookmarkReader;
import processing.folkrank.*;
public class FolkRankCalculator {
private static List<int[]> frResults;
private static List<int[]> prResults;
private static String timeString;
private static void startFolkRankCreation(BookmarkReader reader, int sampleSize) {
System.out.println("\nStart FolkRank Calculation for Tags");
frResults = new ArrayList<int[]>();
prResults = new ArrayList<int[]>();
int size = reader.getBookmarks().size();
int trainSize = size - sampleSize;
Stopwatch timer = new Stopwatch();
timer.start();
FactReader factReader = new WikipediaFactReader(reader, trainSize, 3);
FactPreprocessor prep = new FactReaderFactPreprocessor(factReader);
prep.process();
FolkRankData facts = prep.getFolkRankData();
FolkRankParam param = new FolkRankParam();
FolkRankPref pref = new FolkRankPref(new double[] {1.0, 1.0, 1.0});
int usrCounts = facts.getCounts()[1].length;
System.out.println("Users: " + usrCounts);
int resCounts = facts.getCounts()[2].length;
System.out.println("Resources: " + resCounts);
double[][] prefWeights = new double[][]{new double[]{}, new double[]{usrCounts}, new double[]{resCounts}};
FolkRankAlgorithm folk = new FolkRankAlgorithm(param);
timer.stop();
long trainingTime = timer.elapsed(TimeUnit.MILLISECONDS);
timer.reset();
// start FolkRank
for (int i = trainSize; i < size; i++) {
timer.start();
Bookmark data = reader.getBookmarks().get(i);
int u = data.getUserID();
int[] uPrefs = (u < usrCounts ? new int[]{u} : new int[]{});
int r = data.getResourceID();
int[] rPrefs = (r < resCounts ? new int[]{r} : new int[]{});
pref.setPreference(new int[][]{new int[]{}, uPrefs, rPrefs}, prefWeights);
FolkRankResult result = folk.computeFolkRank(facts, pref);
int[] topTags = new int[10];
SortedSet<ItemWithWeight> topKTags = ItemWithWeight.getTopK(facts, result.getWeights(), 10, 0);
int count = 0;
for (ItemWithWeight item : topKTags) {
topTags[count++] = item.getItem();
}
frResults.add(topTags);
timer.stop();
int[] topTagsPr = new int[10];
SortedSet<ItemWithWeight> topKTagsPr = ItemWithWeight.getTopK(facts, result.getAPRWeights(), 10, 0);
count = 0;
for (ItemWithWeight item : topKTagsPr) {
topTagsPr[count++] = item.getItem();
}
prResults.add(topTagsPr);
//System.out.println(u + "|" + data.getTags().toString().replace("[", "").replace("]", "") +
// "|" + Arrays.toString(topTags).replace("[", "").replace("]", "") +
// "|" + Arrays.toString(topTagsPr).replace("[", "").replace("]", ""));
}
long testTime = timer.elapsed(TimeUnit.MILLISECONDS);
timeString = PerformanceMeasurement.addTimeMeasurement(timeString, true, trainingTime, testTime, sampleSize);
}
public static BookmarkReader predictSample(String filename, int trainSize, int sampleSize) {
Timer timerThread = new Timer();
MemoryThread memoryThread = new MemoryThread();
timerThread.schedule(memoryThread, 0, MemoryThread.TIME_SPAN);
BookmarkReader reader = new BookmarkReader(trainSize, false);
reader.readFile(filename);
List<int[]> predictionValues = null;
List<int[]> prPredictionValues = null;
startFolkRankCreation(reader, sampleSize);
predictionValues = frResults;
prPredictionValues = prResults;
reader.setTestLines(reader.getBookmarks().subList(trainSize, reader.getBookmarks().size()));
PredictionFileWriter writer = new PredictionFileWriter(reader, predictionValues);
writer.writeFile(filename + "_fr");
PredictionFileWriter prWriter = new PredictionFileWriter(reader, prPredictionValues);
prWriter.writeFile(filename + "_apr");
timeString = PerformanceMeasurement.addMemoryMeasurement(timeString, false, memoryThread.getMaxMemory());
timerThread.cancel();
Utilities.writeStringToFile("./data/metrics/" + filename + "_fr" + "_TIME.txt", timeString);
return reader;
}
}