001package org.dllearner.algorithms.isle.index; 002 003import java.io.File; 004import java.io.FileInputStream; 005import java.io.FileOutputStream; 006import java.io.IOException; 007import java.io.ObjectInputStream; 008import java.io.ObjectOutputStream; 009import java.io.UnsupportedEncodingException; 010import java.net.URLEncoder; 011import java.util.LinkedHashMap; 012import java.util.List; 013import java.util.Map; 014 015import org.apache.log4j.Logger; 016import org.dllearner.algorithms.isle.metrics.RelevanceMetric; 017import org.dllearner.algorithms.isle.metrics.RelevanceUtils; 018import org.semanticweb.owlapi.model.OWLClass; 019import org.semanticweb.owlapi.model.OWLEntity; 020import org.semanticweb.owlapi.model.OWLOntology; 021 022import com.google.common.hash.HashFunction; 023import com.google.common.hash.Hashing; 024 025/** 026 * Interface for an index which is able to resolve a given entity's URI to the set of documents containing 027 * this entity, i.e., documents which contain words disambiguated to the given entity. 028 * 029 * @author Lorenz Buehmann 030 * @author Daniel Fleischhacker 031 */ 032public abstract class RelevanceMapGenerator { 033 034 private static final Logger logger = Logger.getLogger(RelevanceMapGenerator.class); 035 public static String cacheDirectory = "cache/relevance"; 036 037 public static synchronized Map<OWLEntity, Double> generateRelevanceMap(OWLClass cls, OWLOntology ontology, RelevanceMetric relevanceMetric, boolean cached){ 038 logger.info("Relevance Metric: " + relevanceMetric.getClass().getSimpleName()); 039 Map<OWLEntity, Double> relevanceMap = null; 040 File folder = new File(cacheDirectory); 041 folder.mkdirs(); 042 File file = null; 043 try { 044 file = new File(folder, URLEncoder.encode(cls.toStringID() + "-" + relevanceMetric.getClass().getSimpleName(), "UTF-8") + ".rel"); 045 } catch (UnsupportedEncodingException e2) { 046 e2.printStackTrace(); 047 } 048 if(cached && file.exists()){ 049 try { 050 logger.info("Loading relevance map from disk..."); 051 ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); 052 relevanceMap = (Map<OWLEntity, Double>) ois.readObject(); 053 ois.close(); 054 logger.info("...done."); 055 } catch (Exception e) { 056 e.printStackTrace(); 057 } 058 } else { 059 logger.info("Building relevance map..."); 060 relevanceMap = RelevanceUtils.getRelevantEntities(cls, ontology, relevanceMetric); 061 try { 062 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file)); 063 oos.writeObject(relevanceMap); 064 oos.close(); 065 } catch (IOException e1) { 066 e1.printStackTrace(); 067 } 068 logger.info("...done."); 069 } 070 return relevanceMap; 071 } 072 073 public static Map<RelevanceMetric, Map<OWLEntity, Double>> generateRelevanceMaps(OWLClass cls, OWLOntology ontology, List<RelevanceMetric> relevanceMetrics, boolean cached){ 074 Map<RelevanceMetric, Map<OWLEntity, Double>> metric2Map = new LinkedHashMap<>(); 075 for (RelevanceMetric relevanceMetric : relevanceMetrics) { 076 try { 077 long start = System.currentTimeMillis(); 078 metric2Map.put(relevanceMetric, generateRelevanceMap(cls, ontology, relevanceMetric, cached)); 079 long end = System.currentTimeMillis(); 080 logger.info("Operation took " + (end - start) + "ms"); 081 082 } catch (Exception e) { 083 e.printStackTrace(); 084 } 085 } 086 return metric2Map; 087 } 088 089 public static Map<OWLEntity, Double> generateRelevanceMap(OWLClass cls, OWLOntology ontology, RelevanceMetric relevanceMetric){ 090 return generateRelevanceMap(cls, ontology, relevanceMetric, false); 091 } 092}