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}