Пример #1
0
def RR(diretorioTrabalho, diretorioModelo, crossValidation, labelled, test,
       iteracao):
    #relações acertadas pelo sistema de acordo com a CD
    linha = 0
    relacoesAcertos = 0
    nrAcertos = 0
    nrparcial = 0
    nrtotal = 0
    orgorg = 0
    orglocal = 0
    orgpessoa = 0
    orgorgp = 0
    orglocalp = 0
    orgpessoap = 0
    nrEncontrados = 0
    nrEntrada = 0
    #relações descritas pelo sistema
    relacoesChutadas = 0

    #tabela de confusão da iteração
    result = [[0, 0], [0, 0]]

    #variável lab representa apenas valores válidos de labels, [[sent1],[sent2]...[sentN]]
    lab = []
    for label in labelled:
        if label == None:
            continue
        if label != []:
            for s in label[1]:
                if (s != []):
                    lab.append(s)

    #chamada do CRF para GERACAO DO MODELO no MALLET
    #treina ou abre o já treinado CRF
    #Obs.:Mudar na classe CRFnltk para não gravar sobre modelo gerado
    diretorioModeloAtual = diretorioModelo
    if crossValidation:
        diretorioModeloAtual = diretorioModelo + '_' + str(iteracao)
    if not os.path.exists(diretorioModeloAtual):
        print 'Modelo não encontrado, criando novo modelo', diretorioModeloAtual
        crf = CRFnltk.CRFTrain(lab, iteracao)
        pickle.dump(crf, open(diretorioModeloAtual, 'w'))
    else:
        print 'Modelo encontrado:', diretorioModeloAtual, '. Utilizando modelo já existente'
        crf = pickle.load(open(diretorioModeloAtual, 'r'))

    #variável para conter os resultados do CRF
    labels = []

    #arquivo para salvar em formato de Tabela
    dirExc = diretorioTrabalho + '/result_' + str(iteracao) + 'it.ods'
    tabeladescritores = open(diretorioTrabalho + '/tabela_descritores.ods',
                             'a')
    #limpa arquivof
    fileEx = open(dirExc, 'w')
    fileEx.write('')
    fileEx.close()

    #contador de intens BILOU da iteração
    contBio = 0

    #itera sobre o conjunto de teste
    contador = 0
    descritorEntrada = open(diretorioTrabalho + '/Descritor_Entrada.txt', 'a')
    descritor = open(diretorioTrabalho + '/Descritor_Saida.txt', 'a')
    descritorCerto = open(diretorioTrabalho + '/DescritorCerto_Saida.txt', 'a')
    listadescritor = open(diretorioTrabalho + '/Lista_descritor.txt', 'a')
    listachaves = open(diretorioTrabalho + '/Lista_chaves.txt', 'a')
    for texto in test:
        if texto == None:
            continue
        if texto != []:
            #inicializa vetor da marcação correta do BIO
            truth = []
            #inicializa vetor com as informações de cada palavra
            tagged = []
            #itera sobre as sentenças do texto
            for s in texto[1]:
                if (s != []):
                    for w in s:
                        tagged.append(w[0])
                        truth.append(w[1])

            #usa o CRF para determinar o valor BILOU da palavra
            #aplica o modelo crf nos textos de teste - tagged
            labels = CRFnltk.CRF_prediction(
                crf, tagged)  #toda a saida etiquetada pelo CRF

            #contador de labels
            contLabels = 0

            #limpa o arquivo com as marcações
            dir = diretorioTrabalho + '/marcados/iteracao ' + str(
                iteracao) + '/' + str(texto[0])
            file = open(dir, 'w')
            file.write('')
            file.close()
            #escreve o titulo dos textos no arquivo dos descritores
            if (linha == 0):
                descritor.write(texto[0] + '\n')
                descritorCerto.write(texto[0] + '\n')
            elif (linha == 1):
                descritor.write('\n' + texto[0] + '\n')
                descritorCerto.write('\n' + texto[0] + '\n')
            linha = 1
            #escreve o titulo do texto no arquivo excell
            fileEx = open(dirExc, 'a')
            fileEx.write(str(texto[0]) + '\n\n\n')
            fileEx.close()

            print 'gravando em', dir, '...'

            if texto != []:
                #itera sobre sentenças do texto
                for s in texto[1]:
                    if (s != []):

                        file = open(dir, 'a')
                        file.write('\n\t')
                        file.close()
                        verd = True
                        parc = False
                        num = 0
                        num2 = 0
                        sinal = 0
                        sinal2 = 0
                        sInicio = s[0]  #primeira palavra da sentença
                        sFim = s[-1]  #ultima palavra da sentença
                        acerto = True  #é acerto até que se prove o contrário
                        mostraErrados = False  #variavel escrever as EN encontradas por engano pelo sistema na saida excell

                        #itera sobre as palavras da sentença
                        for w in s:
                            #escreve no arquivo com as marcações
                            file = open(dir, 'a')
                            file.write(
                                str(w[0]['palavra'] + " ") + '<' +
                                str(w[0]['POSTag']) + ',' +
                                labels[contLabels] + '> ')
                            file.close()

                            #incrementa a tabela de confusão
                            result[classe(truth[contLabels])][classe(
                                labels[contLabels])] += 1
                            ############# Numero total da entrada ########################
                            #faz a contagem da entrada e escreve no descritor de entrada primeira palavra+descritores+ultima palavra
                            if (truth[contLabels] == 'REL' and sinal2 == 0):
                                nrEntrada += 1  #contagem
                                descritorEntrada.write(
                                    '[+' + sInicio[0]['palavraOriginal'] +
                                    "+, ")  #primeira palavra
                                sinal2 = 1
                            if (truth[contLabels] == 'REL' and sinal2 == 1):
                                descritorEntrada.write(w[0]['palavra'] +
                                                       " ")  #descritores
                            if (w[0]['palavra'] == sFim[0]['palavra']
                                    and sinal2 == 1):
                                descritorEntrada.write(
                                    '; +' + sFim[0]['palavraOriginal'] + '+]' +
                                    sInicio[0]['clas'] + '-' +
                                    sFim[0]['clas'] + '\n')  #ultima palavra
                                sinal2 = 0
                ##############################################################
                ############# Numero de encontrados ##########################
