T-NEN เป็นเครื่องมือ Python สำหรับรูปแบบภาษา FINETUNING ในการจดจำความรู้ความเข้าใจชื่อ (NER) ที่ใช้ใน Pytorch สามารถใช้งานได้ผ่าน PIP มันมีอินเทอร์เฟซที่ง่ายสำหรับรุ่น finetune และทดสอบเกี่ยวกับชุดข้อมูลข้ามโดเมนและหลายภาษา ปัจจุบัน T-Ner รวมความครอบคลุมสูงของชุดข้อมูล NER ที่เปิดเผยต่อสาธารณะและช่วยให้สามารถรวมชุดข้อมูลที่กำหนดเองได้อย่างง่ายดาย ทุกรุ่น finetuned ด้วย t-ner สามารถปรับใช้บนเว็บแอพของเราเพื่อการสร้างภาพข้อมูล กระดาษของเราที่แสดงให้เห็นว่า T-NEN ได้รับการยอมรับจาก EACL 2021 ทุกรุ่นและชุดข้อมูลทั้งหมดจะถูกแชร์ผ่านกลุ่ม T-Ner HuggingFace
ใหม่ (กันยายน 2565): เราเปิดตัวชุดข้อมูลใหม่ของ NER ตาม Twitter tweetner7 และกระดาษได้รับการยอมรับจากการประชุมหลัก AACL 2022! เราปล่อยชุดข้อมูลพร้อมกับรุ่นที่ปรับแต่งและรายละเอียดเพิ่มเติมสามารถพบได้ที่หน้ากระดาษที่เก็บและชุดข้อมูล โมเดล Twitter ner ได้รับการรวมเข้ากับ TweetNLP และมีการสาธิตที่นี่
ติดตั้ง tner ผ่าน PIP เพื่อเริ่มต้น!
pip install tner| คำอธิบาย | การเชื่อมโยง |
|---|---|
| โมเดล finetuning & การประเมินผล | |
| การทำนายแบบจำลอง | |
| เวิร์กโฟลว์ ner หลายภาษา |
ชุดข้อมูล NER มีลำดับของโทเค็นและแท็กสำหรับแต่ละแยก (โดยปกติ 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' : ...,
} ด้วยพจนานุกรมเพื่อแมปฉลากกับดัชนี ( label2id ) ดังต่อไปนี้
{ "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 }ชุดข้อมูล NER สาธารณะที่หลากหลายมีอยู่ในกลุ่ม HuggingFace ของเราซึ่งสามารถใช้งานได้ด้านล่าง (ดูการ์ดชุดข้อมูลสำหรับรายการชุดข้อมูลเต็มรูปแบบ)
from tner import get_dataset
data , label2id = get_dataset ( dataset = "tner/wnut2017" )ผู้ใช้สามารถระบุชุดข้อมูลหลายชุดเพื่อรับชุดข้อมูลที่ต่อกัน
data , label2id = get_dataset ( dataset = [ "tner/conll2003" , "tner/ontonotes5" ])ในชุดข้อมูลที่ต่อกันเราใช้ชุดเลเบล Unified เพื่อรวมชื่อเอนทิตี แนวคิดคือการแบ่งปันชุดข้อมูล NER ที่มีอยู่ทั้งหมดใน HuggingFace ในรูปแบบ Unified ดังนั้นโปรดแจ้งให้เราทราบหากคุณต้องการเพิ่มชุดข้อมูล NER ใด ๆ ที่นั่น!
หากต้องการไปไกลกว่าชุดข้อมูลสาธารณะผู้ใช้สามารถใช้ชุดข้อมูลของตนเองได้โดยการจัดรูปแบบลงในรูปแบบ IOB ที่อธิบายไว้ในกระดาษงานที่ใช้ร่วมกันของ Conll 2003 NER ซึ่งไฟล์ข้อมูลทั้งหมดมีหนึ่งคำต่อบรรทัดที่มีบรรทัดว่างที่แสดงถึงขอบเขตประโยค ในตอนท้ายของแต่ละบรรทัดมีแท็กซึ่งระบุว่าคำปัจจุบันอยู่ในเอนทิตีที่มีชื่อหรือไม่ แท็กยังเข้ารหัสประเภทของเอนทิตีที่มีชื่อ นี่คือตัวอย่างประโยค:
EU B-ORG
rejects O
German B-MISC
call O
to O
boycott O
British B-MISC
lamb O
. O
คำที่ติดแท็กด้วย O อยู่นอกเอนทิตีที่มีชื่อและแท็ก I-XXX ใช้สำหรับคำภายในเอนทิตีที่มีชื่อของประเภท XXX เมื่อใดก็ตามที่สองเอนทิตีประเภท XXX จะอยู่ติดกันทันทีคำแรกของเอนทิตีที่สองจะถูกแท็ก B-XXX เพื่อแสดงว่ามันเริ่มต้นเอนทิตีอื่น โปรดดูตัวอย่างข้อมูลที่กำหนดเอง ไฟล์ที่กำหนดเองเหล่านั้นสามารถโหลดได้ในลักษณะเดียวกับชุดข้อมูล HuggingFace ดังด้านล่าง
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"
})เช่นเดียวกับชุดข้อมูล HuggingFace หนึ่งสามารถเชื่อมต่อชุดข้อมูล
data , label2id = get_dataset ( local_dataset = [
{ "train" : "..." , "valid" : "..." , "test" : "..." },
{ "train" : "..." , "valid" : "..." , "test" : "..." }
]
) ปัจจุบัน T-Ner ได้แชร์โมเดล NER มากกว่า 100 รุ่นในกลุ่ม HuggingFace ดังที่แสดงในตารางด้านบนซึ่งรายงานโมเดลที่สำคัญเท่านั้นและดู Model_Card สำหรับรายการรุ่นเต็ม ทุกรุ่นสามารถใช้กับ tner ดังต่อไปนี้
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 จะใช้รายการประโยคและขนาดแบทช์ batch_size ทางเลือกและเพิ่มประโยคโดยครึ่งพื้นที่หรือสัญลักษณ์ที่ระบุโดย separator ซึ่งจะถูกส่งคืนเป็น input ในวัตถุเอาต์พุต ทางเลือกผู้ใช้สามารถโทเค็นอินพุตล่วงหน้าด้วย tokenizer ใด ๆ (Spacy, NLTK, ฯลฯ ) และการทำนายจะเป็นไปตาม tokenization
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 ]}
]]
} สามารถระบุจุดตรวจสอบโมเดลท้องถิ่นแทนโมเดลนามแฝง TransformersNER("path-to-checkpoint") สคริปต์เพื่อผลิตโมเดลที่ปล่อยออกมาอีกครั้งอยู่ที่นี่
เครื่องมือบรรทัดคำสั่งต่อไปนี้พร้อมใช้งานสำหรับการทำนายแบบจำลอง
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 " ในการติดตั้งการพึ่งพาเพื่อเรียกใช้เว็บแอปให้เพิ่มตัวเลือกเมื่อติดตั้ง
pip install tner[app]จากนั้นโคลนที่เก็บ
git clone https://github.com/asahi417/tner
cd tnerและเรียกใช้เซิร์ฟเวอร์
uvicorn app:app --reload --log-level debug --host 0.0.0.0 --port 8000 เปิดเบราว์เซอร์ของคุณ http://0.0.0.0:8000 เมื่อพร้อม คุณสามารถระบุโมเดลเพื่อปรับใช้โดยตัวแปรสภาพแวดล้อม NER_MODEL ซึ่งตั้งค่าเป็น tner/roberta-large-wnut2017 เป็นค่าเริ่มต้น NER_MODEL สามารถเป็นเส้นทางไปยังไดเรกทอรีจุดตรวจสอบโมเดลท้องถิ่นของคุณหรือชื่อรุ่นบนฮับโมเดล Transformers
รับทราบ อินเทอร์เฟซแอพได้รับแรงบันดาลใจอย่างมากจากที่เก็บนี้
T-ner ให้ API ง่าย ๆ ในการเรียกใช้การปรับแต่งแบบจำลองภาษาบน NER ด้วยการค้นหาพารามิเตอร์ที่มีประสิทธิภาพตามที่อธิบายไว้ข้างต้น มันประกอบด้วย 2 ขั้นตอน: (i) การปรับแต่งอย่างละเอียดพร้อมการกำหนดค่าที่เป็นไปได้ทุกครั้งสำหรับยุคเล็ก ๆ และการประเมินการประเมินการประเมิน (Micro F1 เป็นค่าเริ่มต้น) ในชุดการตรวจสอบความถูกต้องสำหรับทุกรุ่นและ ( L ) เลือกรุ่นบน K รุ่นที่ดีที่สุดในขั้นตอนที่สองจะยังคงปรับแต่งได้อย่างละเอียดจนกว่าตัวชี้วัดการตรวจสอบจะลดลง
การปรับแต่งอย่างละเอียดพร้อมการค้นหาพารามิเตอร์สองขั้นตอนสามารถทำได้ในไม่กี่บรรทัดด้วย 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 ()พารามิเตอร์ต่อไปนี้สามารถปรับได้ในขณะนี้
gradient_accumulation_steps ระดับcrf : ใช้ CRF ที่ด้านบนของการฝังเอาต์พุตlr : อัตราการเรียนรู้weight_decay : ค่าสัมประสิทธิ์การสลายตัวของน้ำหนักrandom_seed : เมล็ดสุ่มlr_warmup_step_ratio : อัตราส่วนการอุ่นเครื่องเชิงเส้นของอัตราการเรียนรู้เช่น) ถ้าเป็น 0.3 อัตราการเรียนรู้จะวอร์มอัพอย่างเป็นเส้นตรงจนถึง 30% ของขั้นตอนทั้งหมด (ไม่มีการสลายตัวหลังจากทั้งหมด)max_grad_norm : บรรทัดฐานสำหรับการตัดไล่ระดับสีดูแหล่งข้อมูลเพิ่มเติมเกี่ยวกับแต่ละอาร์กิวเมนต์
เครื่องมือบรรทัดคำสั่งต่อไปนี้พร้อมใช้งานสำหรับการปรับแต่ง
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 การประเมินผลของแบบจำลอง NER นั้นทำโดย model.evaluate ฟังก์ชั่นที่ใช้ dataset หรือ local_dataset เป็นชุดข้อมูลเพื่อประเมิน
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' ) ตัวอย่างของ metric วัตถุเอาต์พุตสามารถพบได้ที่นี่
เพื่อความเข้าใจที่ดีขึ้นเกี่ยวกับความแม่นยำนอกโดเมนเราได้จัดทำท่อส่งการคาดการณ์ของเอนทิตีซึ่งไม่สนใจประเภทเอนทิตีและการคำนวณการวัดเฉพาะในตำแหน่งเอนทิตี IOB (การติดฉลากลำดับไบนารี)
metric = model . evaluate ( datasets = 'tner/wnut2017' , dataset_split = 'test' , span_detection_mode = True )เครื่องมือบรรทัดคำสั่งต่อไปนี้พร้อมใช้งานสำหรับการทำนายแบบจำลอง
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 " หากคุณใช้ทรัพยากรเหล่านี้โปรดอ้างอิงเอกสารต่อไปนี้:
@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.",
}