Skip to content

Commit

Permalink
Tipo colune VOCAB = REMOVIDO na curadoria, cache
Browse files Browse the repository at this point in the history
- inclusão do valor REMOVIDO na coluna vocab caso o termo esteja na lista de termos removidos do treinamento
- cache de curadoria com extensão diferente do cache de treinamento, permitindo rodar a curadoria do treinamento mesmo com o treinamento ocorrendo. O cache de curadoria é removido ao final do processamento da curadoria.
  - o cache de curadoria é diferente pois usa a tokenização básica para análise de todos os termos dos documentos
  • Loading branch information
luizanisio authored Oct 16, 2021
1 parent 8347452 commit ad76a92
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 16 deletions.
25 changes: 18 additions & 7 deletions src/util_doc2vec_facil.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,9 @@ def __init__(self, pasta_vocab, registrar_oov = False, tokenizar_tudo = False, f
self.ok_quebrados = set() # palavras localizadas após quebradas - token quebrado prefixo sufixo/oov
self.ok_quebrados_tokens = set() # palavras inteiras que foram localizadas após quebradas
self.registrar_oov = registrar_oov # registra as listas de oov durante a tokenização (usado na geração do vocab, não usar em treinamento)
self.vocab_final = set() # palavras encontradas no vocab
self.vocab_final = set() # palavras encontradas no vocab dos textos
self.vocab = set() # palavras que ficaram no vocab após a remoção
self.vocab_removido = set() # palavras removidas - apenas para consultra pois já são retiradas do vocab
self.vocab_tradutor_termos = set() # termos simples ou compostos para substituição ou remoção
self.tradutor_termos = None # tradutor de termos compostos
if registrar_oov and self.pasta_vocab:
Expand Down Expand Up @@ -248,6 +250,7 @@ def _preparar_termo_traducao(_termo, saida: bool):
vocab = set()
self.vocab_vazio = True
self.vocab = vocab
self.vocab_removido = vocab_removido

@classmethod
def remover_acentos(self,txt):
Expand Down Expand Up @@ -400,13 +403,17 @@ class Documentos:
# - bom para testes e criação de vocab
# retornar_tokens: retorna a lista de tokens no lugar de um TaggedDocument para Doc2Vec
# registrar_oov: grava um arquivo tokens_fora.txt com os tokens não encontrados no vocab
# cache_extensao é alterado na curadoria para não atrapalhar o cache do treinamento
def __init__(self, pasta_textos, maximo_documentos=None,
pasta_vocab=None,
registrar_oov = False,
retornar_tokens = False,
ignorar_cache = False,
tokenizar_tudo = False,
fragmentar = True):
fragmentar = True,
cache_extensao = '.clr'):
if not cache_extensao:
cache_extensao = '.clr' # garante que tem alguma extensão para o cache
self.current = -1
self.pasta = pasta_textos
self.documentos = self.listar_documentos()
Expand All @@ -423,15 +430,17 @@ def __init__(self, pasta_textos, maximo_documentos=None,
self.high = len(self.documentos)
self.qtd_processados = 0
self.timer = timer()
self.cache_extensao = cache_extensao
print(f'Documentos: Lista criada com {self.high} documentos')

def listar_documentos(self):
def listar_documentos(self, extensao_extra = ""):
extensao = f'.txt{extensao_extra}'
documentos = []
pastas_documentos = [self.pasta] if type(self.pasta) is str else list(self.pasta)
for pasta_doc in pastas_documentos:
for path, dir_list, file_list in os.walk(pasta_doc):
for file_name in file_list:
if file_name.lower().endswith(".txt"):
if file_name.lower().endswith(extensao):
file_name = os.path.join(path,file_name)
documentos.append(file_name)
return documentos
Expand Down Expand Up @@ -467,16 +476,16 @@ def _print_progresso(_cache):

# existe o arquivo limpo - ignorar o cache se solicitado
if not self.ignorar_cache:
if os.path.isfile(f'{arquivo}.clr'):
texto = carregar_arquivo(arq=f'{arquivo}.clr', juntar_linhas=True, limpar=True)
if os.path.isfile(f'{arquivo}{self.cache_extensao}'):
texto = carregar_arquivo(arq=f'{arquivo}{self.cache_extensao}', juntar_linhas=True, limpar=True)
if self.ignorar_cache:
_print_progresso(True)
return texto.split(' ')
# carrega e faz a limpeza do arquivo
texto = carregar_arquivo(arq=f'{arquivo}', juntar_linhas=True, limpar=True)
tokens = self.tokenizer.tokenizar(texto)
# grava o cache - se ignorou o cache, o novo cache será criado
with open(f'{arquivo}.clr', 'w',encoding='ISO-8859-1') as writer:
with open(f'{arquivo}{self.cache_extensao}', 'w',encoding='ISO-8859-1') as writer:
writer.writelines(' '.join(tokens))
if self.ignorar_cache:
_print_progresso(False)
Expand Down Expand Up @@ -882,6 +891,8 @@ def criar_modelo(self):
teste_modelo = args.testar
treinar = args.treinar
reiniciar = str(args.reiniciar).lower() if args.reiniciar else ''
if reiniciar:
treinar = False

# sem parâmetros, faz apenas o teste
if teste_modelo or not (reiniciar or treinar):
Expand Down
38 changes: 29 additions & 9 deletions src/util_doc2vec_vocab_facil.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from gensim.models import TfidfModel
from gensim.corpora import Dictionary

from util_doc2vec_facil import Documentos, TokenizadorInteligente, carregar_arquivo
from util_doc2vec_facil import Documentos, TokenizadorInteligente, carregar_arquivo, map_thread
from collections import Counter
import os
import re
Expand Down Expand Up @@ -63,7 +63,9 @@ def progress_bar(current_value, total, msg=''):
print('{} {} '.format(text, msg), end="\n" if percentual == 100 else "")

# gera os arquivos e retorna uma lista dos tokens (token, estava no vocab, estava no vocab quebrado)

def criar_arquivo_curadoria_termos(pasta_textos, pasta_vocab = None):
cache_extensao = '.plan' # nome do cache do arquivo de curadoria
# definição dos arquivos de curadoria
arquivo_saida = os.path.join(pasta_vocab,'curadoria_planilha_vocab.xlsx')
####################################################################################################
Expand All @@ -74,20 +76,21 @@ def criar_arquivo_curadoria_termos(pasta_textos, pasta_vocab = None):
print('\t - carregando documentos para criar vocabulário')
# recria o cache tokenizando tudo sem fragmentos
docs = Documentos(pasta_vocab=pasta_vocab, pasta_textos=pasta_textos, retornar_tokens=True,
tokenizar_tudo=True, ignorar_cache=True, fragmentar=False)
tokenizar_tudo=True, ignorar_cache=True, fragmentar=False, cache_extensao = cache_extensao)
vocab_base = set(docs.tokenizer.vocab)
vocab_removido = set(docs.tokenizer.vocab_removido)
# recupera a lista de tokens que entraram depois de quebrados para incluir na análise
print(f'\t - processando documentos e compilando dicionário')
dicionario = Dictionary(docs)
####################################################################################################
print('\t - calculando pesos dos termos em cada documento')
docs = Documentos(pasta_vocab=pasta_vocab, pasta_textos=pasta_textos, retornar_tokens=True,
tokenizar_tudo=True, ignorar_cache=False, fragmentar=False)
tokenizar_tudo=True, ignorar_cache=False, fragmentar=False, cache_extensao = cache_extensao)
print('\t - calculando modelo TFIDF')
modelo_tfidf = TfidfModel((dicionario.doc2bow(d) for d in docs), normalize = True)
print('\t - calculando quantidades e maior peso de cada termo nos documentos')
docs = Documentos(pasta_vocab=pasta_vocab, pasta_textos=pasta_textos, retornar_tokens=True,
tokenizar_tudo=True, ignorar_cache=False, fragmentar=False)
tokenizar_tudo=True, ignorar_cache=False, fragmentar=False, cache_extensao = cache_extensao)
pesos_medios = dict({})
contadores = Counter()
contadores_docs = Counter()
Expand Down Expand Up @@ -144,6 +147,7 @@ def _estranho(termo):
ok_vocab = 'TERMO (composto)' if c in vocab_base else 'NÃO (composto)'
else:
ok_vocab = 'TERMO' if c in vocab_base else ''
ok_vocab = 'REMOVIDO' if c in vocab_removido else ok_vocab
estranho = 'N' if ok_vocab else _estranho(c)
quebrado = TOKENIZADOR.quebrar_token_simples(c)
quebrado = '' if quebrado == c else quebrado
Expand Down Expand Up @@ -178,6 +182,27 @@ def _estranho(termo):