#faz a contagem dos encontrados e escreve no descritor dos encontrados a primeira palavra + descritores + ultima palavra
                            if (labels[contLabels] == 'REL' and sinal == 0):
                                nrEncontrados += 1  #contagem
                                descritor.write('[+' +
                                                sInicio[0]['palavraOriginal'] +
                                                "+, ")  #primeira palavra
                                sinal = 1
                            if (labels[contLabels] == 'REL' and sinal == 1):
                                descritor.write(' ' +
                                                w[0]['palavra'])  #descritores
                            if (w[0]['palavra'] == sFim[0]['palavra']
                                    and sinal == 1):
                                descritor.write('; +' +
                                                sFim[0]['palavraOriginal'] +
                                                '+]\n')  #ultima palavra
                                sinal = 0
                ##############################################################
                            if (
                                    labels[contLabels] == 'REL'
                            ):  #incrementa o número de relações encontradas pelo sistema
                                relacoesChutadas += 1
                            if (labels[contLabels] == 'REL'
                                    and truth[contLabels]
                                    == 'O'):  #verifica se foi acerto parcial
                                parc = True
                            if (labels[contLabels] == 'O' and truth[contLabels]
                                    == 'REL'):  #verifica se foi acerto parcial
                                parc = True
                ############ Numero de Acertos ################################
