T-NER est un outil Python pour le modèle de langue Fintuning sur la reconnaissance de l'entalité nommée (NER) implémentée dans Pytorch, disponible via PIP. Il a une interface facile pour les modèles Finetune et tester sur des ensembles de données inter-domaines et multilingues. T-NE intègre actuellement une couverture élevée des ensembles de données NER accessibles au public et permet une intégration facile des ensembles de données personnalisés. Tous les modèles finetunés avec T-NER peuvent être déployés sur notre application Web pour la visualisation. Notre article démontrant le T-NE a été accepté pour EACL 2021. Tous les modèles et ensembles de données sont partagés via le groupe T-Ner HuggingFace.
Nouveau (septembre 2022): Nous avons publié un nouvel ensemble de données NER basé sur Twitter tweetner7 et le journal a été accepté par la conférence principale de l'AACL 2022! Nous publions l'ensemble de données avec des modèles affinés, et plus de détails peuvent être trouvés sur la page papier, référentiel et ensemble de données. Le modèle Twitter NER a également été intégré à TweetNLP, et une démo est disponible ici.
Installez tner via PIP pour commencer!
pip install tner| Description | Lien |
|---|---|
| Modèle Finetuning et évaluation | |
| Prédiction du modèle | |
| Flux de travail NER multilingue |
Un ensemble de données NER contient une séquence de jetons et de balises pour chaque division (généralement 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' : ...,
} avec un dictionnaire pour cartographier une étiquette à son index ( label2id ) comme ci-dessous.
{ "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 }Une variété d'ensembles de données Public NER sont disponibles sur notre groupe HuggingFace, qui peut être utilisé comme ci-dessous (voir la carte de jeu de données pour les listes de données complètes).
from tner import get_dataset
data , label2id = get_dataset ( dataset = "tner/wnut2017" )L'utilisateur peut spécifier plusieurs ensembles de données pour obtenir un ensemble de données concaténé.
data , label2id = get_dataset ( dataset = [ "tner/conll2003" , "tner/ontonotes5" ])Dans les ensembles de données concaténés, nous utilisons l'ensemble d'étiquettes unifiées pour unifier l'étiquette d'entité. L'idée est de partager tous les ensembles de données NER disponibles sur le Huggingface dans un format unifié, alors faites-nous savoir si vous voulez que des ensembles de données NER soient ajoutés là-bas!
Pour aller au-delà des ensembles de données publics, les utilisateurs peuvent utiliser leurs propres ensembles de données en les formant dans le format IOB décrit dans le papier de tâche partagé CONLL 2003 NER, où tous les fichiers de données contiennent un mot par ligne avec des lignes vides représentant des limites de phrase. À la fin de chaque ligne, il y a une balise qui indique si le mot actuel est à l'intérieur d'une entité nommée ou non. La balise code également le type d'entité nommée. Voici un exemple de phrase:
EU B-ORG
rejects O
German B-MISC
call O
to O
boycott O
British B-MISC
lamb O
. O
Les mots marqués avec O sont en dehors des entités nommées et la balise I-XXX est utilisée pour les mots à l'intérieur d'une entité nommée de type xxx. Chaque fois que deux entités de type XXX sont immédiatement à côté les unes des autres, le premier mot de la deuxième entité sera étiqueté B-xxx afin de montrer qu'il démarre une autre entité. Veuillez jeter un œil à des exemples de données personnalisées. Ces fichiers personnalisés peuvent être chargés d'une même manière que l'ensemble de données HuggingFace comme ci-dessous.
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"
})Identique à l'ensemble de données HuggingFace, on peut concaténer l'ensemble de données.
data , label2id = get_dataset ( local_dataset = [
{ "train" : "..." , "valid" : "..." , "test" : "..." },
{ "train" : "..." , "valid" : "..." , "test" : "..." }
]
) T-NER a actuellement partagé plus de 100 modèles NER sur HuggingFace Group, comme le montre le tableau ci-dessus, qui rapporte uniquement les principaux modèles et voir Model_card pour les listes de modèles complètes. Tous les modèles peuvent être utilisés avec tner comme ci-dessous.
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 ]}
]]
} Le model.predict prend une liste de phrases et de taille de lot batch_size éventuellement, et tokenise la phrase par un demi-espace ou le symbole spécifié par separator , qui est renvoyé en input dans son objet de sortie. Facultativement, l'utilisateur peut tokeniser les entrées au préalable avec n'importe quel tokenzer (Spacy, NLTK, etc.) et la prédiction suivra la tokenisation.
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 ]}
]]
} Un point de contrôle de modèle local peut être spécifié au lieu de l'alias TransformersNER("path-to-checkpoint") . Le script pour reproduire ces modèles publiés est là.
L'outil de ligne de commande suivant est disponible pour la prédiction du modèle.
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 " Pour installer des dépendances pour exécuter l'application Web, ajoutez l'option à l'installation.
pip install tner[app]Ensuite, clonez le référentiel
git clone https://github.com/asahi417/tner
cd tneret lancer le serveur.
uvicorn app:app --reload --log-level debug --host 0.0.0.0 --port 8000 Ouvrez votre navigateur http://0.0.0.0:8000 une fois prêt. Vous pouvez spécifier un modèle à déployer par une variable d'environnement NER_MODEL , qui est défini comme tner/roberta-large-wnut2017 par défaut. NER_MODEL peut être soit le chemin d'accès à votre répertoire de point de contrôle de modèle local, soit un nom de modèle sur Transformers Model Hub.
Remerciement L'interface de l'application est fortement inspirée par ce référentiel.
T-NE fournit une API facile à exécuter le modèle de langue ajusté sur NER avec une recherche de paramètres efficace comme décrit ci-dessus. Il se compose de 2 étapes: (i) ajusté avec toutes les configurations possibles pour une petite époque et une métrique d'évaluation de calcul (micro F1 par défaut) sur l'ensemble de validation pour tous les modèles, et (ii) ramasser les modèles de haut K pour continuer à affiner L époque. Le meilleur modèle de la deuxième étape continuera de régler une affinement jusqu'à ce que la métrique de validation diminuait.
Cette affectation fin avec une recherche de paramètres à deux étapes peut être réalisée en quelques lignes avec 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 ()Les paramètres suivants sont réglables pour le moment.
gradient_accumulation_steps : le nombre d'accumulation de gradientcrf : Utilisez CRF au-dessus de l'intégration de sortielr : taux d'apprentissageweight_decay : coefficient de désintégration de poidsrandom_seed : graine aléatoirelr_warmup_step_ratio : Ratio d'échauffement linéaire du taux d'apprentissage, par exemple) Si c'est 0,3, le taux d'apprentissage se réchauffera linéairement jusqu'à 30% de l'étape totale (pas de décroissance après tout)max_grad_norm : norme pour l'écrêtage du gradientVoir Source pour plus d'informations sur chaque argument.
L'outil de ligne de commande suivante est disponible pour le réglage fin.
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 L'évaluation des modèles NER est effectuée par la fonction model.evaluate qui prend dataset ou local_dataset comme ensemble de données pour évaluer.
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' ) Un exemple de la metric de l'objet de sortie peut être trouvé ici.
Pour une meilleure compréhension de la précision hors du domaine, nous fournissons le pipeline de prédiction de Span Entity, qui ignore le type d'entité et calculons les mesures uniquement sur la position de l'entité IOB (étiquetage de séquences binaires).
metric = model . evaluate ( datasets = 'tner/wnut2017' , dataset_split = 'test' , span_detection_mode = True )L'outil de ligne de commande suivant est disponible pour la prédiction du modèle.
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 vous utilisez l'une de ces ressources, veuillez citer l'article suivant:
@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.",
}