print('Análise concluída: ', pasta_textos, ' para ',arquivo_saida)
print('=============================================================')
print('ARQUIVO DE CURADORIA CRIADO!!! ')
print( ' - arquivo: ', arquivo_saida)
print( ' - pasta analisada: ', pasta_textos)
_nome_arq = os.path.split(arquivo_saida)[1]
print(f' - você já pode abrir o arquivo {_nome_arq} no Excel')
print('...')
print(f'Removendo arquivos de cache da curadoria ')
lst_remover = docs.listar_documentos(cache_extensao)
print(f' - removendo {len(lst_remover)} arquivos ... ', end='')
apagar_arquivos(lst_remover)
print(' Finalizado o/')

def apagar_arquivos(lista_de_arquivos):
def _apagar(arquivo):
try:
os.remove(arquivo)
except:
# não tem motivo para poluir a tela com erro de exclusão
# ou o arquivo está aberto, protegido ou o antivírus impediu tantas exclusões
pass
map_thread(_apagar, lista_de_arquivos, n_threads=3)

def pesos_documento(modelo_tfidf, dicionario, texto):
tks = TOKENIZADOR.tokenizar(texto) if type(texto) is str else texto
Expand Down Expand Up @@ -255,10 +280,5 @@ def testar_tokenizador(texto='', pasta_vocab='./meu_modelo/doc2vecfacil/'):
print('# >> incluindo textos da pasta "{pasta}" para a curadoria')
criar_arquivo_curadoria_termos(pasta_textos = pasta,
pasta_vocab=PASTA_MODELO)
print('#---------------------------------------------------------#')
print('# Arquivos de curadoria criados #')
print('# - pasta analisada: ', pasta)
print('# Abra o arquivo curadoria_planilha_vocab.xlsx no Excel #')
print('###########################################################')


0 comments on commit ad76a92

Please sign in to comment.