T-ner ist ein Python-Tool für Sprachmodell-Finetuning auf der benannten Inde-Recognition (NER), das in Pytorch implementiert ist und über PIP erhältlich ist. Es verfügt über eine einfache Schnittstelle zu Fintune-Modellen und Tests auf Cross-Domain- und mehrsprachigen Datensätzen. T-ner integriert derzeit eine hohe Abdeckung öffentlich verfügbarer NER-Datensätze und ermöglicht eine einfache Integration benutzerdefinierter Datensätze. Alle mit T-ner beenden Modelle können in unserer Web-App zur Visualisierung bereitgestellt werden. Unser Papier, das T-Ner zeigt, wurde an EACL 2021 angenommen. Alle Modelle und Datensätze werden über die T-Ner-Harmging-Face-Gruppe gemeinsam genutzt.
NEU (September 2022): Wir haben einen neuen NER -Datensatz basierend auf Twitter tweetner7 veröffentlicht und das Papier wurde von der AACL 2022 -Hauptkonferenz akzeptiert! Wir veröffentlichen den Datensatz zusammen mit fein abgestimmten Modellen, und weitere Details finden Sie auf der Seite "Papier, Repository und Datensatz". Das Twitter -NER -Modell wurde ebenfalls in TweetnLP integriert, und hier ist eine Demo verfügbar.
Installieren Sie tner über PIP, um loszulegen!
pip install tner| Beschreibung | Link |
|---|---|
| Modellfinetuning & Evaluierung | |
| Modellvorhersage | |
| Mehrsprachiger NER -Workflow |
Ein NER -Datensatz enthält eine Abfolge von Token und Tags für jeden Split (normalerweise 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' : ...,
} Mit einem Wörterbuch, um ein Etikett wie unten auf seinen Index ( label2id ) zuzuordnen.
{ "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 }Eine Vielzahl von öffentlichen NER -Datensätzen finden Sie in unserer Huggingface -Gruppe, die wie unten verwendet werden kann (Informationen zum Datensatz finden Sie für vollständige Datensatzlisten).
from tner import get_dataset
data , label2id = get_dataset ( dataset = "tner/wnut2017" )Der Benutzer kann mehrere Datensätze angeben, um einen verketteten Datensatz zu erhalten.
data , label2id = get_dataset ( dataset = [ "tner/conll2003" , "tner/ontonotes5" ])In verketteten Datensätzen verwenden wir das Unified -Etikettssatz, um die Entitätsbezeichnung zu vereinheitlichen. Die Idee ist, alle verfügbaren NER -Datensätze in einem einheitlichen Format auf der Umarmung zu teilen. Lassen Sie uns also wissen, ob dort NER -Datensätze hinzugefügt werden sollen!
Um über die öffentlichen Datensätze hinauszugehen, können Benutzer ihre eigenen Datensätze verwenden, indem sie sie in das in Conll 2003 NER Shared Task Paper beschriebene IOB -Format formatieren, in dem alle Datendateien ein Wort pro Zeile mit leeren Zeilen enthalten, die Satzgrenzen darstellen. Am Ende jeder Zeile befindet sich ein Tag, in dem sich das aktuelle Wort in einer benannten Entität befindet oder nicht. Das Tag codiert auch die Art der genannten Entität. Hier ist ein Beispielsatz:
EU B-ORG
rejects O
German B-MISC
call O
to O
boycott O
British B-MISC
lamb O
. O
Wörter mit O markiert sind außerhalb der benannten Entitäten und das I-XXX-Tag wird für Wörter in einer benannten Entität vom Typ XXX verwendet. Immer wenn zwei Entitäten vom Typ XXX unmittelbar nebeneinander liegen, wird das erste Wort der zweiten Entität mit B-XXX markiert, um zu zeigen, dass es eine andere Entität startet. Bitte werfen Sie ein Aussehen für benutzerdefinierte Daten. Diese benutzerdefinierten Dateien können genauso geladen werden wie unten.
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"
})Wie im Umarmungsface -Datensatz kann man den Datensatz verkettet.
data , label2id = get_dataset ( local_dataset = [
{ "train" : "..." , "valid" : "..." , "test" : "..." },
{ "train" : "..." , "valid" : "..." , "test" : "..." }
]
) T-Ner hat derzeit mehr als 100 NER-Modelle für die Huggingface-Gruppe geteilt, wie in der obigen Tabelle gezeigt, in der nur die Hauptmodelle angegeben sind und model_card für vollständige Modelllisten angezeigt werden. Alle Modelle können wie unten mit tner verwendet werden.
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 ]}
]]
} batch_size model.predict separator input Optional kann der Benutzer die Eingaben im Voraus mit jedem Tokenizer (Spacy, NLTK usw.) tokenisieren, und die Vorhersage folgt der Tokenisierung.
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 ]}
]]
} Ein lokaler Modell-Checkpoint kann anstelle von Modell alias TransformersNER("path-to-checkpoint") . Das Skript zur erneuten Produzierung dieser veröffentlichten Modelle ist hier.
Das folgende Befehlszeilen-Tool ist für die Modellvorhersage verfügbar.
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 " Um Abhängigkeiten für die Ausführung der Web -App zu installieren, fügen Sie bei der Installation die Option hinzu.
pip install tner[app]Dann klonen Sie das Repository
git clone https://github.com/asahi417/tner
cd tnerund starten Sie den Server.
uvicorn app:app --reload --log-level debug --host 0.0.0.0 --port 8000 Öffnen Sie Ihren Browser http://0.0.0.0:8000, sobald er fertig ist. Sie können ein Modell angeben, um durch eine Umgebungsvariable NER_MODEL bereitzustellen, die standardmäßig als tner/roberta-large-wnut2017 eingestellt ist. NER_MODEL kann entweder Pfad zu Ihrem lokalen Modell -Checkpoint -Verzeichnis oder dem Modellnamen für Transformatoren -Modell -Hub sein.
Bestätigung Die App -Schnittstelle ist stark von diesem Repository inspiriert.
T-ner bietet eine einfache API, um Sprachmodell-Feinabstimmungen auf NER mit einer effizienten Parametersuchung wie oben beschrieben auszuführen. Es besteht aus 2 Stufen: (i) Feinabstimmung mit allen möglichen Konfigurationen für eine kleine Epoche und Berechnung der Bewertungsmetrik (Micro F1 als Standard) für das Validierungssatz für alle Modelle und (ii) Top K Modelle aufnehmen, um die Feinabstimmung bis zur L Epoche fortzusetzen. Das beste Modell in der zweiten Stufe wird die Feinabstimmung fortsetzen, bis die Validierungsmetrik verringert wird.
Diese Feinabstimmung mit zweistufiger Parameter-Suche kann in einigen Zeilen mit tner erreicht werden.
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 ()Die folgenden Parameter sind momentan einstellbar.
gradient_accumulation_steps : die Anzahl der Gradientenakkumulationcrf : Verwenden Sie CRF auf der Ausbettung der Ausgabelr : Lernrateweight_decay : Koeffizient für den Gewichtsverfallrandom_seed : zufälliger Samenlr_warmup_step_ratio : Lineares Aufwärmverhältnis der Lernrate, z. B. wenn es 0,3 ist, ist die Lernrate linear bis 30% des Gesamtschritts aufgewärmt (doch kein Zerfall)max_grad_norm : Norm für den GradientenausschnittWeitere Informationen zu jedem Argument finden Sie in der Quelle.
Das folgende Befehlszeilen-Tool ist zur Feinabstimmung verfügbar.
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 Die Bewertung von NER -Modellen erfolgt durch model.evaluate Bewerten Sie die Funktion, die den dataset oder local_dataset als Datensatz bewertet.
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' ) Ein Beispiel für die metric finden Sie hier.
Um ein besseres Verständnis der Genauigkeit außerhalb der Domäne zu verstehen, bieten wir die Pipeline der Entity Span Prediction an, die den Entitätstyp ignoriert und Metriken nur in der IOB-Entitätsposition (Binärsequenzmarkierung) berechnen.
metric = model . evaluate ( datasets = 'tner/wnut2017' , dataset_split = 'test' , span_detection_mode = True )Das folgende Befehlszeilen-Tool ist für die Modellvorhersage verfügbar.
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 " Wenn Sie diese Ressourcen verwenden, zitieren Sie bitte das folgende Papier:
@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.",
}