Обробка природної мови (NLP) у Python з кодом (Частина 5. Розпізнавання іменованих сутностей)

Oleh Dubetcky
4 min readJul 4, 2021
Photo by davisuko on Unsplash

Це п’ята в серії статей, що описує обробку природної мови (Natural Language Processing — NLP).

Розпізнавання іменованих сутностей — це підзадача видобування інформації, яка спрямована на пошук і класифікацію іменованих сутностей, згаданих в неструктурованому тексті, по заздалегідь певних категорій, таким як імена людей, організації, місця розташування, медичні коди, вираження часу, кількості, грошові значення, відсотки та інше.

Для цього ви можете використовувати готову попередньо навчену модель NER за допомогою бібліотеки з відкритим вихідним кодом, таку як Spacy або Stanford CoreNLP.

Тепер, якщо ви гадаєте, що попередньо навчені моделі NER не дають результату відповідно до ваших очікувань, які ви шукаєте (приклад: тварина, об’єкт), недоступні в попередньо навченої моделі NER, тоді ви можете навчити свою власну кастомну модель.

Для навчання кастомної моделі NER у вас має бути величезна кількість анотованих даних. Для цього ви повинні використовувати який-небудь інструмент анотації, наприклад:

WebAnno є прийнятним для мене, тому що постачається як файл jar, що означає, що вам не потрібно його встановлювати. Може використовуватися для складного проекту — кілька користувачів можуть одночасно працювати в одному проекті. Та найголовніше — простота використання.

Завантажте webanno по посиланню нижче:
WebAnno 3.6.7
Щоб запустити це веб-додаток, в консолі використовуйте наступну команду:

java -jar webanno-standalone-3.6.7.jar

WebAnno — це веб-додаток, в браузері відкрийте нову вкладку http://localhost:8012/login.html

Створіть новий проект, на сторінці налаштувань проектів, у вкладці “Projects” натисніть “Create”. Напишіть яку-небудь назву проекту. (Приклад: «Test_Annotation») та оберіть “Project type” як annotation.

Після визначення деталей проекту з’являться кілька вкладок, таких як Користувачі, Документи, Шари, Набори тегів та ін. Звідти виберіть вкладку Документи і зробіть наступне: у списку виберіть формат “Plain text”, завантажте текстовий файл текстового документа, для якого ми будемо готувати навчальні дані та натисніть “Import”. Зразок тексту, який я використовував у вхідному текстовому файлі для підготовки даних навчання, наведено нижче:

Командувач Сил спеціальних операцій США у Європі Девід Тейбор відвідав 73-й морський центр спеціального призначення імені кошового отамана Антіна Головатого.Про візит американського армійця повідомила пресслужба військової частини в понеділок, 3 травня.Зазначається, що мета візиту — побачити та оцінити рівень військового співробітництва, підготовки та взаємодії між морськими підрозділами спеціальних операцій України та Сполучених Штатів Америки.Разом із командувачем ССО ЗСУ генерал-майором Григорієм Галаганом вони оглянули навчально-тренувальну базу центру, обговорили нові можливості для навчання операторів та покращення взаємодії у сфері виконання завдань підрозділами.“Навчання, які ми проводимо, мають важливе значення для підтримки взаємодії з нашими союзниками, партнерами та друзями. Цей навчальний центр надає нам можливість тренуватися разом і вчитися один у одного в стратегічно важливому регіоні”, – цитує Тейбора пресслужба 73-го морського центру.

Отже, тепер давайте подивимось, як створити нову сутність. Для цього виконайте наступні кроки:
1. Перейдіть на вкладку “Tagsets”.
2. Виберіть Named Entity зі списку наборів тегів.
3. Для створення нового тегу, наприклад “SOF”, натисніть «Create» в розділі «Tags».

Таким же чином ви можете створити свою кастомну сутність.

Тепер в меню проекту виберіть Анотація. З’явиться нове спливаюче вікно, виберіть документ, який ви хочете анотувати звідти.

Як тільки ви закінчите з анотацією, натисніть «Export», виберіть «WebAnno TSV v3.2» у спливаючому вікні та експорту його.

Тепер давайте почнемо кодування для створення остаточних форматованих користувальницьких навчальних даних уформаті Spacy для навчання користувальницької моделі розпізнавання іменованих сутностей (NER) з використанням Spacy.

# Підготовка тренувальних даних в форматі Spacy 
TRAIN_DATA = []
ent_list = []
from web_anno_tsv import open_web_anno_tsv
tsv = '/content/vidvidav-ochakivskykh-kotykiv.tsv'with open_web_anno_tsv(tsv) as f:
for i, sentence in enumerate(f):
#print(f"Sentence {i}:", sentence.text)
ent_list_sen = []
for j, annotation in enumerate(sentence.annotations):
ent_list_sen.append((annotation.start,annotation.stop,annotation.label))
ent_list.append(ent_list_sen)
ent_dic = {}
ent_dic['entities'] = ent_list[-1]
# Підготуйте підсумкові дані навчання
TRAIN_DATA.append([sentence.text,ent_dic])

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

model = None
model_dir=Path("model_ner")
n_iter=100
if model is not None:
nlp = spacy.load(model)
print("Loaded model '%s'" % model)
else:
nlp = spacy.blank('uk')
print("Created blank 'uk' model")
#Потім завантажте порожню модель для процесу, що виконує дію NER, і налаштуйте конвеєр тільки з NER за допомогою функції create_pipe.if 'ner' not in nlp.pipe_names:
ner = nlp.create_pipe('ner')
nlp.add_pipe(ner, last=True)
else:
ner = nlp.get_pipe('ner')
for _, annotations in TRAIN_DATA:
for ent in annotations.get('entities'):
ner.add_label(ent[2])
other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner']
with nlp.disable_pipes(*other_pipes): # only train NER
optimizer = nlp.begin_training()
for itn in range(n_iter):
random.shuffle(TRAIN_DATA)
losses = {}
for text, annotations in tqdm(TRAIN_DATA):
nlp.update(
[text],
[annotations],
drop=0.5,
sgd=optimizer,
losses=losses)
print(losses)

Щоб протестувати навчену модель,

Нарешті, збережіть модель на свій шлях, який зберігається в змінної model_dir.

if model_dir is not None:
model_dir = Path(model_dir)
if not model_dir.exists():
model_dir.mkdir()
nlp.to_disk(model_dir)
print("Saved model to", model_dir)
model = spacy.load(model_dir)

Повний приклад у Colab

Oleh Dubetcky|Linkedin

--

--

Oleh Dubetcky

I am an management consultant with a unique focus on delivering comprehensive solutions in both human resources (HR) and information technology (IT).