Пошук розпізнавання іменованих об’єктів (NER) за допомогою Transformers від Huggingface #nlp natural language processing #опм обробка природної мови

Вітаю, з цією статтею я розпочну цикл статей відносно до такої дисципліни як “обробка природної мови”.

Прикладом прикладного використання обробки природної мови може бути Google translate, й найбільш сучасний метод до обробки природної мови, сьогодні є Transformers від Huggingface.

Transformer(На базі увага – це все, що вам потрібно папір), метод заснований виключно на механізмах уваги, повністю обходячись без повторень(recurrence) чи звивин(convolutions).

Зразу вкажу що розробка моделей з нуля, є дуже трудомістка справа, й звичайно для практичних використань, набагато розумніше взяти вже готову модель з репозиторію, й зробити тонку настройку вже саме на наше завдання.

Й так, почнемо, почнемо з того, що нам потрібно імпортувати 2 важні бібліотеки, transformers й datasets. Назва першої самоочевидна, друга бібліотека потрібна щоб працювати з наборами даних

!pip3 install -q transformers datasets seqeval #&> /dev/null
import transformers,datasets

По-перше також візьмемо модель та  токенізатор. Розповім про них ниже,

tokenizer = transformers.AutoTokenizer.from_pretrained("KoichiYasuoka/bert-base-slavic-cyrillic-upos") 
model = transformers.BertForTokenClassification.from_pretrained("KoichiYasuoka/bert-base-slavic-cyrillic-upos")

.. але це тільки вже видана модель bert-base-slavic-cyrillic-upos яка розпізнає українські, сербські, болгарські так російські назви, й побачимо, чи ми можемо якось покращити як модель працює.

По перше подивимося, що сама базова модель покаже про речення з іменами: “Тімo живе в місті Турку й навчається в університеті м.Турку

pipe = transformers.pipeline("ner",model=model, tokenizer=tokenizer)#,device=0)
res=pipe( "Тімo живе в місті Турку й навчається в університеті м.Турку")
for i in res:
  print(i['word'],i['entity'])

А ось результат що я отримав:

ті B-NOUN
##мo I-NOUN
жив B-VERB
##е I-VERB
в ADP
міс B-NOUN
##ті I-NOUN
турк B-NOUN
##у I-NOUN
и CCONJ
нав B-VERB
##ча I-VERB
##ється I-VERB
в ADP
ун B-NOUN
##ів I-NOUN
##ерс I-NOUN
##ите I-NOUN
##ті I-NOUN
м NOUN
. PUNCT
турк B-PROPN
##у I-PROPN

Це не є зовсім коректно, тому що Турку один раз NOUN, другий раз PROPN, й Тімо – звичайний NOUN, повинне бути PERS(Тімо) GEO(Турку) ORG(університет м.Турку).

Використаємо wikiann україномовний набір даних, у якому є позначки ORG, PER та LOC.

dataset=datasets.load_dataset('wikiann','uk')

label_names = ['O', 'B-PER' , 'I-PER' , 'B-ORG', 'I-ORG', 'B-LOC' , 'I-LOC'] 
print (label_names)

 

З цього спробуємо натренувати нашу модель на цей датасет(набір даних).
Два слова, що модель споживає й що вона виробляє.
Модель має ‘input_ids’ й ‘attention_mask’ як вхідна послідовністі й labels як вихід.