Распознавание именованных сущностей (NER) — иногда называемое сегментацией, извлечением или идентификацией сущностей — представляет собой задачу идентификации и категоризации ключевой информации (сущностей) в тексте. Это подпроцесс извлечения информации, известный как процесс автоматического извлечения именованных объектов посредством поиска объектов в заданном тексте (распознавание) и присвоения их типа (классификация).

Пример:

Из приведенного выше примера предложения мы можем понять, что оно распознает и классифицирует сущности. Оно классифицирует Индию как LOC, г-на Нарендру Моди как PER G20как ОРГАНИЗАЦИЯ

Местоположение –местоположение

PER — человек

ORG — Организация

Основные шаги в NER:

Сегментация предложений:

Необработанный текст пройдет стадию сегментации предложения. Это процесс разделения строки письменного языка на составные предложения. Например, предложения должны быть разделены, когда идентифицируются знаки препинания или точки. Цель сегментации предложений состоит в том, чтобы наложить ограничения на предложения.

Токенизация:

Токенизацию можно определить как процесс разбиения строки или текста на список токенов. Токенами могут быть целые числа, а также знаки препинания
.

Пример: "Всем привет. Добро пожаловать в мир".
Токены для данного предложения будут такими: ['Привет', 'всем', 'Добро пожаловать', 'в', ' мир']

Тегирование частей речи (POS):

Тегирование части речи (POS) — это процесс сопоставления слова в тексте с соответствующей частью речевого тега в соответствии с его контекстом и определением. Он описывает характерную структуру лексических терминов в предложении или тексте, что означает, что теги POS могут использоваться для выдвижения предположений о семантике.

Пример:

Обнаружение объектов:

Наконец, этап обнаружения сущностей. Это процесс выделения ключевых элементов из текста, а затем их классификация по предопределенным категориям. Это решающий процесс NER, поскольку он завершает цель NER. На изображении ниже показан пример результата обнаружения именованных сущностей в предложении.

Пример:

БЕРТ:

BERT — это архитектура на основе трансформатора.

Трансформеры:

Google представила архитектуру преобразования в статье «Внимание — это все вам нужно». Transformer использует механизм самосознания, который подходит для >понимание языка. Потребность во внимании можно понять на простом примере. Скажите: "Я ездил в Хорсли Хиллз этим летом, и он был довольно хорошо развит, учитывая, что я был там в последний раз". Последнее слово >"там" относится к холмам Хорсли. Но чтобы понять это, необходимо вспомнить первые части. Чтобы Для этого механизм внимания на каждом этапе входящей последовательности решает, какие другие части последовательности важны. Проще говоря: «Вам нужен контекст!». Конвертер имеет архитектуру кодер-декодер. Они состоят из модулей, которые включают в себя уровни пересылки и уровня внимания. Изображение ниже взято из исследования.

Как правило, языковые модели считывают входную последовательность в одном направлении: либо слева направо, либо справа налево. Этот тип одностороннего обучения хорошо работает, когда цель состоит в том, чтобы предсказать/сгенерировать следующее слово. Однако BERT использует двунаправленное обучение для более глубокого понимания языкового контекста. Иногда его называют «неориентированным». Поэтому он рассматривает как предыдущий, так и следующий символ одновременно. BERT применяет трансформатор. двунаправленное обучение языковому моделированию, изучение текстовых представлений. Обратите внимание, что BERT — это просто кодировщик. Он не имеет декодера. Кодер отвечает за чтение и обработку текста ввода. Декодер отвечает за создание прогноза для задачи.

Обучение BERT?

Теперь давайте рассмотрим главный вопрос: как BERT обеспечивает двустороннее обучение?

Он использует два метода: MLM (маскированный LM) и NSP (предсказание следующего предложения).

MLM (моделирование маскированного языка):

В сериях мы случайным образом маскируем некоторые слова, заменяя их на [MASK]. В журнале они покрыли 15% стримов. Он обучен предсказывать эти замаскированные слова, используя контекст из. strong> остальные слова.

Пример:

"Я люблю кататься на велосипеде весной" -› я люблю кататься на велосипеде в сезон [MASK].

