Commit 61ffafeb40b1062641a3e7137b5d7c1ba2f46267

Authored by Erickson Silva
1 parent 1bf3fe85
Exists in master and in 1 other branch devel

Adiciona tratamento para caso não consiga realizar a classificação morfológica

Showing 1 changed file with 7 additions and 29 deletions   Show diff stats
src/new/alexp.py
@@ -27,16 +27,15 @@ @@ -27,16 +27,15 @@
27 27
28 """Este módulo contém funções que permitem utilizar o Aelius para etiquetar uma sentença, construindo entradas lexicais com base nas etiquetas atribuídas às palavras da sentença. Essas entradas lexicais são integradas em uma gramática CFG dada, que é transformada em um parser, utilizado para gerar uma árvore de estrutura sintagmática da sentença. 28 """Este módulo contém funções que permitem utilizar o Aelius para etiquetar uma sentença, construindo entradas lexicais com base nas etiquetas atribuídas às palavras da sentença. Essas entradas lexicais são integradas em uma gramática CFG dada, que é transformada em um parser, utilizado para gerar uma árvore de estrutura sintagmática da sentença.
29 """ 29 """
30 -import re, string,nltk,platform 30 +import re,nltk,platform, time, random
31 from os.path import expanduser 31 from os.path import expanduser
32 from Aelius.Extras import carrega 32 from Aelius.Extras import carrega
33 from Aelius import AnotaCorpus 33 from Aelius import AnotaCorpus
34 -from nltk_tgrep import tgrep_positions, tgrep_nodes  
35 from unicodedata import normalize 34 from unicodedata import normalize
36 35
37 36
38 sentenca_anotada="" 37 sentenca_anotada=""
39 - 38 +sleep_times=[0.1,0.2]
40 39
41 def toqueniza(s): 40 def toqueniza(s):
42 """Decodifica string utilizando utf-8, retornando uma lista de tokens em unicode. 41 """Decodifica string utilizando utf-8, retornando uma lista de tokens em unicode.
@@ -52,6 +51,9 @@ def etiquetaSentenca(s): @@ -52,6 +51,9 @@ def etiquetaSentenca(s):
52 """ 51 """
53 etiquetador = carrega("AeliusHunPos") 52 etiquetador = carrega("AeliusHunPos")
54 anotada = AnotaCorpus.anota_sentencas([s],etiquetador,"hunpos")[0] 53 anotada = AnotaCorpus.anota_sentencas([s],etiquetador,"hunpos")[0]
  54 + while (len(anotada) is 0):
  55 + time.sleep(random.choice(sleep_times))
  56 + anotada = AnotaCorpus.anota_sentencas([s],etiquetador,"hunpos")[0]
55 anotada[0] = (anotada[0][0].lower(), anotada[0][1]) 57 anotada[0] = (anotada[0][0].lower(), anotada[0][1])
56 return anotada 58 return anotada
57 59
@@ -64,7 +66,7 @@ def geraEntradasLexicais(lista): @@ -64,7 +66,7 @@ def geraEntradasLexicais(lista):
64 # que não são aceitos pelo NLTK como símbolos não terminais 66 # que não são aceitos pelo NLTK como símbolos não terminais
65 c=re.sub(r"[-+]","_",e[1]) 67 c=re.sub(r"[-+]","_",e[1])
66 c=re.sub(r"\$","_S",c) 68 c=re.sub(r"\$","_S",c)
67 - entradas.append("%s -> '%s'" % (c, removeAcento(e[0].lower()))) 69 + entradas.append("%s -> '%s'" % (c, removeAcento(e[0])))
68 return entradas 70 return entradas
69 71
70 def corrigeAnotacao(lista): 72 def corrigeAnotacao(lista):
@@ -76,8 +78,6 @@ def corrigeAnotacao(lista): @@ -76,8 +78,6 @@ def corrigeAnotacao(lista):
76 lista[i]=(lista[i][0],"VB-PP") 78 lista[i]=(lista[i][0],"VB-PP")
77 i+=1 79 i+=1
78 80
79 -# a função abaixo parece muito restritiva; talvez não seja necessário  
80 -# que o arquivo esteja no diretório nltk_data  
81 def encontraArquivo(): 81 def encontraArquivo():
82 """Encontra arquivo na pasta vlibras-translate. 82 """Encontra arquivo na pasta vlibras-translate.
83 """ 83 """
@@ -119,31 +119,9 @@ def constroiAnalisador(s): @@ -119,31 +119,9 @@ def constroiAnalisador(s):
119 cfg=nltk.CFG.fromstring(gramatica) 119 cfg=nltk.CFG.fromstring(gramatica)
120 return nltk.ChartParser(cfg) 120 return nltk.ChartParser(cfg)
121 121
122 -def corrigeArvore(arvore):  
123 - lista_pos_arv = []  
124 - for tupla in sentenca_anotada:  
125 - string_grep = adaptaAnotacao(tupla[1]) + " < " + tupla[0].lower()  
126 - node = tgrep_positions(arvore, string_grep)  
127 - if not node:  
128 - string_grep = adaptaAnotacao(tupla[1]) + " < " + removeAcento(tupla[0].lower())  
129 - node = tgrep_positions(arvore, string_grep)  
130 - if node[0] in lista_pos_arv:  
131 - node.reverse()  
132 - lista_pos_arv.append(node[0])  
133 - for i in range(0, len(sentenca_anotada)):  
134 - if arvore[lista_pos_arv[i]][0] != sentenca_anotada[i][0]:  
135 - arvore[lista_pos_arv[i]][0] = sentenca_anotada[i][0]  
136 - return arvore  
137 -  
138 def removeAcento(texto): 122 def removeAcento(texto):
139 return normalize('NFKD', texto.encode('utf-8').decode('utf-8')).encode('ascii', 'ignore') 123 return normalize('NFKD', texto.encode('utf-8').decode('utf-8')).encode('ascii', 'ignore')
140 124
141 -def adaptaAnotacao(anotacao):  
142 - split = anotacao.split('_')  
143 - for i in range(0, len(split)):  
144 - split[i] = split[i].replace('-','_')  
145 - return "-".join(split)  
146 -  
147 def exibeArvores(arvores): 125 def exibeArvores(arvores):
148 """Função 'wrapper' para a função de exibição de árvores do NLTK""" 126 """Função 'wrapper' para a função de exibição de árvores do NLTK"""
149 nltk.draw.draw_trees(*arvores) 127 nltk.draw.draw_trees(*arvores)
@@ -151,4 +129,4 @@ def exibeArvores(arvores): @@ -151,4 +129,4 @@ def exibeArvores(arvores):
151 def run(sentenca): 129 def run(sentenca):
152 tokens=toqueniza(sentenca) 130 tokens=toqueniza(sentenca)
153 tree=analisaSentenca(tokens) 131 tree=analisaSentenca(tokens)
154 - return corrigeArvore(tree)  
155 \ No newline at end of file 132 \ No newline at end of file
  133 + return tree
156 \ No newline at end of file 134 \ No newline at end of file