O código-fonte usado para classificação de texto usando apenas nomes de etiquetas: uma abordagem de auto-treinamento de modelo de idioma , publicada no EMNLP 2020.
Pelo menos uma GPU é necessária para executar o código.
Antes de executar, você precisa primeiro instalar os pacotes necessários digitando os seguintes comandos:
$ pip3 install -r requirements.txt
Além disso, você precisa baixar as palavras de parada na biblioteca NLTK:
import nltk
nltk.download('stopwords')
O Python 3.6 ou superior é fortemente recomendado; O uso de versões Python mais antigas pode levar a problemas de incompatibilidade de pacotes.
Fornecemos quatro scripts get_data.sh para baixar os conjuntos de dados usados no papel em datasets e quatro scripts de bash de treinamento agnews.sh , dbpedia.sh , imdb.sh e amazon.sh por executar o modelo nos quatro conjuntos de dados.
NOTA: Nosso modelo não usa rótulos de treinamento; Fornecemos os rótulos da verdade do conjunto de treinamento/teste apenas para integridade e avaliação.
Os scripts da Bash de treinamento assumem que você tem duas GPUs de 10 GB. Se você tiver um número diferente de GPUs ou GPUs de diferentes tamanhos de memória, consulte a próxima seção de como alterar os seguintes argumentos da linha de comando adequadamente (mantendo outros argumentos inalterados): train_batch_size , accum_steps , eval_batch_size e gpus .
Os significados dos argumentos da linha de comando serão exibidos após a digitação
python src/train.py -h
Os argumentos a seguir afetam diretamente o desempenho do modelo e precisam ser definidos com cuidado:
train_batch_size , accum_steps , gpus : Esses três argumentos devem ser definidos juntos. Você precisa garantir que o tamanho eficaz do lote de treinamento , calculado como train_batch_size * accum_steps * gpus , esteja em torno de 128 . Por exemplo, se você tiver 4 GPUs, poderá definir train_batch_size = 32, accum_steps = 1, gpus = 4 ; Se você possui 1 GPU, pode definir train_batch_size = 32, accum_steps = 4, gpus = 1 . Se suas GPUs tiverem tamanhos de memória diferentes, talvez seja necessário alterar train_batch_size enquanto ajusta accum_steps e gpus ao mesmo tempo para manter o tamanho eficaz do lote de treinamento em torno de 128 .eval_batch_size : Este argumento afeta apenas a velocidade do algoritmo; Use o tamanho do lote de avaliação grande, pois suas GPUs podem conter.max_len : Este argumento controla o comprimento máximo dos documentos alimentados no modelo (os documentos mais longos serão truncados). Idealmente, max_len deve ser definido para o comprimento do documento mais longo ( max_len não pode ser maior que 512 sob a arquitetura Bert), mas o uso de max_len maior também consome mais memória da GPU, resultando em menor tamanho em lote e tempo de treinamento mais longo. Portanto, você pode negociar a precisão do modelo para treinamento mais rápido, reduzindo max_len .mcp_epochs , self_train_epochs : eles controlam quantas épocas para treinar o modelo na tarefa de previsão de categoria mascarada e tarefa de auto-treinamento, respectivamente. Configurando mcp_epochs = 3, self_train_epochs = 1 será um bom ponto de partida para a maioria dos conjuntos de dados, mas você poderá aumentá -los se o seu conjunto de dados for pequeno (menos de 100,000 documentos).Outros argumentos podem ser mantidos como seus valores padrão.
Para executar o código em um novo conjunto de dados, você precisa
your_dataset nos datasets .train.txt de texto.txt (um documento por linha) sob your_dataset para treinar o modelo de classificação (não são necessários rótulos de documentos).label_names.txt em your_dataset (cada linha contém o nome da etiqueta de uma categoria; se várias palavras forem usadas como o nome da etiqueta de uma categoria, coloque -as na mesma linha e separe -as com caracteres de espaço em branco).test.txt (um documento por linha) com os rótulos da verdade no solo test_labels.txt (cada linha contém um número inteiro que denota o índice de categoria do documento correspondente, o índice começa a partir de 0 e a ordem deve ser consistente com a ordem categoria em label_names.txt ). Se o corpus de teste for fornecido, o código gravará os resultados da classificação para out.txt sob your_dataset assim que o treinamento estiver concluído. Se os rótulos da verdade do solo do corpus de teste forem fornecidos, a precisão do teste será exibida durante o auto-treinamento, o que é útil para ajuste hiperparâmetro e modelar a escolha de cereja usando um pequeno conjunto de testes.final_model.pt sob your_dataset .NOTA: O código cache os dados intermediários e os pontos de verificação do modelo como arquivos .pt no seu diretório de dados para treinamento contínuo. Se você alterar seu corpus de treinamento ou nomes de etiqueta e executar novamente o código, precisará primeiro excluir todos os arquivos .PT para impedir que o código carregue resultados antigos.
Você sempre pode consultar os dados de exemplo ao preparar seus próprios conjuntos de dados.
Cite o artigo a seguir, se você achar útil o código para sua pesquisa.
@inproceedings{meng2020text,
title={Text Classification Using Label Names Only: A Language Model Self-Training Approach},
author={Meng, Yu and Zhang, Yunyi and Huang, Jiaxin and Xiong, Chenyan and Ji, Heng and Zhang, Chao and Han, Jiawei},
booktitle={Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing},
year={2020},
}