Проблема здесь заключается в том, что предварительно обученные модели имеют 15 % замаскированных идентификаторов, но когда мы настраиваем предварительно обученные модели и передаем , мы не передаем замаскированные идентификаторы. Чтобы решить эту проблему , 15 % символов выбрано для маскирования: 80 % — заменено на символ [MASK], 10 % – символов заменяются на случайным символом, а остальные остаются как есть.

Следующее подсказка предложения (NSP):

Чтобы понять взаимосвязь между двумя предложениями, BERT использует обучение NSP. Модель получает пары предложений в качестве входных и обучается предсказывать, является ли второе предложение следующим предложением от первого или нет. Во время обучения мы вносим 50–50 вкладов в обоих случаях. Предполагается, что случайное предложение контекстуально отделено от первого предложения.

Набор данных проекта:

Чтобы построить модель, которая выполняет эту задачу, нам сначала нужен набор данных. Для тамильского языка мы используем набор данных WikiANN, который легко доступен через модуль HuggingFace. Он содержит несколько языков, где слова помечены идентификаторами, такими как место (LOC), организация (ORG) и человек (PER). Вот ссылка на карту данных для получения дополнительной информации.

Модель здания:

Установка зависимостей:

!pip install datasets
!pip install tokenizers
!pip install transformers

Загрузить данные:

from datasets import load_dataset
dataset = load_dataset("wikiann", "ta")
label_names = dataset["train"].features["ner_tags"].feature.namesabel_names = dataset["train"].features["ner_tags"].feature.names

Предварительная обработка данных:

Токенизация набора данных и настройка меток:

  • Метод Encode возвращает необходимые ключи (input_ids, token_type_ids, warning_mask), требуемые BERT.
  • С помощью карты можно добавлять новые ключи к существующим разбиениям набора данных hf, ​​что устраняет необходимость создания нового набора данных.
  • Настройка меток необходима, так как токен, например, «Стивхарви», будет разделен на «Стив» и «##харви», но метка для него по-прежнему будет «B-PER», чтобы выровнять ее, «Стив» получит метку «B-PER». и ##harvey получает ярлык «I-PER»
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-multilingual-cased")
def tokenize_adjust_labels(all_samples_per_split):
    tokenized_samples = tokenizer.batch_encode_plus(all_samples_per_split["tokens"], is_split_into_words=True)
    total_adjusted_labels = []
    print(len(tokenized_samples["input_ids"]))
    for k in range(0, len(tokenized_samples["input_ids"])):
        prev_wid = -1
        word_ids_list = tokenized_samples.word_ids(batch_index=k)
        existing_label_ids = all_samples_per_split["ner_tags"][k]
        i = -1
        adjusted_label_ids = []
        for wid in word_ids_list:
            if(wid is None):
                adjusted_label_ids.append(-100)
            elif(wid!=prev_wid):
                i = i + 1
                adjusted_label_ids.append(existing_label_ids[i])
                prev_wid = wid
            else:
                label_name = label_names[existing_label_ids[i]]
                adjusted_label_ids.append(existing_label_ids[i])
        total_adjusted_labels.append(adjusted_label_ids)
    tokenized_samples["labels"] = total_adjusted_labels
    return tokenized_samples
tokenized_dataset = dataset.map(tokenize_adjust_labels, batched=True)

Добавить сэмплы для разделения:

  • Каждый список токенов для каждого образца будет разделен
  • Образец x и образец y могут иметь разную длину, поэтому необходимо дополнение
  • Это будет использоваться Trainer API, это эквивалент collate_fn от pytorch.
from transformers import DataCollatorForTokenClassification
data_collator = DataCollatorForTokenClassification(tokenizer)

Интеграция WANDB:

Weights и Bias — это высокоэффективная платформа, помогающая упростить обучение моделей отслеживания, управление версиями наборов данных, оптимизацию гиперпараметров и визуализация. Легче отслеживать все параметры каждого эксперимента, как меняются потери в течение при каждом запуске и т. д., что ускоряет отладку.

!pip install wandb
!pip install seqeval
import wandb
wandb.login()
#  You can find your API key in your browser here: https://wandb.ai/authorize
# please enter the below api key

Загрузка, подготовка модели к обучению:

