001/** 002 * 003 */ 004package org.dllearner.algorithms.isle.metrics; 005 006import org.dllearner.algorithms.isle.index.Index; 007import org.semanticweb.owlapi.model.OWLEntity; 008 009/** 010 * @author Lorenz Buehmann 011 * 012 */ 013public class PMIRelevanceMetric extends AbstractRelevanceMetric { 014 015 public PMIRelevanceMetric(Index index) { 016 super(index); 017 } 018 019 @Override 020 public double getRelevance(OWLEntity entityA, OWLEntity entityB){ 021 long nrOfDocumentsA = index.getNumberOfDocumentsFor(entityA); 022 long nrOfDocumentsB = index.getNumberOfDocumentsFor(entityB); 023 long nrOfDocumentsAB = index.getNumberOfDocumentsFor(entityA, entityB); 024 025 long nrOfDocuments = index.getTotalNumberOfDocuments(); 026 027 double pA = nrOfDocuments == 0 ? 0 : ((double) nrOfDocumentsA / (double) nrOfDocuments); 028 double pB = nrOfDocuments == 0 ? 0 : ((double) nrOfDocumentsB / (double) nrOfDocuments); 029 double pAB = nrOfDocuments == 0 ? 0 : ((double) nrOfDocumentsAB / (double) nrOfDocuments); 030 031 if(pAB == 0 || (pA * pB) == 0){ 032 return 0; 033 } 034 035 double pmi = Math.log(pAB / pA * pB); 036 037 return pmi; 038 } 039 040 @Override 041 public double getNormalizedRelevance(OWLEntity entityA, OWLEntity entityB){ 042 long nrOfDocumentsA = index.getNumberOfDocumentsFor(entityA); 043 long nrOfDocumentsB = index.getNumberOfDocumentsFor(entityB); 044 long nrOfDocumentsAB = index.getNumberOfDocumentsFor(entityA, entityB); 045 046 long nrOfDocuments = index.getTotalNumberOfDocuments(); 047 048 double pA = nrOfDocuments == 0 ? 0 : ((double) nrOfDocumentsA / (double) nrOfDocuments); 049 double pB = nrOfDocuments == 0 ? 0 : ((double) nrOfDocumentsB / (double) nrOfDocuments); 050 double pAB = nrOfDocuments == 0 ? 0 : ((double) nrOfDocumentsAB / (double) nrOfDocuments); 051 052 if(pAB == 0 || pA * pB == 0){ 053 return 0; 054 } 055 double pmi = Math.log(pAB / (pA * pB)); 056 057 double denominator = -Math.log(pAB); 058 if(denominator == 0){ 059 return 0; 060 } 061 062 double normalizedPMI = (pmi/denominator + 1)/2; 063 064 return normalizedPMI; 065 } 066 067}