#faz a contagem dos acertos e escreve no descritor de acertos a primeira palavra+descritor+ultima palavra
                            if (labels[contLabels] == 'REL'
                                    and truth[contLabels] == 'REL'
                                    and num == 0):
                                nrAcertos += 1  #contagem dos acertos
                                tabeladescritores.write(sInicio[0]['palavra'] +
                                                        '(' +
                                                        sInicio[0]['clas'] +
                                                        ')' + ',')
                                listadescritor.write(
                                    '[+' + sInicio[0]['palavraOriginal'] +
                                    '+,')
                                listachaves.write(
                                    '[+' + sInicio[0]['palavraOriginal'] +
                                    '(' + sInicio[0]['clas'] + ')+,')
                                descritorCerto.write(
                                    sInicio[0]['palavraOriginal'] + '(' +
                                    sInicio[0]['clas'] + ')' +
                                    " ")  #primeira palavra+(classificação)
                                num = 1
                                #faz a verificação da sentença, se é ORG-ORG ou ORG-LOCAL ou ORG-PESSOA
                            if (parc == True and num2 == 0 and num != 0):
                                nrparcial += 1  #contagem de acertos parciais
                                num2 = 1
                            if (labels[contLabels] == 'REL'
                                    and truth[contLabels] == 'REL'
                                    and num == 1):
                                descritorCerto.write(w[0]['palavra'] +
                                                     " ")  #descritores
                                listadescritor.write(' ' + w[0]['palavra'] +
                                                     " ")
                                listachaves.write(' ' + w[0]['palavra'] + " ")
                                tabeladescritores.write(w[0]['palavra'] + ' ')
                            if (w[0]['palavra'] == sFim[0]['palavra']
                                    and num == 1):
                                descritorCerto.write(
                                    sFim[0]['palavraOriginal'] + '(' +
                                    sFim[0]['clas'] +
                                    ')')  #ultima palavra+(classificação)
                                listadescritor.write(
                                    '; +' + sFim[0]['palavraOriginal'] + '+]')
                                listachaves.write('; +' +
                                                  sFim[0]['palavraOriginal'] +
                                                  '(' + sFim[0]['clas'] +
                                                  ')+]')
                                tabeladescritores.write(',' +
                                                        sFim[0]['palavra'] +
                                                        '(' + sFim[0]['clas'] +
                                                        ')' + '\n')
                                num = 2
                            if (parc == True and num == 2):
                                descritorCerto.write(
                                    'PARCIAL' + '\n'
                                )  #escreve se a sentença é acerto parcial
                                listachaves.write(sInicio[0]['clas'] + '-' +
                                                  sFim[0]['clas'] +
                                                  ' PARCIAL' + '\n')
                                listadescritor.write(sInicio[0]['clas'] + '-' +
                                                     sFim[0]['clas'] +
                                                     ' PARCIAL' + '\n')
                                if (sInicio[0]['clas'] == 'ORG'
                                        and sFim[0]['clas'] == 'ORG'):
                                    orgorgp += 1
                                if (sInicio[0]['clas'] == 'ORG'
                                        and sFim[0]['clas'] == 'LOCAL'):
                                    orglocalp += 1
                                if (sInicio[0]['clas'] == 'LOCAL'
                                        and sFim[0]['clas'] == 'ORG'):
                                    orglocalp += 1
                                if (sInicio[0]['clas'] == 'ORG'
                                        and sFim[0]['clas'] == 'PES'):
                                    orgpessoap += 1
                                if (sInicio[0]['clas'] == 'PES'
                                        and sFim[0]['clas'] == 'ORG'):
                                    orgpessoap += 1
                            if (parc == False and num == 2):
                                descritorCerto.write(
                                    'TOTAL' + '\n'
                                )  #escreve se a sentença é acerto total
                                listadescritor.write(sInicio[0]['clas'] + '-' +
                                                     sFim[0]['clas'] +
                                                     ' TOTAL' + '\n')
                                listachaves.write(sInicio[0]['clas'] + '-' +
                                                  sFim[0]['clas'] + ' TOTAL' +
                                                  '\n')
                                if (sInicio[0]['clas'] == 'ORG'
                                        and sFim[0]['clas'] == 'ORG'):
                                    orgorg += 1
                                if (sInicio[0]['clas'] == 'ORG'
                                        and sFim[0]['clas'] == 'LOCAL'):
                                    orglocal += 1
                                if (sInicio[0]['clas'] == 'LOCAL'
                                        and sFim[0]['clas'] == 'ORG'):
                                    orglocal += 1
                                if (sInicio[0]['clas'] == 'ORG'
                                        and sFim[0]['clas'] == 'PES'):
                                    orgpessoa += 1
                                if (sInicio[0]['clas'] == 'PES'
                                        and sFim[0]['clas'] == 'ORG'):
                                    orgpessoa += 1

                ################################################################
                            if (labels[contLabels] == 'REL'
                                    and truth[contLabels] == 'O'
                                ):  #uma entidade encontrada por engano
                                mostraErrados = True
                            if (mostraErrados
                                ):  #mostra toda a EN marcada por engano
                                #escreve no excell
                                fileEx = open(dirExc, 'a')
                                fileEx.write(
                                    str(w[0]['palavra']) + '<' +
                                    str(w[0]['POSTag']) + ',' + ',' +
                                    labels[contLabels] + '>;' +
                                    str(w[0]['palavra']) + '<' +
                                    str(w[0]['POSTag']) + ',' + ',' +
                                    truth[contLabels] + '>\n')
                                if labels[contLabels] != truth[contLabels]:
                                    acerto = False
                                fileEx.close()

                            else:  #fim da EN marcada por engano
                                mostraErrados = False

                            #escreve no arquivo tabela o resultado do sistema e o correto
                            if (truth[contLabels] == 'REL'
                                    and labels[contLabels] == 'REL'
                                ):  #parte de uma relação segundo a CD
                                acerto = True  #a principio é acerto
                                relacoesAcertos += 1
                                #escreve a palavra na tabela
                                fileEx = open(dirExc, 'a')
                                fileEx.write(
                                    str(w[0]['palavra']) + '<' +
                                    str(w[0]['POSTag']) + ',' + ',' +
                                    labels[contLabels] + '>;' +
                                    str(w[0]['palavra']) + '<' +
                                    str(w[0]['POSTag']) + ',' + ',' +
                                    truth[contLabels] + '>\n')
                                fileEx.write(';V')
                                fileEx.write('\n')
                                fileEx.close()

                            contLabels = contLabels + 1

            else:
                print str(texto[0]), 'vazio'
                exit()
            contador += 1
            contBio += contLabels
        else:
            continue
    tabeladescritores.close()
    descritorEntrada.close()
    descritor.close()
    descritorCerto.close()
    listadescritor.close()
    listachaves.close()
    return orgorgp, orglocalp, orgpessoap, orgorg, orglocal, orgpessoa, nrEntrada, nrEncontrados, nrparcial, nrtotal, nrAcertos, result, contBio, relacoesAcertos, relacoesChutadas
