-
Notifications
You must be signed in to change notification settings - Fork 0
/
estrutura_dados.py
executable file
·79 lines (63 loc) · 3.7 KB
/
estrutura_dados.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
# -*- coding: utf-8 -*-
'''
Conjunto de funções para lidar com arquivos UD (.conllu)
Objetivo: ser importado em outros códigos do pacote ACDC-UD: "import estrutura_dados"
'''
#Abre o arquivo UD em um caminho dado ("ud_file"), segmenta suas sentenças, suas linhas, e cada uma das 10 colunas dos seus tokens
def LerUD(ud_file):
codification = "utf-8"
#Abre o arquivo no caminho fornecido e segmenta as sentenças
with open(ud_file, 'r') as f:
arquivo = f.read().split('\n\n')
#Agora que "arquivo" é uma lista de sentenças, apagar os itens que estiverem vazios (no caso, por exemplo, de linhas em excesso no final do arquivo, resultando em splits("\n\n") que não são de fato sentenças)
arquivo = [x for x in arquivo if x]
#Para cada sentença na lista de sentenças,
for a, sentence in enumerate(arquivo):
#Essa sentença vai ter suas linhas segmentadas
arquivo[a] = arquivo[a].splitlines() #Repare que linha pode ser tanto os tokens quanto os metadados (linhas que começam com "# text = ", por exemplo)
#Para cada linha já segmentada nessa dada sentença (arquivo[a]),
for b, linha in enumerate(arquivo[a]):
#Se a quantidade de colunas for 10, (ou seja, garante que estou lidando com tokens, e não com metadados)
if '\t' in linha:
#Essa linha, que na verdade é um token, (sentença arquivo[a], token[b]), vai ser dividida em colunas
arquivo[a][b] = arquivo[a][b].split('\t')
#Retorna uma lista com sentenças, sendo cada sentença uma lista de linhas, e cada lista de linhas, se tiver 10 colunas, uma lista de 10 colunas
return arquivo
#Depois de feitas as alterações em um arquivo UD (variável "UD"), essa função retorna o conjunto de listas para o formato "string" normal para ser salvo em um arquivo (variável "arquivo")
def EscreverUD(UD, arquivo):
codification = "utf-8"
#Para cada sentença na lista "UD",
for a, sentence in enumerate(UD):
#Para cada linha dentro dessa sentença,
for b, linha in enumerate(UD[a]):
#Se for um token (tiver 10 colunas) e não for um metadado (contiver "# "),
if isinstance(linha, list) and not '# ' in linha:
#Reunir as colunas adicionando um "\t"
UD[a][b] = "\t".join(UD[a][b])
#Depois de reunir todos os tokens que devem ser reunidos, reunir todas as linhas com um "\n"
UD[a] = "\n".join(UD[a])
#Reunidas todas as linhas, reunir as sentenças
UD = "\n\n".join(UD) + '\n\n' #O "\n" no final é necessário pois todo arquivo UD deve ter uma linha vazia no final, é uma exigência dos códigos de comparação, avaliação, etc.
#Salvar :)
with open(arquivo, 'w', encoding=codification) as f:
f.write(UD)
#Depois de feitas as alterações em um arquivo UD (variável "UD"), essa função retorna o conjunto de listas para o formato "string" normal para ser salvo em um arquivo (variável "arquivo")
def PrintarUD(UD, arquivo):
codification = "utf-8"
#Para cada sentença na lista "UD",
for a, sentence in enumerate(UD):
#Para cada linha dentro dessa sentença,
for b, linha in enumerate(UD[a]):
#Se for um token (tiver 10 colunas) e não for um metadado (contiver "# "),
if isinstance(linha, list) and not '# ' in linha:
#Reunir as colunas adicionando um "\t"
UD[a][b] = "\t".join(UD[a][b])
#Depois de reunir todos os tokens que devem ser reunidos, reunir todas as linhas com um "\n"
UD[a] = "\n".join(UD[a])
#Reunidas todas as linhas, reunir as sentenças
UD = "\n\n".join(UD) + '\n' #O "\n" no final é necessário pois todo arquivo UD deve ter uma linha vazia no final, é uma exigência dos códigos de comparação, avaliação, etc.
#Salvar :)
return UD
#Transforma acentos e caracteres especiais em underlines
def slugify(value):
return "".join(x if x.isalnum() or x == '.' or x == '-' else "_" for x in value)