T-Ner es una herramienta de Python para el sintonización de modelos de lenguaje en el reconocimiento de entidad named (NER) implementada en Pytorch, disponible a través de PIP. Tiene una interfaz fácil para los modelos Finetune y prueba en conjuntos de datos multilingües y de dominio multilingüe. T-Ner actualmente integra una alta cobertura de conjuntos de datos NER disponibles públicamente y permite una fácil integración de conjuntos de datos personalizados. Todos los modelos Finetuned con T-Ner se pueden implementar en nuestra aplicación web para la visualización. Nuestro artículo que demuestra que T-Ner ha sido aceptado en EACL 2021. Todos los modelos y conjuntos de datos se comparten a través de T-Ger Huggingface Group.
¡Nuevo (septiembre de 2022): lanzamos un nuevo conjunto de datos NER basado en Twitter tweetner7 y el documento fue aceptado por la conferencia principal de AACL 2022! Lanzamos el conjunto de datos junto con modelos ajustados, y se pueden encontrar más detalles en la página de documentos, repositorio y conjunto de datos. El modelo NER de Twitter también se ha integrado en TweetNLP, y una demostración está disponible aquí.
¡Instale tner a través de PIP para comenzar!
pip install tner| Descripción | Enlace |
|---|---|
| Modelo de Finetuning & Evaluation | |
| Predicción del modelo | |
| Flujo de trabajo multilingüe ner |
Un conjunto de datos ner contiene una secuencia de tokens y etiquetas para cada división (generalmente train / validation / test ),
{
'train' : {
'tokens' : [
[ '@paulwalk' , 'It' , "'s" , 'the' , 'view' , 'from' , 'where' , 'I' , "'m" , 'living' , 'for' , 'two' , 'weeks' , '.' , 'Empire' , 'State' , 'Building' , '=' , 'ESB' , '.' , 'Pretty' , 'bad' , 'storm' , 'here' , 'last' , 'evening' , '.' ],
[ 'From' , 'Green' , 'Newsfeed' , ':' , 'AHFA' , 'extends' , 'deadline' , 'for' , 'Sage' , 'Award' , 'to' , 'Nov' , '.' , '5' , 'http://tinyurl.com/24agj38' ], ...
],
'tags' : [
[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 2 , 2 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],
[ 0 , 0 , 0 , 0 , 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ], ...
]
},
'validation' : ...,
'test' : ...,
} con un diccionario para asignar una etiqueta a su índice ( label2id ) como se muestra a continuación.
{ "O" : 0 , "B-ORG" : 1 , "B-MISC" : 2 , "B-PER" : 3 , "I-PER" : 4 , "B-LOC" : 5 , "I-ORG" : 6 , "I-MISC" : 7 , "I-LOC" : 8 }Una variedad de conjuntos de datos públicos de NER están disponibles en nuestro grupo Huggingface, que se puede utilizar como a continuación (consulte la tarjeta de conjunto de datos para obtener listas de conjuntos de datos completos).
from tner import get_dataset
data , label2id = get_dataset ( dataset = "tner/wnut2017" )El usuario puede especificar múltiples conjuntos de datos para obtener un conjunto de datos concatenado.
data , label2id = get_dataset ( dataset = [ "tner/conll2003" , "tner/ontonotes5" ])En los conjuntos de datos concatenados, utilizamos el conjunto de etiquetas unificadas para unificar la etiqueta de la entidad. La idea es compartir todos los conjuntos de datos NER disponibles en el Huggingface en un formato unificado, ¡así que háganos saber si desea que se agregue algún conjunto de datos NER allí!
Para ir más allá de los conjuntos de datos públicos, los usuarios pueden usar sus propios conjuntos de datos formatándolos en el formato IOB descrito en Conll 2003 Ner Compartido Task Paper, donde todos los archivos de datos contienen una palabra por línea con líneas vacías que representan límites de oraciones. Al final de cada línea hay una etiqueta que establece si la palabra actual está dentro de una entidad nombrada o no. La etiqueta también codifica el tipo de entidad nombrada. Aquí hay una oración de ejemplo:
EU B-ORG
rejects O
German B-MISC
call O
to O
boycott O
British B-MISC
lamb O
. O
Las palabras etiquetadas con o están fuera de las entidades nombradas y la etiqueta I-XXX se usa para palabras dentro de una entidad nombrada de tipo xxx. Cada vez que dos entidades de tipo XXX están inmediatamente una al lado de la otra, la primera palabra de la segunda entidad se etiquetará b-xxx para mostrar que inicia otra entidad. Por favor, eche un vistazo a los datos personalizados. Esos archivos personalizados se pueden cargar de la misma manera que el conjunto de datos Huggingface como se muestra a continuación.
from tner import get_dataset
data , label2id = get_dataset ( local_dataset = {
"train" : "examples/local_dataset_sample/train.txt" ,
"valid" : "examples/local_dataset_sample/train.txt" ,
"test" : "examples/local_dataset_sample/test.txt"
})Igual que el conjunto de datos Huggingface, se puede concatenar el conjunto de datos.
data , label2id = get_dataset ( local_dataset = [
{ "train" : "..." , "valid" : "..." , "test" : "..." },
{ "train" : "..." , "valid" : "..." , "test" : "..." }
]
) Actualmente, T-Ner ha compartido más de 100 modelos NER en el grupo Huggingface, como se muestra en la tabla anterior, que informa solo los principales modelos y consulte Model_Card para listas de modelos completas. Todos los modelos se pueden usar con tner como se muestra a continuación.
from tner import TransformersNER
model = TransformersNER ( "tner/roberta-large-wnut2017" ) # provide model alias on huggingface
output = model . predict ([ "Jacob Collier is a Grammy awarded English artist from London" ]) # give a list of sentences (or tokenized sentence)
print ( output )
{
'prediction' : [[ 'B-person' , 'I-person' , 'O' , 'O' , 'O' , 'O' , 'O' , 'O' , 'O' , 'B-location' ]],
'probability' : [[ 0.9967652559280396 , 0.9994561076164246 , 0.9986955523490906 , 0.9947081804275513 , 0.6129112243652344 , 0.9984312653541565 , 0.9868122935295105 , 0.9983410835266113 , 0.9995284080505371 , 0.9838910698890686 ]],
'input' : [[ 'Jacob' , 'Collier' , 'is' , 'a' , 'Grammy' , 'awarded' , 'English' , 'artist' , 'from' , 'London' ]],
'entity_prediction' : [[
{ 'type' : 'person' , 'entity' : [ 'Jacob' , 'Collier' ], 'position' : [ 0 , 1 ], 'probability' : [ 0.9967652559280396 , 0.9994561076164246 ]},
{ 'type' : 'location' , 'entity' : [ 'London' ], 'position' : [ 9 ], 'probability' : [ 0.9838910698890686 ]}
]]
} model.predict toma una lista de oraciones y tamaño por lotes batch_size opcionalmente, y toca la oración por medio espacio o el símbolo especificado por separator , que se devuelve como input en su objeto de salida. Opcionalmente, el usuario puede tokenizar las entradas de antemano con cualquier tokenizer (Spacy, NLTK, etc.) y la predicción seguirá la tokenización.
output = model . predict ([[ "Jacob Collier" , "is" , "a" , "Grammy awarded" , "English artist" , "from" , "London" ]])
print ( output )
{
'prediction' : [[ 'B-person' , 'O' , 'O' , 'O' , 'O' , 'O' , 'B-location' ]],
'probability' : [[ 0.9967652559280396 , 0.9986955523490906 , 0.9947081804275513 , 0.6129112243652344 , 0.9868122935295105 , 0.9995284080505371 , 0.9838910698890686 ]],
'input' : [[ 'Jacob Collier' , 'is' , 'a' , 'Grammy awarded' , 'English artist' , 'from' , 'London' ]],
'entity_prediction' : [[
{ 'type' : 'person' , 'entity' : [ 'Jacob Collier' ], 'position' : [ 0 ], 'probability' : [ 0.9967652559280396 ]},
{ 'type' : 'location' , 'entity' : [ 'London' ], 'position' : [ 6 ], 'probability' : [ 0.9838910698890686 ]}
]]
} Se puede especificar un punto de control de modelo local en lugar del modelo de alias TransformersNER("path-to-checkpoint") . Script para volver a producir esos modelos lanzados está aquí.
La siguiente herramienta de línea de comandos está disponible para la predicción del modelo.
tner-predict [-h] -m MODEL
command line tool to test finetuned NER model
optional arguments:
-h, --help show this help message and exit
-m MODEL, --model MODEL
model alias of huggingface or local checkpointtner-predict -m " tner/roberta-large-wnut2017 " Para instalar dependencias para ejecutar la aplicación web, agregue la opción en la instalación.
pip install tner[app]Entonces, clona el repositorio
git clone https://github.com/asahi417/tner
cd tnery iniciar el servidor.
uvicorn app:app --reload --log-level debug --host 0.0.0.0 --port 8000 Abra su navegador http://0.0.0.0:8000 una vez listo. Puede especificar el modelo para implementar mediante una variable de entorno NER_MODEL , que se establece como tner/roberta-large-wnut2017 como un valor predeterminado. NER_MODEL puede ser una ruta al directorio de punto de control de su modelo local o el nombre del modelo en Transformers Model Hub.
Reconocimiento La interfaz de la aplicación está fuertemente inspirada en este repositorio.
T-NER proporciona una API fácil para ejecutar el modelo de lenguaje ajustado en NER con una búsqueda de parámetros eficiente como se describió anteriormente. Consiste en 2 etapas: (i) ajuste fino con todas las configuraciones posibles para una época pequeña y una métrica de evaluación de cálculo (Micro F1 como predeterminada) en el conjunto de validación para todos los modelos, y (ii) recoger modelos de alta K para continuar ajustando hasta L Epoch. El mejor modelo en la segunda etapa continuará ajustando hasta que disminuya la métrica de validación.
Este ajuste fino con búsqueda de parámetros de dos etapas se puede lograr en algunas líneas con tner .
from tner import GridSearcher
searcher = GridSearcher (
checkpoint_dir = './ckpt_tner' ,
dataset = "tner/wnut2017" , # either of `dataset` (huggingface dataset) or `local_dataset` (custom dataset) should be given
model = "roberta-large" , # language model to fine-tune
epoch = 10 , # the total epoch (`L` in the figure)
epoch_partial = 5 , # the number of epoch at 1st stage (`M` in the figure)
n_max_config = 3 , # the number of models to pass to 2nd stage (`K` in the figure)
batch_size = 16 ,
gradient_accumulation_steps = [ 4 , 8 ],
crf = [ True , False ],
lr = [ 1e-4 , 1e-5 ],
weight_decay = [ 1e-7 ],
random_seed = [ 42 ],
lr_warmup_step_ratio = [ 0.1 ],
max_grad_norm = [ 10 ]
)
searcher . train ()Los siguientes parámetros son sintonizables en este momento.
gradient_accumulation_steps : el número de acumulación de gradientecrf : use CRF además de la incrustación de salidalr : tasa de aprendizajeweight_decay : coeficiente para la descomposición de pesorandom_seed : semilla aleatorialr_warmup_step_ratio : relación de calentamiento lineal de la tasa de aprendizaje, por ejemplo) si es 0.3, la tasa de aprendizaje se calentará linealmente hasta el 30% del paso total (sin descomposición después de todo)max_grad_norm : norma para el recorte de gradienteConsulte la fuente para obtener más información sobre cada argumento.
La siguiente herramienta de línea de comandos está disponible para ajustar.
tner-train-search [-h] -c CHECKPOINT_DIR [-d DATASET [DATASET ...]] [-l LOCAL_DATASET [LOCAL_DATASET ...]]
[--dataset-name DATASET_NAME [DATASET_NAME ...]] [-m MODEL] [-b BATCH_SIZE] [-e EPOCH] [--max-length MAX_LENGTH] [--use-auth-token]
[--dataset-split-train DATASET_SPLIT_TRAIN] [--dataset-split-valid DATASET_SPLIT_VALID] [--lr LR [LR ...]]
[--random-seed RANDOM_SEED [RANDOM_SEED ...]] [-g GRADIENT_ACCUMULATION_STEPS [GRADIENT_ACCUMULATION_STEPS ...]]
[--weight-decay WEIGHT_DECAY [WEIGHT_DECAY ...]] [--lr-warmup-step-ratio LR_WARMUP_STEP_RATIO [LR_WARMUP_STEP_RATIO ...]]
[--max-grad-norm MAX_GRAD_NORM [MAX_GRAD_NORM ...]] [--crf CRF [CRF ...]] [--optimizer-on-cpu] [--n-max-config N_MAX_CONFIG]
[--epoch-partial EPOCH_PARTIAL] [--max-length-eval MAX_LENGTH_EVAL]
Fine-tune transformers on NER dataset with Robust Parameter Search
optional arguments:
-h , --help show this help message and exit
-c CHECKPOINT_DIR, --checkpoint-dir CHECKPOINT_DIR
checkpoint directory
-d DATASET [DATASET ...], --dataset DATASET [DATASET ...]
dataset name (or a list of it) on huggingface tner organization eg. ' tner/conll2003 ' [ ' tner/conll2003 ' , ' tner/ontonotes5 ' ]] see
https://huggingface.co/datasets ? search = tner for full dataset list
-l LOCAL_DATASET [LOCAL_DATASET ...], --local-dataset LOCAL_DATASET [LOCAL_DATASET ...]
a dictionary (or a list) of paths to local BIO files eg.{ " train " : " examples/local_dataset_sample/train.txt " , " test " :
" examples/local_dataset_sample/test.txt " }
--dataset-name DATASET_NAME [DATASET_NAME ...]
[optional] data name of huggingface dataset (should be same length as the ` dataset ` )
-m MODEL, --model MODEL
model name of underlying language model (huggingface model)
-b BATCH_SIZE, --batch-size BATCH_SIZE
batch size
-e EPOCH, --epoch EPOCH
the number of epoch
--max-length MAX_LENGTH
max length of language model
--use-auth-token Huggingface transformers argument of ` use_auth_token `
--dataset-split-train DATASET_SPLIT_TRAIN
dataset split to be used for training ( ' train ' as default)
--dataset-split-valid DATASET_SPLIT_VALID
dataset split to be used for validation ( ' validation ' as default)
--lr LR [LR ...] learning rate
--random-seed RANDOM_SEED [RANDOM_SEED ...]
random seed
-g GRADIENT_ACCUMULATION_STEPS [GRADIENT_ACCUMULATION_STEPS ...], --gradient-accumulation-steps GRADIENT_ACCUMULATION_STEPS [GRADIENT_ACCUMULATION_STEPS ...]
the number of gradient accumulation
--weight-decay WEIGHT_DECAY [WEIGHT_DECAY ...]
coefficient of weight decay (set 0 for None)
--lr-warmup-step-ratio LR_WARMUP_STEP_RATIO [LR_WARMUP_STEP_RATIO ...]
linear warmup ratio of learning rate (no decay).eg) if it ' s 0.3, the learning rate will warmup linearly till 30% of the total step
(set 0 for None)
--max-grad-norm MAX_GRAD_NORM [MAX_GRAD_NORM ...]
norm for gradient clipping (set 0 for None)
--crf CRF [CRF ...] use CRF on top of output embedding (0 or 1)
--optimizer-on-cpu put optimizer on CPU to save memory of GPU
--n-max-config N_MAX_CONFIG
the number of configs to run 2nd phase search
--epoch-partial EPOCH_PARTIAL
the number of epoch for 1st phase search
--max-length-eval MAX_LENGTH_EVAL
max length of language model at evaluationtner-train-search -m " roberta-large " -c " ckpt " -d " tner/wnut2017 " -e 15 --epoch-partial 5 --n-max-config 3 -b 64 -g 1 2 --lr 1e-6 1e-5 --crf 0 1 --max-grad-norm 0 10 --weight-decay 0 1e-7 La evaluación de los modelos NER se realiza mediante local_dataset dataset model.evaluate .
from tner import TransformersNER
model = TransformersNER ( "tner/roberta-large-wnut2017" ) # provide model alias on huggingface
# huggingface dataset
metric = model . evaluate ( 'tner/wnut2017' , dataset_split = 'test' )
# local dataset
metric = model . evaluate ( local_dataset = { "test" : "examples/local_dataset_sample/test.txt" }, dataset_split = 'test' ) Se puede encontrar un ejemplo de la metric del objeto de salida aquí.
Para una mejor comprensión de la precisión fuera del dominio, proporcionamos la tubería de predicción de la entidad, que ignora el tipo de entidad y calcula las métricas solo en la posición de la entidad IOB (etiquetado de secuencia binaria).
metric = model . evaluate ( datasets = 'tner/wnut2017' , dataset_split = 'test' , span_detection_mode = True )La siguiente herramienta de línea de comandos está disponible para la predicción del modelo.
tner-evaluate [-h] -m MODEL -e EXPORT [-d DATASET [DATASET ...]] [-l LOCAL_DATASET [LOCAL_DATASET ...]]
[--dataset-name DATASET_NAME [DATASET_NAME ...]] [--dataset-split DATASET_SPLIT] [--span-detection-mode] [--return-ci] [-b BATCH_SIZE]
Evaluate NER model
optional arguments:
-h , --help show this help message and exit
-m MODEL, --model MODEL
model alias of huggingface or local checkpoint
-e EXPORT, --export EXPORT
file to export the result
-d DATASET [DATASET ...], --dataset DATASET [DATASET ...]
dataset name (or a list of it) on huggingface tner organization eg. ' tner/conll2003 ' [ ' tner/conll2003 ' , ' tner/ontonotes5 ' ]] see
https://huggingface.co/datasets ? search = tner for full dataset list
-l LOCAL_DATASET [LOCAL_DATASET ...], --local-dataset LOCAL_DATASET [LOCAL_DATASET ...]
a dictionary (or a list) of paths to local BIO files eg.{ " train " : " examples/local_dataset_sample/train.txt " , " test " :
" examples/local_dataset_sample/test.txt " }
--dataset-name DATASET_NAME [DATASET_NAME ...]
[optional] data name of huggingface dataset (should be same length as the ` dataset ` )
--dataset-split DATASET_SPLIT
dataset split to be used for test ( ' test ' as default)
--span-detection-mode
return F1 of entity span detection (ignoring entity type error and cast as binary sequence classification as below)- NER : [ " O " ,
" B-PER " , " I-PER " , " O " , " B-LOC " , " O " , " B-ORG " ]- Entity-span detection: [ " O " , " B-ENT " , " I-ENT " , " O " , " B-ENT " , " O " , " B-ENT " ]
--return-ci return confidence interval by bootstrap
-b BATCH_SIZE, --batch-size BATCH_SIZE
batch sizetner-evaluate -m " tner/roberta-large-wnut2017 " -e " metric.json " -d " tner/conll2003 " -b " 32 " Si usa alguno de estos recursos, cite el siguiente documento:
@inproceedings{ushio-camacho-collados-2021-ner,
title = "{T}-{NER}: An All-Round Python Library for Transformer-based Named Entity Recognition",
author = "Ushio, Asahi and
Camacho-Collados, Jose",
booktitle = "Proceedings of the 16th Conference of the European Chapter of the Association for Computational Linguistics: System Demonstrations",
month = apr,
year = "2021",
address = "Online",
publisher = "Association for Computational Linguistics",
url = "https://www.aclweb.org/anthology/2021.eacl-demos.7",
pages = "53--62",
abstract = "Language model (LM) pretraining has led to consistent improvements in many NLP downstream tasks, including named entity recognition (NER). In this paper, we present T-NER (Transformer-based Named Entity Recognition), a Python library for NER LM finetuning. In addition to its practical utility, T-NER facilitates the study and investigation of the cross-domain and cross-lingual generalization ability of LMs finetuned on NER. Our library also provides a web app where users can get model predictions interactively for arbitrary text, which facilitates qualitative model evaluation for non-expert programmers. We show the potential of the library by compiling nine public NER datasets into a unified format and evaluating the cross-domain and cross- lingual performance across the datasets. The results from our initial experiments show that in-domain performance is generally competitive across datasets. However, cross-domain generalization is challenging even with a large pretrained LM, which has nevertheless capacity to learn domain-specific features if fine- tuned on a combined dataset. To facilitate future research, we also release all our LM checkpoints via the Hugging Face model hub.",
}