class Descriptor: def __init__(self,d):#dicionario,arquivos self.parser = Parser() self.arqSpacer = "|" self.arqSaver = "descriptor" self.dictionary=d self.archives=self.parser.getArqs() #iniciando matriz com zeros self.descriptor = numpy.zeros(shape=(len(self.archives),len(d))) #matriz len(a) X len(d) def printProcTimePast(self,total,past): p = past*100/total pontos = "" for x in xrange(p): pontos += "." print pontos+" "+str(past*100/total)+"%" def getIndiceWord(self,w):#retorna o indice da palavra no dicionario for i in range(0,len(self.dictionary)): if self.dictionary[i]==w: return i return -1 def write(self):#escreve o descritor em um arquivo arq = open("./common/"+self.arqSaver,"w") for i in self.descriptor: for j in i: arq.write(str(j)+self.arqSpacer) arq.write("\n") def loadFromArq(self): try: with open("./common/"+self.arqSaver,"r"): pass except IOError: print "Arquivo"+"./common/"+self.arqSaver+" nao encontrador. Gerando arquivo!" return 0 arq = open("./common/"+self.arqSaver,"r") t = arq.read() word = "" i=0 j=0 for c in t: if c == self.arqSpacer: self.descriptor[i][j]=float(word) j+=1 word = "" elif c =="\n": i+=1 j=0 else: word += c return 1 def load(self): if self.loadFromArq() == 1: return print "****** LOAD DESCRIPTOR ******" for i in range(0,len(self.archives)): if i % 1000 == 0: self.printProcTimePast(len(self.archives),i) arq = open(self.parser.diretorio.messages+self.archives[i],"r")#abrindo documento texto = arq.read()#lendo texto do documento word = ""#palavra for c in texto:#lendo caracter por caracter no texto if c in self.parser.separadores: if word: if not word.isdigit():#o caracter eh um separador de palavras? word = word.lower()#normalizando word = word.decode('iso-8859-1').encode('utf8')#alguns caracteres invalidos para utf8 if len(word) > 3 and self.parser.checkWord.check(word):#consideramos apenas palavras com mais de 3 digitos iw = self.getIndiceWord(word) # print str(i)+" "+str(iw) if iw >= 0: self.descriptor[i][iw] += 1 word = "" else: word = word + c self.write() def getDesc(self): print self.descriptor return self.descriptor
class Dictionary: def __init__(self): self.dictionary = list([])#dicionario self.predictionary = list([])#pre-dicionario self.length = 100 #tamanho do dicionario self.parser = Parser() self.file = self.parser.diretorio.common+"dictionary" self.totalPalavras=0 self.arquivos = self.parser.getArqs() def write(self): arq = open(self.file,"w")#abrindo documento for d in self.dictionary: arq.write(d[0]+"\n") def load(self): try: with open(self.file,"r"): pass except IOError: print "Arquivo"+self.file+" nao encontrador. Gerando arquivo!" self.start() arq = open(self.file,"r") texto = arq.read() word = "" for c in texto: if c in self.parser.separadores and word and not word.isdigit():#o caracter eh um separador de palavras? self.dictionary.append(word) word = "" else: word += c #constroi o dicionario de acordo com a probabilidade de selecionar uma palavra e esta estar # no maior numero de arquivos possiveis def build(self): s = self.predictionary tam = 0 for i in s: p_palavra = float(i[1]) / float(self.totalPalavras) #proporcao de ocorrencia da palavra pelo total de palavras p_arq = float(i[2]) / float(len(self.arquivos)) #proporcao de qntos arquivo ocorre a palavra pelo total de arquivos ppa = float(p_palavra * p_arq) #Prob de selecionar uma Palavra e esta estar em um determinado Arquivo # ppa = 0 if tam > self.length: if ppa > 0.0: min = self.getMin(1)#busca pelo menor ppa if min >= 0 and self.dictionary[min][1] < ppa: self.dictionary[min][0] =i[0] self.dictionary[min][1] = ppa self.dictionary[min][2] = i[1] self.dictionary[min][3] = i[2] else: min = findMinDic(dictionary,2)#busca pelo menor num de ocorrencia if min >= 0 and dictionary[min][2] < i[1]: self.dictionary[min][0] =i[0] self.dictionary[min][1] = ppa self.dictionary[min][2] = i[1] self.dictionary[min][3] = i[2] else: self.dictionary.append([i[0],ppa,i[1],i[2]]) self.dictionary.sort(key=lambda x: x[1]) tam += 1 self.dictionary.sort(key=lambda x: x[1]) self.write() def getMin(self,ind):#retorna a posicao do elemento de menor ind do dicionario min = -1 pos = -1 for i in range(0,len(self.dictionary)): if self.dictionary[i][ind] < min or min == -1: min = self.dictionary[i][ind] pos = i return pos def updatePre(self,w,ida):#w = palavra , ida = nome do arquivo s = self.predictionary if not s: s.append([w,2,1,ida])#segunda ocorrencia s.sort(key=lambda x: x[0]) #sort pela primeira coluna (palavras) return 0 # if w < s[0][0]: # s.append([w,2,1,ida])#segunda ocorrencia # s.sort(key=lambda x: x[0]) #sort pela primeira coluna (palavras) # return 0 ini, modified, fim = 0, 0, len(s) while ini <= fim: m = (ini + fim) / 2 if m >= len(s): s.append([w,2,1,ida])#segunda ocorrencia s.sort(key=lambda x: x[0]) #sort pela primeira coluna (palavras) return 0 if w == s[m][0]: modified = 1 s[m][1] += 1 if ida != s[m][3]: s[m][2] += 1 return 0 elif w < s[m][0]: fim = m - 1 else: ini = m + 1 if modified == 0: s.append([w,2,1,ida])#segunda ocorrencia s.sort(key=lambda x: x[0]) #sort pela primeira coluna (palavras) return 0 def start(self): print "Start Dictionary" col_words = Set([]) #colecao de palavras UNICAS for f in self.arquivos: arq = open(self.parser.diretorio.messages+f,"r")#abrindo documento texto = arq.read()#lendo texto do documento word = ""#palavra for c in texto:#lendo caracter por caracter no texto if c in self.parser.separadores:#o caracter eh um separador de palavras? if word: #palavra nao pode ser vazia if not word.isdigit():#consideramos alfanumericos e removemos apenas numeros word = word.lower()#normalizando word = word.decode('iso-8859-1').encode('utf8')#alguns caracteres invalios para utf8 if len(word) > 3 and self.parser.checkWord.check(word):#consideramos apeas palavras com mais de 3 digitos self.totalPalavras += 1 if word in col_words: self.updatePre(word,f) else: col_words.add(word) #colecao de palavras word = "" else: word = word + c self.build()