Пример #2
0
def RR(labelled, test, iteracao):
    #relações acertadas pelo sistema de acordo com a CD
    relacoesAcertos = 0
    #relações descritas pelo sistema
    relacoesChutadas = 0

    #tabela de confusão da iteração
    result = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

    #variável lab representa apenas valores válidos de labels, [[sent1],[sent2]...[sentN]]
    lab = []
    for label in labelled:
        if label == None:
            continue
        if label != []:
            for s in label[1]:
                if (s != []):
                    lab.append(s)

    #treina ou abre o já treinado CRF
    #Obs.:Mudar na classe CRFnltk para não gravar sobre modelo gerado
    crf = CRFnltk.CRFTrain(lab, iteracao)

    #variável para conter os resultados do CRF
    labels = []

    #arquivo para salvar em formato de Tabela
    dirExc = diretorioTrabalho + '/result_' + str(iteracao) + 'it.ods'

    #limpa arquivo
    fileEx = open(dirExc, 'w')
    fileEx.write('')
    fileEx.close()

    #contador de intens BILOU da iteração
    contBio = 0

    #itera sobre o conjunto de teste
    contador = 0
    for texto in test:
        if texto == None:
            continue
        if texto != []:
            #inicializa vetor da marcação correta do BILOU
            truth = []
            #inicializa vetor com as informações de cada palavra
            tagged = []
            #itera sobre as sentenças do texto
            for s in texto[1]:
                if (s != []):
                    for w in s:
                        tagged.append(w[0])
                        truth.append(w[1])

            #usa o CRF para determinar o valor BILOU da palavra
            labels = CRFnltk.CRF_prediction(crf, tagged)

            #contador de labels
            contLabels = 0

            #adiciona o inicio do texto à saída no formato HAREM
            saida = open(diretorioTrabalho + '/saidaHarem.xml', 'a')
            saida.write('<DOC DOCID="' + str(texto[0])[:-4] + '">\n')
            saida.close()

            #limpa o arquivo com as marcações
            dir = diretorioTrabalho + '/marcados/iteracao ' + str(
                iteracao) + '/' + str(texto[0])
            file = open(dir, 'w')
            file.write('')
            file.close()

            #escreve o titulo do texto no arquivo excell
            fileEx = open(dirExc, 'a')
            fileEx.write(str(texto[0]) + '\n\n\n')
            fileEx.close()

            print 'gravando em', dir, '...'

            if texto != []:
                #itera sobre sentenças do texto
                for s in texto[1]:
                    if (s != []):

                        file = open(dir, 'a')
                        file.write('\n\t')
                        file.close()

                        acerto = True  #é acerto até que se prove o contrário
                        mostraErrados = False  #variavel escrever as EN encontradas por engano pelo sistema na saida excell

                        #itera sobre as palavras da sentença
                        for w in s:

                            #escreve no arquivo com as marcações
                            file = open(dir, 'a')
                            file.write(
                                str(w[0]['palavra']) + '<' +
                                str(w[0]['POSTag']) + ',' +
                                labels[contLabels] + '> ')
                            file.close()

                            #verifica se a palavra é início de uma entidade
                            if (iniEnt(labels, contLabels)):
                                #se for inicio de EN, escreve a tag de inicio de EN da CD
                                saida = open(
                                    diretorioTrabalho + '/saidaHarem.xml', 'a')
                                saida.write('<EM ID="' + str(texto[0])[:-4] +
                                            '"> ')
                                saida.close()

                            #escreve a palavra na saída do formato harem
                            saida = open(diretorioTrabalho + '/saidaHarem.xml',
                                         'a')
                            saida.write(str(w[0]['palavra']) + ' ')
                            saida.close()

                            #incrementa a tabela de confusão
                            result[classe(truth[contLabels])][classe(
                                labels[contLabels])] += 1

                            #verifica se a palavra é fim de uma entidade
                            if (endEnt(labels, contLabels)):
                                #se for fim de EN, escreve a tage de inicio de EN da CD
                                saida = open(
                                    diretorioTrabalho + '/saidaHarem.xml', 'a')
                                saida.write('</EM>')
                                saida.close()

                            if (
                                    labels[contLabels] == 'B-REL'
                            ):  #incrementa o número de relações encontradas pelo sistema
                                relacoesChutadas += 1

                            if (labels[contLabels] == 'B-REL'
                                    and truth[contLabels] == 'O'
                                ):  #uma entidade encontrada por engano
                                mostraErrados = True
                            if (mostraErrados and labels[contLabels] !=
                                    'O'):  #mostra toda a EN marcada por engano
                                #escreve no excell
                                fileEx = open(dirExc, 'a')
                                fileEx.write(
                                    str(w[0]['palavra']) + '<' +
                                    str(w[0]['POSTag']) + ',' + ',' +
                                    labels[contLabels] + '>;' +
                                    str(w[0]['palavra']) + '<' +
                                    str(w[0]['POSTag']) + ',' + ',' +
                                    truth[contLabels] + '>\n')
                                if labels[contLabels] != truth[
                                        contLabels] or truth[contLabels] == 'O':
                                    acerto = False
                                fileEx.close()

                            else:  #fim da EN marcada por engano
                                mostraErrados = False

                            #escreve no arquivo tabela o resultado do sistema e o correto
                            if (truth[contLabels] == 'B-REL'
                                    or truth[contLabels] == 'I-REL'
                                ):  #parte de uma relação segundo a CD
                                if (truth[contLabels] == 'B-REL'):
                                    acerto = True  #a princio é acerto
                                #escreve a palavra na tabela
                                fileEx = open(dirExc, 'a')
                                fileEx.write(
                                    str(w[0]['palavra']) + '<' +
                                    str(w[0]['POSTag']) + ',' + ',' +
                                    labels[contLabels] + '>;' +
                                    str(w[0]['palavra']) + '<' +
                                    str(w[0]['POSTag']) + ',' + ',' +
                                    truth[contLabels] + '>\n')
                                fileEx.close()

                                if labels[contLabels] != truth[
                                        contLabels] or truth[
                                            contLabels] == 'O':  #erro na marcação
                                    acerto = False

                                if acerto:  #verificar se realmente foi acerto
                                    if len(truth) - 1 == contLabels:
                                        relacoesAcertos += 1
                                        fileEx = open(dirExc, 'a')
                                        fileEx.write(';V')
                                        fileEx.close()
                                        acerto = False
                                    elif truth[contLabels +
                                               1] != 'I-REL' and labels[
                                                   contLabels + 1] != 'I-REL':
                                        relacoesAcertos += 1
                                        fileEx = open(dirExc, 'a')
                                        fileEx.write(';V')
                                        fileEx.close()
                                        acerto = False

                                #verifica o fim da relação
                                if (endEnt(truth, contLabels)):
                                    #escreve o fim da relação marcada como uma linha em branco no excell
                                    fileEx = open(dirExc, 'a')
                                    fileEx.write('\n')
                                    fileEx.close()

                            contLabels = contLabels + 1

                        saida = open(diretorioTrabalho + '/saidaHarem.xml',
                                     'a')
                        saida.write('\n')
                        saida.close()
            else:
                print str(texto[0]), 'vazio'
                exit()
            saida = open(diretorioTrabalho + '/saidaHarem.xml', 'a')
            saida.write('</DOC>\n')
            saida.close()
            contador += 1
            contBio += contLabels
        else:
            continue

    return result, contBio, relacoesAcertos, relacoesChutadas
