-
Notifications
You must be signed in to change notification settings - Fork 0
/
checagem_texto.py
158 lines (137 loc) · 5.17 KB
/
checagem_texto.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#coding: utf-8
#analise de textos em português de sistemas de software
#dados retirados da página do professor Fabio Kon:
# http://www.ime.usp.br/~kon/ResearchStudents/traducao.html
#
#para executar os teste: python -m doctest -v checagem_texto.py
import codecs
import csv
import re
PALAVRAS_QUE_DEVERIAM_TRADUZIR = "./palavras_deveriam_traduzir.txt"
PALAVRAS_QUE_PODERIAM_TRADUZIR = "./palavras_poderiam_traduzir.txt"
PALAVRAS_MAL_TRADUZIDAS = "./mal_traduzidos.txt"
def checar_texto(nome_do_arquivo,codificacao="utf-8"):
"""
python checagem_texto.py nome_do_arquivo [codificacao]
"""
dicionarios = lista_dicionarios()
linhas_do_arquivo = []
resultados = []
with codecs.open(nome_do_arquivo,"r",codificacao) as arquivo:
linhas_do_arquivo = arquivo.read().splitlines()
for linha_numero,linha in enumerate(linhas_do_arquivo,1):
resultado_consulta = consulta_dicionario(linha,dicionarios)
if resultado_consulta:
resultados.append([resultado_consulta,linha_numero,linha])
imprimir_resultados(resultados,dicionarios)
def imprimir_resultados(resultados,dicionarios):
for resultado in resultados:
resultado_dicionario = resultado[0]
numero_linha = resultado[1]
linha = resultado[2]
print "linha "+str(numero_linha)
try:
print str(linha)
except UnicodeEncodeError:
print repr(linha)
print "_______________________________________________________"
for dicionario in resultado_dicionario:
if resultado_dicionario[dicionario] != []:
print " | ".join(dicionarios[dicionario][0])
for linhas in resultado_dicionario[dicionario]:
print " | ".join(linhas)
print "__________________________________________"
def consulta_dicionario(linha, lista_dicionarios):
"""
>>> dicionarios = {"dicionario1":[[u"Termo em Ingles",u"Traducao Correta",u"Traducao Indesejavel"],["a", "b" , "c"]]}
>>> consulta_dicionario(u"aa",dicionarios)
{'dicionario1': [['a', 'b', 'c']]}
>>> consulta_dicionario(u"d",dicionarios)
{}
"""
lista_resultados = {}
for nome_dicionario in lista_dicionarios:
lista_resultados[nome_dicionario] = []
dicionario = lista_dicionarios[nome_dicionario]
for linha_dicionario in dicionario:
if verifica_linha(linha,linha_dicionario,dicionario):
lista_resultados[nome_dicionario].append(linha_dicionario)
remover_chaves_vazias(lista_resultados)
return lista_resultados
def remover_chaves_vazias(dict):
"""
>>> dicionario1 = {'dicionario1':["com coisa"]}
>>> remover_chaves_vazias(dicionario1)
>>> dicionario1 == {'dicionario1':["com coisa"]}
True
>>> dicionario2 = {'dicionario2':[]}
>>> remover_chaves_vazias(dicionario2)
>>> dicionario2 == {}
True
"""
chaves_vazias = [k for k,v in dict.iteritems() if v == []]
for k in chaves_vazias:
del dict[k]
def verifica_linha(linha_texto, linha_dicionario,dicionario):
lista_palavra_dicionario = []
lista_palavra_dicionario.append(linha_dicionario[0])
if len(dicionario[0]) == 3:
lista_palavra_dicionario.append(linha_dicionario[2])
for palavra_dicionario in lista_palavra_dicionario:
if verifica_palavra(palavra_dicionario,linha_texto):
return True
return False
def verifica_palavra(palavra,linha):
"""
verifica se a palavra aparece na linha
>>> verifica_palavra("texto longo","um texto longo")
True
>>> verifica_palavra("texto curto","um texto longo")
False
"""
palavra_limpa = limpa_texto(palavra)
return palavra and re.search(palavra_limpa,linha) != None
def limpa_texto(texto):
"""
limpa o texto retirando textos entre chaves e parenteses
>>> limpa_texto("palavra (detalhe)")
'palavra'
>>> limpa_texto("[detalhe] palavra")
'palavra'
>>> limpa_texto(u"palavra_unicode (não é string comum)")
u'palavra_unicode'
"""
prog = re.compile(r"\([^)]*\)|\[[^]]*\]")
texto = re.sub(prog,"",texto).strip()
return texto
def lista_dicionarios():
"""
gera a lista de dicionarios
>>> len(lista_dicionarios())
3
"""
lista_dicionario = {}
for arquivo_dicionario in [PALAVRAS_QUE_DEVERIAM_TRADUZIR,PALAVRAS_QUE_PODERIAM_TRADUZIR,PALAVRAS_MAL_TRADUZIDAS]:
lista_dicionario[arquivo_dicionario] = ler_dicionario(arquivo_dicionario)
return lista_dicionario
def csv_unireader(f, encoding="utf-8"):
"""
abre um arquivo utf-8 com a lib csv
"""
for row in csv.reader(codecs.iterencode(codecs.iterdecode(f, encoding), "utf-8"), delimiter="\t"):
yield [e.decode("utf-8") for e in row]
def ler_dicionario(nome_do_arquivo):
"""
>>> ler_dicionario("teste.txt")
[[u'1', u'2', u'3'], [u'4', u'5', u'6']]
"""
with open(nome_do_arquivo,"rU") as arquivo:
reader = csv_unireader(arquivo)
return [linhas for linhas in reader]
def main(argv=None):
if argv is None:
argv = sys.argv[1:]
checar_texto(*argv)
if __name__ == "__main__":
import sys
sys.exit(main())