Commit 61ffafeb40b1062641a3e7137b5d7c1ba2f46267
1 parent
1bf3fe85
Exists in
master
and in
1 other branch
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 |