Tareas de procesamiento del lenguaje natural basadas en Python (clasificación de texto, coincidencia de texto, comprensión semántica y anotación de secuencia)

Dirección de descarga de recursos : https://download.csdn.net/download/sheziqiong/88308584
Dirección de descarga de recursos : https://download.csdn.net/download/sheziqiong/88308584

1. Depende del medio ambiente

  • Pitón >= 3.6

  • antorcha >= 1,1

  • analizar argumentos

  • json

  • ventana

  • engordado

  • embalaje

  • re

2. Clasificación de textos

Este proyecto demuestra cómo Finetune puede utilizar modelos previamente entrenados representados por BERT para completar tareas de clasificación de texto. Tomamos el conjunto de datos públicos de clasificación de sentimientos chino ChnSentiCorp como ejemplo: ejecute el siguiente comando para realizar un entrenamiento distribuido con múltiples tarjetas en una sola máquina basado en DistributedDataParallel, realice un entrenamiento modelo en el conjunto de entrenamiento (train.tsv) y realice un entrenamiento modelo en el conjunto de verificación (dev.tsv) para evaluar:

CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 run_classifier.py --train_data_file ./data/ChnSentiCorp/train.tsv --dev_data_file ./data/ChnSentiCorp/dev.tsv --label_file ./data/ChnSentiCorp/labels.txt --save_best_model --epochs 3 --batch_size 32

Parámetros de configuración admitidos:

usage: run_classifier.py [-h] [--local_rank LOCAL_RANK]
                         [--pretrained_model_name_or_path PRETRAINED_MODEL_NAME_OR_PATH]
                         [--init_from_ckpt INIT_FROM_CKPT] --train_data_file
                         TRAIN_DATA_FILE [--dev_data_file DEV_DATA_FILE]
                         --label_file LABEL_FILE [--batch_size BATCH_SIZE]
                         [--scheduler {linear,cosine,cosine_with_restarts,polynomial,constant,constant_with_warmup}]
                         [--learning_rate LEARNING_RATE]
                         [--warmup_proportion WARMUP_PROPORTION] [--seed SEED]
                         [--save_steps SAVE_STEPS]
                         [--logging_steps LOGGING_STEPS]
                         [--weight_decay WEIGHT_DECAY] [--epochs EPOCHS]
                         [--max_seq_length MAX_SEQ_LENGTH]
                         [--saved_dir SAVED_DIR]
                         [--max_grad_norm MAX_GRAD_NORM] [--save_best_model]
                         [--is_text_pair]
  • local_rank: opcional, el número de nodo de capacitación distribuida, el valor predeterminado es -1.

  • pretrained_model_name_or_path: opcional, el nombre o la ruta del modelo previamente entrenado en huggingface, el valor predeterminado es bert-base-chinese.

  • train_data_file: Obligatorio, ruta del archivo de datos del conjunto de entrenamiento.

  • dev_data_file: opcional, ruta del archivo de datos del conjunto de verificación, el valor predeterminado es Ninguno.

  • label_file: obligatorio, ruta del archivo de etiqueta de categoría.

  • lote_size: Opcional, tamaño del lote, ajústelo de acuerdo con la situación de la memoria de video. Si no hay suficiente memoria de video, reduzca este parámetro de manera adecuada. El valor predeterminado es 32.

  • init_from_ckpt: opcional, ruta del parámetro del modelo que se cargará, entrenamiento del modelo de inicio en caliente. El valor predeterminado es Ninguno.

  • Programador: opcional, estrategia de cambio de tasa de aprendizaje del optimizador, el valor predeterminado es lineal.

  • learning_rate: opcional, la tasa de aprendizaje máxima del optimizador, el valor predeterminado es 5e-5.

  • Warmup_proportion: opcional, la proporción de la estrategia de calentamiento de la tasa de aprendizaje. Si es 0,1, la tasa de aprendizaje aumentará lentamente de 0 a learning_rate durante el primer paso de entrenamiento del 10% y luego disminuirá lentamente. El valor predeterminado es 0.

  • Weight_decay: opcional, un parámetro que controla la fuerza del término regular para evitar el sobreajuste. El valor predeterminado es 0.0.

  • semilla: opcional, semilla aleatoria, el valor predeterminado es 1000.

  • logging_steps: opcional, registra los pasos del intervalo de impresión, el valor predeterminado es 20.

  • save_steps: pasos de intervalo opcionales para guardar los parámetros del modelo, el valor predeterminado es 100.

  • épocas: opcional, rondas de entrenamiento, el valor predeterminado es 3.

  • max_seq_length: opcional, la longitud máxima de secuencia ingresada al modelo previamente entrenado, el máximo no puede exceder 512, el valor predeterminado es 128.

  • save_dir: opcional, la ruta de la carpeta para guardar el modelo de entrenamiento. De forma predeterminada, se guarda en la carpeta del punto de control del directorio actual.

  • max_grad_norm: opcional, parámetro max_norm para el recorte de gradiente durante el entrenamiento, el valor predeterminado es 1.0.

  • save_best_model: opcional, si se guarda el modelo en el indicador del mejor conjunto de validación, cuando se agrega al comando de entrenamiento

    –save_best_model, save_best_model es Verdadero; de lo contrario, es Falso.

  • is_text_pair: opcional, si se realiza la clasificación de pares de texto. Cuando se agrega --is_text_pair al comando de entrenamiento, los pares de texto se clasificarán; de lo contrario, se realizará la clasificación de texto normal.

