package org.wikibrain.cookbook.core; import gnu.trove.map.TIntDoubleMap; import org.wikibrain.conf.Configurator; import org.wikibrain.core.cmd.Env; import org.wikibrain.core.cmd.EnvBuilder; import org.wikibrain.core.dao.LocalCategoryMemberDao; import org.wikibrain.core.dao.LocalPageDao; import org.wikibrain.core.lang.Language; import org.wikibrain.core.model.LocalPage; import org.wikibrain.utils.WpCollectionUtils; import java.util.Arrays; import java.util.Map; import java.util.Set; /** * @author Shilad Sen */ public class CategoryExample { public static void main(String args[]) throws Exception { // Prepare the environment Env env = EnvBuilder.envFromArgs(args); Language lang = env.getDefaultLanguage(); // Get the configurator that creates components Configurator configurator = env.getConfigurator(); LocalCategoryMemberDao catDao = configurator.get(LocalCategoryMemberDao.class); LocalPageDao pageDao = configurator.get(LocalPageDao.class); // Get top-level categories Set<LocalPage> topLevelCats = catDao.guessTopLevelCategories(lang); System.out.println("Top level categories are:"); for (LocalPage p : topLevelCats) { System.out.println("\t" + p); } // For each article, find the category closest to it. long t1 = System.currentTimeMillis(); Map<LocalPage, TIntDoubleMap> result = catDao.getClosestCategories(topLevelCats); long t2 = System.currentTimeMillis(); System.out.println("\nClosest categories identified in " + (t2 - t1) + "ms"); for (LocalPage c : result.keySet()) { System.out.println("\nExamples of pages closest to " + c); int pageIds[] = Arrays.copyOf(result.get(c).keys(), 5); for (int id : pageIds) { LocalPage p = pageDao.getById(lang, id); if (p != null) System.out.format("\t%.3f %s\n", result.get(c).get(id), p.toString()); } } // Find closest categories for an article LocalPage p = pageDao.getByTitle(lang, "Jesus"); TIntDoubleMap distances = catDao.getCategoryDistances(topLevelCats, p.getLocalId(), true); System.out.println("distances to top-level categories for " + p); for (int catId : WpCollectionUtils.sortMapKeys(distances, false)) { LocalPage c = pageDao.getById(lang, catId); if (c != null) System.out.format("\t%.3f %s\n", distances.get(catId), c.toString()); } } }