예제 #1
0
파일: descriptor.py 프로젝트: tuka04/mc906
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
예제 #2
0
파일: dictionary.py 프로젝트: tuka04/mc906
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()