El registro intermedio del entrenamiento del modelo es el siguiente:

2022-05-25 07:22:29.403 | INFO     | __main__:train:301 - global step: 20, epoch: 1, batch: 20, loss: 0.23227, accuracy: 0.87500, speed: 2.12 step/s
2022-05-25 07:22:39.131 | INFO     | __main__:train:301 - global step: 40, epoch: 1, batch: 40, loss: 0.30054, accuracy: 0.87500, speed: 2.06 step/s
2022-05-25 07:22:49.010 | INFO     | __main__:train:301 - global step: 60, epoch: 1, batch: 60, loss: 0.23514, accuracy: 0.93750, speed: 2.02 step/s
2022-05-25 07:22:58.909 | INFO     | __main__:train:301 - global step: 80, epoch: 1, batch: 80, loss: 0.12026, accuracy: 0.96875, speed: 2.02 step/s
2022-05-25 07:23:08.804 | INFO     | __main__:train:301 - global step: 100, epoch: 1, batch: 100, loss: 0.21955, accuracy: 0.90625, speed: 2.02 step/s
2022-05-25 07:23:13.534 | INFO     | __main__:train:307 - eval loss: 0.22564, accuracy: 0.91750
2022-05-25 07:23:25.222 | INFO     | __main__:train:301 - global step: 120, epoch: 1, batch: 120, loss: 0.32157, accuracy: 0.90625, speed: 2.03 step/s
2022-05-25 07:23:35.104 | INFO     | __main__:train:301 - global step: 140, epoch: 1, batch: 140, loss: 0.20107, accuracy: 0.87500, speed: 2.02 step/s
2022-05-25 07:23:44.978 | INFO     | __main__:train:301 - global step: 160, epoch: 2, batch: 10, loss: 0.08750, accuracy: 0.96875, speed: 2.03 step/s
2022-05-25 07:23:54.869 | INFO     | __main__:train:301 - global step: 180, epoch: 2, batch: 30, loss: 0.08308, accuracy: 1.00000, speed: 2.02 step/s
2022-05-25 07:24:04.754 | INFO     | __main__:train:301 - global step: 200, epoch: 2, batch: 50, loss: 0.10256, accuracy: 0.93750, speed: 2.02 step/s
2022-05-25 07:24:09.480 | INFO     | __main__:train:307 - eval loss: 0.22497, accuracy: 0.93083
2022-05-25 07:24:21.020 | INFO     | __main__:train:301 - global step: 220, epoch: 2, batch: 70, loss: 0.23989, accuracy: 0.93750, speed: 2.03 step/s
2022-05-25 07:24:30.919 | INFO     | __main__:train:301 - global step: 240, epoch: 2, batch: 90, loss: 0.00897, accuracy: 1.00000, speed: 2.02 step/s
2022-05-25 07:24:40.777 | INFO     | __main__:train:301 - global step: 260, epoch: 2, batch: 110, loss: 0.13605, accuracy: 0.93750, speed: 2.03 step/s
2022-05-25 07:24:50.640 | INFO     | __main__:train:301 - global step: 280, epoch: 2, batch: 130, loss: 0.14508, accuracy: 0.93750, speed: 2.03 step/s
2022-05-25 07:25:00.529 | INFO     | __main__:train:301 - global step: 300, epoch: 2, batch: 150, loss: 0.04770, accuracy: 0.96875, speed: 2.02 step/s
2022-05-25 07:25:05.256 | INFO     | __main__:train:307 - eval loss: 0.23039, accuracy: 0.93500
2022-05-25 07:25:16.818 | INFO     | __main__:train:301 - global step: 320, epoch: 3, batch: 20, loss: 0.04312, accuracy: 0.96875, speed: 2.04 step/s
2022-05-25 07:25:26.700 | INFO     | __main__:train:301 - global step: 340, epoch: 3, batch: 40, loss: 0.05103, accuracy: 0.96875, speed: 2.02 step/s
2022-05-25 07:25:36.588 | INFO     | __main__:train:301 - global step: 360, epoch: 3, batch: 60, loss: 0.12114, accuracy: 0.87500, speed: 2.02 step/s
2022-05-25 07:25:46.443 | INFO     | __main__:train:301 - global step: 380, epoch: 3, batch: 80, loss: 0.01080, accuracy: 1.00000, speed: 2.03 step/s
2022-05-25 07:25:56.228 | INFO     | __main__:train:301 - global step: 400, epoch: 3, batch: 100, loss: 0.14839, accuracy: 0.96875, speed: 2.04 step/s
2022-05-25 07:26:00.953 | INFO     | __main__:train:307 - eval loss: 0.22589, accuracy: 0.94083
2022-05-25 07:26:12.483 | INFO     | __main__:train:301 - global step: 420, epoch: 3, batch: 120, loss: 0.14986, accuracy: 0.96875, speed: 2.05 step/s
2022-05-25 07:26:22.289 | INFO     | __main__:train:301 - global step: 440, epoch: 3, batch: 140, loss: 0.00687, accuracy: 1.00000, speed: 2.04 step/s