from transformers import AutoModelForTokenClassification, TrainingArguments, Trainer
import numpy as np
from datasets import load_metric
metric = load_metric("seqeval")
def compute_metrics(p):
    predictions, labels = p
    predictions = np.argmax(predictions, axis=2)

    # Remove ignored index (special tokens)
    true_predictions = [
        [label_names[p] for (p, l) in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels)
    ]
    true_labels = [
        [label_names[l] for (p, l) in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels)
    ]

    results = metric.compute(predictions=true_predictions, references=true_labels)
    flattened_results = {
        "overall_precision": results["overall_precision"],
        "overall_recall": results["overall_recall"],
        "overall_f1": results["overall_f1"],
        "overall_accuracy": results["overall_accuracy"],
    }
    for k in results.keys():
        if(k not in flattened_results.keys()):
            flattened_results[k+"_f1"]=results[k]["f1"]

    return flattened_results
model = AutoModelForTokenClassification.from_pretrained("bert-base-multilingual-cased", num_labels=len(label_names))
training_args = TrainingArguments(
    output_dir="./fine_tune_bert_output",
    evaluation_strategy="steps",
    learning_rate=2e-5,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=16,
    num_train_epochs=7,
    weight_decay=0.01,
    logging_steps = 1000,
    report_to="wandb",
    run_name = "ep_10_tokenized_11",
    save_strategy='no'
)
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_dataset["train"],
    eval_dataset=tokenized_dataset["validation"],
    data_collator=data_collator,
    tokenizer=tokenizer,
    compute_metrics=compute_metrics
)

trainer.train()
wandb.finish()

Производительность при тестировании:

predictions, labels, _ = trainer.predict(tokenized_dataset["test"])
predictions = np.argmax(predictions, axis=2)
#Here we will see that the labels list will have lots of -100 in them however the corresponding label of the 
#tokenized_dataset doesnt have it, the reason is during DataCollator padding step, all padding tokens are added
#and assigned labels of -100 to get "ignored" in future computation of evaluation

# Remove ignored index (special tokens)
true_predictions = [
    [label_names[p] for (p, l) in zip(prediction, label) if l != -100]
    for prediction, label in zip(predictions, labels)
]
true_labels = [
    [label_names[l] for (p, l) in zip(prediction, label) if l != -100]
    for prediction, label in zip(predictions, labels)
]

results = metric.compute(predictions=true_predictions, references=true_labels)
results
print(true_labels)

Сохранение модели:

model.save_pretrained("NER_TAM")
saved_model = AutoModelForTokenClassification.from_pretrained("NER_TAM")
saved_model

Тестирование предложения на тамильском языке с сохраненной моделью:

import torch
random_sentence_from_internet = [ "இந்தியாவின் வெளியுறவுத்துறை அமைச்சர் திரு.ஜெய் சங்கர், ரஷ்யா-உக்ரைன் மோதலில் இந்தியாவின் நிலைப்பாட்டை தெளிவாக எடுத்துரைத்தார்." ]  
input = tokenizer(random_sentence_from_internet, is_split_into_words=True, return_tensors='pt')
print(input)
output = saved_model(**input)
predictions = torch.nn.functional.softmax(output.logits, dim=-1)
predictions = predictions.detach().numpy()
predictions = np.argmax(predictions, axis=2)
print(predictions)
pred_names = [label_names[p] for p in predictions[0]]
for index, id in enumerate(input["input_ids"][0]):
  print("\nID: ", id, "Decoded ID: ", tokenizer.decode(id), "\tPred: ", pred_names[index])

Ссылка для посещения моей модели NER-Tamil:

https://huggingface.co/Ambareeshkumar/BERT-Тамильский

Вывод тамильского NER:

Шаги для загрузки модели в Hugging Face:

Шаг 1.Инициализируйте git в папке модели → git init

Шаг 2: git config — глобальный user.email «youremail»

Шаг 3: git config — глобальное user.name «ваше имя»

Шаг 4.установите git lfs

Шаг 5. Перейдите в каталог моделей → cd «Model_folder»

Шаг 6: git add .

Шаг 7: git commit -m «загрузка файла»

Шаг 8: git push

Шаг 9: Finetuned_model.push_to_hub("моя-крутая-модель")