# ****************************************************
# Name des Moduls: mod_InformationRetrieval
# Name des Projekts: TaxoSearch
#
# Autor(en):
#        Thorsten Beinhorn, Vesna Cvoro,
#        Khaled Dhaoui und Christian Pretzsch 
#
# Aufgaben des Moduls: siehe Code Dokumentation TaxoSearch
# 
#
# Datum der letzten Aenderung: 26.11.2003
# ****************************************************


from mod_DocumentObjects import *
from math import *

def CalculateTermFreq(DocumentCollection):
	MaxFreq=0			#Maximales Vorkommen eines Terms im Dokument
	NormFreq=0.0		#Normalisierte Termfrequenz
	InDocs=0			#Verteilung auf x Dokumente
	InversDocFreq=0.0	#Inverse Dokumentenfrequenz
	NumDocumentss=0		#Anzahl Dokumente im System
	
	NumDocuments=len(DocumentCollection.dicDocumentCollection)
	for Document in DocumentCollection.dicDocumentCollection.itervalues():
		MaxFreq=0
		for Word in Document.dicDocumentVector.iterkeys():
			#get max frequency of a term in current document
			if Document.dicDocumentVector[Word]>MaxFreq:
				MaxFreq=Document.dicDocumentVector[Word]
		#set normalized term frequency
		for Word in Document.dicDocumentVector.iterkeys():
			InDocs=0
			InversDocFreq=0.0
			NormFreq=float(Document.dicDocumentVector[Word])/float(MaxFreq)
			#all documents containing Word
			for SubDocument in DocumentCollection.dicDocumentCollection.itervalues():
				if SubDocument.dicDocumentVector.has_key(Word):
					InDocs=InDocs+1
			#determine inverse Document frequency
			InversDocFreq=log(float(NumDocuments)/float(InDocs),2)
			Document.dicDocumentVector[Word]=float(NormFreq*InversDocFreq)
	DocumentCollection.UpdateDocument(Document)
	return DocumentCollection
	
def doPageRanking(DocumentCollection, dicQueryVector):
	RankNenner=0.0
	RankTeiler1=0.0
	RankTeiler2=0.0
	Similarity=0.0
	lstRankedResults=[]
	lstResultElement=[]
	
	for Document in DocumentCollection.dicDocumentCollection.itervalues():
		RankNenner=0.0
		RankTeiler1=0.0
		RankTeiler2=0.0
		for QueryWord in dicQueryVector.iterkeys():
			#print QueryWord," in DOK: ", Document.dicDocumentVector.get(QueryWord,0)
			RankNenner=RankNenner+(Document.dicDocumentVector.get(QueryWord,0)*dicQueryVector[QueryWord])
			RankTeiler1=RankTeiler1+pow(Document.dicDocumentVector.get(QueryWord,0),2)
			RankTeiler2=RankTeiler2+pow(dicQueryVector[QueryWord],2)

		if RankNenner==0 or RankTeiler1==0 or RankTeiler2==0:
			Similarity=0.0
		else:
			Similarity=RankNenner/(sqrt(RankTeiler1)*sqrt(RankTeiler2))
		Document.numDocumentRating=Similarity
		#DocumentCollection.UpdateDocument(Document)
		#create result element
		lstResultElement=[]
		lstResultElement.append(Similarity)
		lstResultElement.append(Document)
		lstRankedResults.append(lstResultElement)
	lstRankedResults.sort()
	lstRankedResults.reverse()
	return lstRankedResults
	
def GetRelevantWords(DocumentCollection):
	dicRelevantWords={}
	lstRelevantElement=[]
	lstRelevantWords=[]
	
	for Document in DocumentCollection.dicDocumentCollection.itervalues():
		for Word in Document.dicDocumentVector.iterkeys():
			if dicRelevantWords.has_key(Word):
				if dicRelevantWords[Word]<Document.dicDocumentVector[Word]:
					dicRelevantWords[Word]=Document.dicDocumentVector[Word]
			else:
				if Document.dicDocumentVector[Word]>0.08 and len(Word)>2:
					dicRelevantWords[Word]=Document.dicDocumentVector[Word]
	for Word in dicRelevantWords.iterkeys():
		lstRelevantElement=[]
		lstRelevantElement.append(dicRelevantWords[Word])
		lstRelevantElement.append(Word)
		lstRelevantWords.append(lstRelevantElement)
	
	lstRelevantWords.sort()
	lstRelevantWords.reverse()
	return lstRelevantWords