Пример #3
0
            prec = float(resultado[i][i]) / a
    
        #a recebe a soma de todos os itens da linha da tabela
        a = (sum([resultado[i][j] for j in range(3)]))
        if a != 0:
            #calcula-se a abrangência dividindo o que foi marcado certo
            #por tudo que foi marcado para o item
            rec = float(resultado[i][i]) / a
    
        #calcula a F-Measure
        if(prec+rec == 0):
            continue
        fMeasure = (2*prec*rec)/(prec+rec)
    
        #linha da tabela de confusão
        saida = str(classe(i))+ '\t'+ str(resultado[i][0])+ '\t'+ str(resultado[i][1])+ '\t'+ str(resultado[i][2])+ '\t'+ str(rec)+ '\t'+ str(prec) + '\t' + str(fMeasure)
            
        print saida
        
        file = open(diretorioTrabalho+'/result.ods', 'a')
        file.write(saida + '\n')
        file.close()
    
#MEDIDAS TOTAIS
prec = float(relacoesAcertos)/relacoesChutadas
rec = float(relacoesAcertos)/relacoesTotal
fmeasure = (2*prec*rec)/(prec+rec)

saida = '\n\n relacoes\n\ttotal:'+str(relacoesTotal)+'\n\tencontradas:'+str(relacoesChutadas)+'\n\tacertos:'+str(relacoesAcertos)+'\n\tprecisão:'+str(prec)+'\n\trecall:'+str(rec)+'\n\tfmeasure:'+str(fmeasure)
print saida
if(crossValidation):
Пример #4
0
        prec = float(resultado[i][i]) / a

    #a recebe a soma de todos os itens da linha da tabela
    a = (sum([resultado[i][j] for j in range(3)]))
    if a != 0:
        #calcula-se a abrangência dividindo o que foi marcado certo
        #por tudo que foi marcado para o item
        rec = float(resultado[i][i]) / a

    #calcula a F-Measure
    if (prec + rec == 0):
        continue
    fMeasure = (2 * prec * rec) / (prec + rec)

    #linha da tabela de confusão
    saida = str(classe(i)) + '\t' + str(resultado[i][0]) + '\t' + str(
        resultado[i][1]) + '\t' + str(resultado[i][2]) + '\t' + str(
            rec) + '\t' + str(prec) + '\t' + str(fMeasure)

    print saida

    file = open(diretorioTrabalho + '/result.ods', 'a')
    file.write(saida + '\n')
    file.close()