Cuando se requiere la clasificación de pares de texto, simplemente establezca is_text_pair en Verdadero. Tomando como ejemplo el conjunto de datos de similitud semántica financiera de AFQMC Ant en CLUEbenchmark, puede ejecutar el siguiente comando para la capacitación:

CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 run_classifier.py --train_data_file ./data/AFQMC/train.txt --dev_data_file ./data/AFQMC/dev.txt --label_file ./data/AFQMC/labels.txt --is_text_pair --save_best_model --epochs 3 --batch_size 32

El entrenamiento se realiza en diferentes conjuntos de datos y los resultados en el conjunto de validación son los siguientes:

Tarea ChnSentiCorp AFQMC NOTICIAS
dev-acc 0.94083 0.74305 0.56990

TNEWS son los datos de clasificación de noticias de titulares de hoy establecidos en CLUEbenchmark.

Enlace del conjunto de datos de CLUEbenchmark: https://github.com/CLUEbenchmark/CLUE

3. Coincidencia de texto

Este proyecto muestra cómo completar la tarea de coincidencia de textos en chino según la estructura Sentence-BERT Finetune. Sentence BERT adopta una estructura de red siamesa. La consulta y el título se ingresan en dos codificadores bert que comparten parámetros respectivamente y se obtienen sus respectivas características de incorporación de tokens. Luego, se agrupa la incrustación del token (en el artículo se utiliza la operación de agrupación media) y las salidas se registran como u y v respectivamente. Finalmente, los tres vectores (u, v, |uv|) se concatenan y se ingresan en el clasificador lineal para su clasificación.

Cuando utilice datos NLI para el entrenamiento, debe agregar la opción --is_nli y --label_file LABEL_FILE. El comando de entrenamiento es el siguiente:

CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 run_sentencebert.py --train_data_file ./data/CMNLI/train.txt --dev_data_file ./data/CMNLI/dev.txt --label_file ./data/CMNLI/labels.txt --is_nli --save_best_model --epochs 3 --batch_size 32

El entrenamiento se realiza en diferentes conjuntos de datos y los resultados en el conjunto de validación son los siguientes:

Tarea LCQMC Chino-MNLI Chino-SNLI
dev-acc 0.86730 0.71105 0.80567

Enlaces chino-MNLI y chino-SNLI: https://github.com/zejunwang1/CSTS

4. Comprensión semántica

4.1 SimCSE

El modelo SimCSE es adecuado para escenarios de coincidencia y recuperación que carecen de datos supervisados ​​pero tienen una gran cantidad de datos no supervisados. Este proyecto implementa el método no supervisado SimCSE y entrena el modelo de representación de vectores de oraciones en datos de oraciones de Wikipedia en chino.

Para obtener más información sobre SimCSE, consulte el documento: https://arxiv.org/abs/2104.08821

Extraiga datos de 150.000 oraciones de la Wikipedia china y guárdelos en el archivo wiki_sents.txt en la carpeta data/zhwiki/. Ejecute el siguiente comando, basado en el modelo de lenguaje previamente entrenado de código abierto de Tencent uer uer/chinese_roberta_L-6_H-128 (https ://huggingface.co/uer/chinese_roberta_L-6_H-128), entrenado utilizando el método no supervisado SimCSE y evaluado en el conjunto de validación Chinese-STS-B (https://github.com/zejunwang1/CSTS):

CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 run_simcse.py --pretrained_model_name_or_path uer/chinese_roberta_L-6_H-128 --train_data_file ./data/zhwiki/wiki_sents.txt --dev_data_file ./data/STS-B/sts-b-dev.txt --learning_rate 5e-5 --epochs 1 --dropout 0.1 --margin 0.2 --scale 20 --batch_size 32

El modelo de preentrenamiento de vectores de oraciones SimCSE simcse_tiny_chinese_wiki con el número de capas ocultas num_hidden_layers=6 y la dimensión hide_size=128 se puede obtener desde el siguiente enlace:

nombre del modelo enlace
WangZeJun/simcse-tiny-chinese-wiki https://huggingface.co/WangZeJun/simcse-tiny-chinese-wiki

4.2 Negativos en lote

Extraiga todos los pares de texto semánticamente similares del conjunto de datos LCQMC del Instituto de Tecnología de Harbin, el conjunto de datos PAWS-X de Google y el conjunto de datos de paráfrasis de texto PKU-Paraphrase-Bank de la Universidad de Pekín (https://github.com/zejunwang1/CSTS) como un conjunto de entrenamiento y guárdelo en: data/batchneg/paraphrase_lcqmc_semantic_pairs.txt

Ejecute el siguiente comando, basado en el modelo de lenguaje previamente entrenado de código abierto de Tencent uer uer/chinese_roberta_L-6_H-128, utilizando la estrategia de negativos en lotes, entrene el modelo de representación de vectores de oraciones en cuatro tarjetas GPU 0, 1, 2 y 3. y Evaluación en el conjunto de validación Chinese-STS-B:

CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 run_batchneg.py --pretrained_model_name_or_path uer/chinese_roberta_L-6_H-128 --train_data_file ./data/batchneg/paraphrase_lcqmc_semantic_pairs.txt --dev_data_file ./data/STS-B/sts-b-dev.txt --learning_rate 5e-5 --epochs 3 --margin 0.2 --scale 20 --batch_size 64 --mean_loss

Utilice el modelo obtenido anteriormente como comienzo en caliente y continúe entrenando negativos en lotes en el conjunto de datos de oraciones data/batchneg/domain_finetune.txt:

CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 run_batchneg.py --pretrained_model_name_or_path uer/chinese_roberta_L-6_H-128 --init_from_ckpt ./checkpoint/pytorch_model.bin --train_data_file ./data/batchneg/domain_finetune.txt --dev_data_file ./data/STS-B/sts-b-dev.txt --learning_rate 1e-5 --epochs 1 --margin 0.2 --scale 20 --batch_size 32 --mean_loss

Puede obtener el modelo de preentrenamiento de vector de oración con el número de capas ocultas num_hidden_layers=6 y la dimensión hide_size=128:

nombre del modelo enlace
WangZeJun/batchneg-tiny-chino https://huggingface.co/WangZeJun/batchneg-tiny-chinese

5. Anotación de secuencia

Este proyecto demuestra cómo Finetune puede utilizar modelos previamente entrenados representados por BERT para completar tareas de etiquetado de secuencias. Tomando como ejemplo la tarea china de reconocimiento de entidades con nombre, se realizaron capacitaciones y pruebas en cuatro conjuntos de datos: msra, ontonote4, resume y weibo. El conjunto de entrenamiento y el conjunto de validación de cada conjunto de datos se preprocesan en el siguiente formato y cada línea es una cadena json compuesta de texto y etiquetas.

{
    
    "text": ["我", "们", "的", "藏", "品", "中", "有", "几", "十", "册", "为", "北", "京", "图", "书", "馆", "等", "国", "家", "级", "藏", "馆", "所", "未", "藏", "。"], "label": ["O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "B-NS", "I-NS", "I-NS", "I-NS", "I-NS", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O"]}
{
    
    "text": ["由", "于", "这", "一", "时", "期", "战", "争", "频", "繁", ",", "条", "件", "艰", "苦", ",", "又", "遭", "国", "民", "党", "毁", "禁", ",", "传", "世", "量", "稀", "少", ",", "购", "藏", "不", "易", "。"], "label": ["O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "B-NT", "I-NT", "I-NT", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O"]}

Ejecute el siguiente comando para utilizar la estructura BERT+Linear en el conjunto de datos msra para el entrenamiento distribuido con varias tarjetas en una sola máquina y evalúelo en el conjunto de validación:

La mayoría de los parámetros son los mismos que los introducidos en la clasificación de texto. Los siguientes son parámetros únicos:

  • etiqueta: opcional, método de etiquetado de entidad, admite BIOS y métodos de etiquetado de biografía, el valor predeterminado es BIOS.

  • use_crf: Opcional, si se usa la estructura CRF. Cuando se agrega --use_crf al comando de entrenamiento, se usa la estructura del modelo BERT+CRF; de lo contrario, se usa la estructura del modelo BERT+Lineal.

  • crf_learning_rate: opcional, la tasa de aprendizaje inicial de los parámetros del modelo CRF, el valor predeterminado es 5e-5.

Cuando entrene utilizando la arquitectura BERT+CRF, ejecute el siguiente comando:

CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 run_ner.py --train_data_file ./data/ner/msra/train.json --dev_data_file ./data/ner/msra/dev.json --label_file ./data/ner/msra/labels.txt --tag bios --learning_rate 5e-5 --save_best_model --batch_size 32 --use_crf --crf_learning_rate 1e-4

Índice F1 del modelo en diferentes conjuntos de validación:

Modelo Msra Reanudar Ontonota Weibo
BERT+Lineal 0.94179 0.95643 0.80206 0.70588
BERT+CRF 0.94265 0.95818 0.80257 0.72215

Entre ellos, Msra, Resume y Ontonote se entrenaron durante 3 épocas, y Weibo se entrenó durante 5 épocas. Los logging_steps y save_steps de Resume, Ontonote y Weibo se establecieron en 10. Se estableció la tasa de aprendizaje inicial de los parámetros BERT de todos los conjuntos de datos. a 5e-5, y los parámetros CRF. La tasa de aprendizaje inicial se establece en 1e-4 y el tamaño de lote se establece en 32.

Dirección de descarga de recursos : https://download.csdn.net/download/sheziqiong/88308584
Dirección de descarga de recursos : https://download.csdn.net/download/sheziqiong/88308584

Supongo que te gusta

Origin blog.csdn.net/newlw/article/details/132729673
Recomendado
Clasificación