#MEDIDAS TOTAIS
prec = float(relacoesAcertos) / relacoesChutadas
rec = float(relacoesAcertos) / relacoesTotal
fmeasure = (2 * prec * rec) / (prec + rec)

saida = '\n\n relacoes\n\ttotal:' + str(
Пример #5
0
def RR(labelled, test, iteracao):
    #relações acertadas pelo sistema de acordo com a CD
    relacoesAcertos = 0
    #relações descritas pelo sistema
    relacoesChutadas = 0
    
    #tabela de confusão da iteração
    result = [[0, 0], [0, 0]]

    #variável lab representa apenas valores válidos de labels, [[sent1],[sent2]...[sentN]]
    lab = []
    for label in labelled:
        if label == None:
            continue
        if label != []:
            for s in label[1]:
                if(s != []):
                    lab.append(s)
    
    #chamada do CRF para GERACAO DO MODELO no MALLET
    #treina ou abre o já treinado CRF
    #Obs.:Mudar na classe CRFnltk para não gravar sobre modelo gerado
    diretorioModeloAtual = diretorioModelo
    if crossValidation:
        diretorioModeloAtual = diretorioModelo+'_'+str(iteracao)
    if not os.path.exists(diretorioModeloAtual):
        print 'Modelo não encontrado, criando novo modelo', diretorioModeloAtual
        crf = CRFTrain(lab, iteracao)
        pickle.dump(crf,open(diretorioModeloAtual,'w'))
    else:
        print 'Modelo encontrado:', diretorioModeloAtual, '. Utilizando modelo já existente'
        crf = pickle.load(open(diretorioModeloAtual,'r'))


    #variável para conter os resultados do CRF
    labels = []

    #arquivo para salvar em formato de Tabela
    dirExc = diretorioTrabalho+'/result_' + str(iteracao) + 'it.ods'

    #limpa arquivo
    fileEx = open(dirExc,'w')
    fileEx.write('')
    fileEx.close()

    #contador de intens BILOU da iteração
    contBio = 0

    #itera sobre o conjunto de teste
    contador = 0
    for texto in test:
        if texto == None:
            continue
        if texto != []:
            #inicializa vetor da marcação correta do BIO
            truth = []
            #inicializa vetor com as informações de cada palavra
            tagged = []
            #itera sobre as sentenças do texto
            for s in texto[1]:
                if(s != []):
                    for w in s:
                        tagged.append(w[0])
                        truth.append(w[1])

            #usa o CRF para determinar o valor BILOU da palavra
            #aplica o modelo crf nos textos de teste - tagged            
            labels = CRF_prediction(crf, tagged)
            
            #contador de labels
            contLabels = 0
            
            #limpa o arquivo com as marcações
            dir = diretorioTrabalho+'/marcados/iteracao ' + str(iteracao) + '/' + str(texto[0])
            file = open(dir,'w')
            file.write('')
            file.close()
            
            #escreve o titulo do texto no arquivo excell
            fileEx = open(dirExc,'a')
            fileEx.write(str(texto[0]) +'\n\n\n')
            fileEx.close()
            
            print 'gravando em', dir, '...'
                        
            if texto != []:
                #itera sobre sentenças do texto
                for s in texto[1]:
                    if(s != []):
                        
                        file = open(dir,'a')
                        file.write('\n\t')
                        file.close()
                        
                        acerto = True#é acerto até que se prove o contrário
                        mostraErrados = False#variavel escrever as EN encontradas por engano pelo sistema na saida excell
                        
                        #itera sobre as palavras da sentença
                        for w in s:

                            #escreve no arquivo com as marcações
                            file = open(dir,'a')
                            file.write(str(w[0]['palavra']) + '<' + str(w[0]['POSTag']) + ',' + labels[contLabels] + '> ')
                            file.close()

                            #incrementa a tabela de confusão
                            result[classe(truth[contLabels])][classe(labels[contLabels])] += 1

                            if(labels[contLabels] == 'REL'):#incrementa o número de relações encontradas pelo sistema
                                relacoesChutadas += 1
                                
                            if(labels[contLabels] == 'REL' and truth[contLabels] == 'O'):#uma entidade encontrada por engano
                                mostraErrados = True
                            if(mostraErrados):#mostra toda a EN marcada por engano
                                #escreve no excell
                                fileEx = open(dirExc,'a')
                                fileEx.write(str(w[0]['palavra']) + '<' + str(w[0]['POSTag']) + ','+ ',' + labels[contLabels] + '>;'+
                                             str(w[0]['palavra']) + '<' + str(w[0]['POSTag']) + ','+ ',' + truth[contLabels] + '>\n')
                                if labels[contLabels] != truth[contLabels] or truth[contLabels]=='O':
                                    acerto = False
                                fileEx.close()
                                
                            else:#fim da EN marcada por engano
                                mostraErrados = False

                            #escreve no arquivo tabela o resultado do sistema e o correto
                            if(truth[contLabels] == 'REL'):#parte de uma relação segundo a CD
                                if(truth[contLabels] == 'REL'):
                                    acerto = True#a princio é acerto
                                #escreve a palavra na tabela
                                fileEx = open(dirExc,'a')
                                fileEx.write(str(w[0]['palavra']) + '<' + str(w[0]['POSTag']) + ','+ ',' + labels[contLabels] + '>;'+
                                             str(w[0]['palavra']) + '<' + str(w[0]['POSTag']) + ','+ ',' + truth[contLabels] + '>\n')
                                fileEx.close()
                                
                                if labels[contLabels] != truth[contLabels] or truth[contLabels]=='O':#erro na marcação
                                    acerto = False
                                
                                if acerto:#verificar se realmente foi acerto
                                    if truth[contLabels] == 'REL' and labels[contLabels]=='REL':
                                        relacoesAcertos += 1
                                        fileEx = open(dirExc,'a')
                                        fileEx.write(';V')
					fileEx.write('\n')
                                        fileEx.close()
                                        acerto = False 
                                                                  
                            contLabels = contLabels + 1
                            
            else:
                print str(texto[0]), 'vazio'
                exit()
            contador += 1
            contBio += contLabels
        else:
            continue
        
        
    return result, contBio,relacoesAcertos, relacoesChutadas