Расширенное руководство по обработке естественного языка

Руководство по обработке естественного языка

Введение

Добро пожаловать в трансформационный мир обработки естественного языка (Natural Language Processing, NLP). Здесь элегантность человеческого языка сочетается с точностью машинного интеллекта. Невидимая сила NLP питает множество цифровых взаимодействий, от которых мы зависим. Различные приложения используют этот руководство по обработке естественного языка, такие как чат-боты, отвечающие на ваши вопросы, поисковые системы, настраивающие результаты на основе семантики, и голосовые помощники, устанавливающие напоминания для вас.

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

Понимание контекстных вложений: Слова не являются простыми отдельными единицами; их значение меняется в зависимости от контекста. Мы рассмотрим эволюцию вложений, от статических, таких как Word2Vec, до интерактивных, требующих контекста.

Трансформеры и искусство резюмирования текста: Резюмирование – это сложная задача, которая выходит за рамки простого усечения текста. Узнайте о архитектуре Трансформера и о том, как модели, такие как T5, меняют критерии успешного резюмирования.

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

Мы будем использовать набор данных Kaggle ‘Airline_Reviews’ для наших полезных исследований. Этот набор данных содержит реальные текстовые данные.

Цели обучения

  • Распознавать переход от систем, основанных на правилах, к архитектурам глубокого обучения, с особым акцентом на ключевые моменты.
  • Узнать о переходе от статических представлений слов, таких как Word2Vec, к динамическим контекстным вложениям, подчеркивая важность контекста для понимания языка.
  • Изучить внутреннее устройство архитектуры Трансформера и то, как T5 и другие модели революционизируют резюмирование текста.
  • Открыть для себя, как глубокое обучение, в особенности модели на основе Трансформера, могут предоставлять конкретные представления о текстовых настроениях.

Эта статья была опубликована в рамках блогонауки о Data Science.

Глубокое погружение в NLP

Обработка естественного языка (Natural Language Processing, NLP) – это отрасль искусственного интеллекта, которая фокусируется на обучении машин понимать, интерпретировать и отвечать на естественный язык человека. Эта технология соединяет людей и компьютеры, позволяя более естественное взаимодействие. NLP используется в широком спектре приложений, от простых задач, таких как проверка орфографии и поиск по ключевым словам, до более сложных операций, таких как машинный перевод, анализ настроений и функциональность чат-ботов. Это технология, которая позволяет голосовым виртуальным ассистентам, сервисам мгновенного перевода и даже алгоритмам рекомендации контента работать. Как междисциплинарная область, обработка естественного языка (NLP) объединяет знания лингвистики, компьютерных наук и машинного обучения для создания алгоритмов, которые могут понимать текстовые данные, что делает ее основой современных приложений искусственного интеллекта.

Эволюция техник NLP

NLP существенно эволюционировал за последние годы, переходя от систем, основанных на правилах, к статистическим моделям, а затем к глубокому обучению. Путь к пониманию особенностей языка можно наблюдать в изменении от традиционных моделей Bag-of-Words (BoW) к Word2Vec, а затем к контекстным вложениям. При увеличении вычислительной мощности и доступности данных, NLP начал использовать сложные нейронные сети для понимания лингвистических тонкостей. Современные методы передачи обучения позволяют моделям улучшать выполнение конкретных задач с целью обеспечения эффективности и точности в реальных приложениях.

Расцвет трансформеров

Трансформеры – это тип архитектуры нейронных сетей, которая стала основой многих передовых моделей NLP. Трансформеры, в сравнении с их предшественниками, которые сильно полагались на рекуррентные или сверточные слои, используют механизм, известный как “внимание”, для установления глобальных зависимостей между входом и выходом.

Архитектура трансформера состоит из кодировщика и декодера, каждый из которых имеет несколько одинаковых слоев. Кодировщик принимает последовательность входных данных и сжимает ее в “контекст” или “память”, которую декодер использует для генерации выходных данных. Трансформеры отличаются своим механизмом “самовнимания”, который взвешивает различные части входных данных при формировании выходных данных, позволяя модели сосредоточиться на важном.

Они используются в задачах NLP, потому что превосходят в различных задачах преобразования данных, включая, но не ограничиваясь, машинный перевод, резюмирование текста и анализ настроений.

Расширенное именованное распознавание сущностей (NER) с использованием BERT

Распознавание именованных сущностей (NER) является важной частью обработки естественного языка (NLP) и включает в себя идентификацию и категоризацию именованных сущностей в тексте по заранее определенным категориям. Традиционные системы NER сильно полагались на правила и особенности. Однако с появлением глубокого обучения и, в частности, архитектур Transformer, таких как BERT (Bidirectional Encoder Representations from Transformers), производительность NER значительно увеличилась.

BERT от Google предварительно обучен на большом объеме текста и может генерировать контекстуальные вложения для слов. Это означает, что BERT может понимать контекст, в котором появляется слово, что делает его очень полезным для задач, таких как NER, где контекст является критическим.

Реализация расширенного NER с использованием BERT

  • Мы будем использовать возможность BERT понимать контекст, используя его вложения в NER.
  • NER-система SpaCy является механизмом последовательной разметки. Вместо обычных векторов слов мы обучим ее с использованием вложений BERT и архитектуры SpaCy.
import spacy
import torch
from transformers import BertTokenizer, BertModel
import pandas as pd

# Загрузка набора данных обзоров авиакомпаний в DataFrame
df = pd.read_csv('/kaggle/input/airline-reviews/Airline_Reviews.csv')

# Инициализация токенизатора BERT и модели
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased")

# Инициализация модели SpaCy для NER
nlp = spacy.load("en_core_web_sm")

# Определение функции для получения именованных сущностей из текста с помощью SpaCy
def get_entities(text):
    doc = nlp(text)
    return [(ent.text, ent.label_) for ent in doc.ents]

# Извлечение и печать именованных сущностей из первых 4 обзоров в DataFrame
for i, review in df.head(4).iterrows():
    entities = get_entities(review['Review'])
    print(f"Обзор #{i + 1}:")
    for entity in entities:
        print(f"Сущность: {entity[0]}, Метка: {entity[1]}")
    print("\n")

'''Этот код загружает набор данных обзоров авиакомпаний, инициализирует модели BERT и SpaCy, 
а затем извлекает и печатает именованные сущности из первых четырех обзоров.
'''
OUTPUT

Контекстные вложения и их важность

В традиционных вложениях, таких как Word2Vec или GloVe, слово всегда имеет одинаковое векторное представление независимо от контекста. Множественные значения слов не точно представлены. Контекстные вложения стали популярным способом обойти эту ограниченность.

В отличие от Word2Vec, контекстные вложения улавливают значение слов на основе их контекста, что позволяет гибко представлять слова. Например, слово “банк” выглядит по-разному в предложениях “Я сидел у речного берега” и “Я пошел в банк”. Постоянно меняющееся изображение создает более точные представления, особенно для задач, требующих тонкого понимания. Улучшается способность моделей понимать общие фразы, синонимы и другие лингвистические конструкции, которые ранее были трудны для понимания машинами.

Трансформеры и текстовая резюмирование с BERT и T5

Архитектура Transformer фундаментально изменила область NLP, позволяя разработке моделей, таких как BERT, GPT-2 и T5. Эти модели используют механизмы внимания для оценки относительных весов разных слов в последовательности, что приводит к высококонтекстному и тонкому пониманию текста.

T5 (Text-to-Text Transfer Transformer) обобщает идею, рассматривая каждую задачу NLP как задачу текст-к-тексту, в то время как BERT является эффективной моделью резюмирования. Например, перевод предполагает преобразование текста на английском языке в текст на французском языке, а резюмирование включает сокращение длинного текста. В результате T5 легко адаптируется. Обучайте T5 с различными задачами благодаря единой системе, возможно, используя информацию из одного задания для обучения на другом.

Реализация с T5

import pandas as pd
from transformers import T5Tokenizer, T5ForConditionalGeneration

# Загрузка набора данных с отзывами на авиакомпании в DataFrame
df = pd.read_csv('/kaggle/input/airline-reviews/Airline_Reviews.csv')

# Инициализация токенизатора и модели T5 (используется 't5-small' для демонстрации)
model_name = "t5-small"
model = T5ForConditionalGeneration.from_pretrained(model_name)
tokenizer = T5Tokenizer.from_pretrained(model_name)

# Определение функции для суммирования текста с использованием модели T5
def summarize_with_t5(text):
    input_text = "summarize: " + text
    # Токенизация входного текста и генерация краткого обзора
    input_tokenized = tokenizer.encode(input_text, return_tensors="pt", 
    max_length=512, truncation=True)
    summary_ids = model.generate(input_tokenized, max_length=100, min_length=5, 
    length_penalty=2.0, num_beams=4, early_stopping=True)
    return tokenizer.decode(summary_ids[0], skip_special_tokens=True)

# Суммирование и печать первых 5 отзывов в DataFrame для демонстрации
for i, row in df.head(5).iterrows():
    summary = summarize_with_t5(row['Review'])
    print(f"Обзор {i+1}:\n{summary}\n")
    #print("Summary ",i+1,": ", summary)
    print("-" * 50)

''' Этот код загружает набор данных с отзывами на авиакомпании, инициализирует модель T5 и токенизатор, 
а затем генерирует и печатает краткие обзоры для первых пяти отзывов.
'''
OUTPUT

После успешного выполнения кода видно, что сгенерированные обзоры краткие, но успешно передают основные моменты оригинальных отзывов. Это показывает способность модели T5 понимать и оценивать данные. Благодаря ее эффективности и возможности краткого изложения текста, эта модель является одной из самых востребованных в области обработки естественного языка (NLP).

Расширенный анализ тональности с глубинными инсайтами при помощи глубокого обучения

Продвигаясь за пределы простой категоризации тональности на положительную, отрицательную или нейтральную, мы можем углубиться для извлечения более конкретных оттенков тональности и даже определения интенсивности этих оттенков. Сочетание мощи модели BERT с дополнительными слоями глубокого обучения может создать модель анализа тональности, которая предоставляет более глубокие инсайты.

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

Реализация расширенного анализа тональности с использованием BERT

Подготовка данных

Подготовка данных является ключевым шагом перед началом процесса моделирования. Это включает загрузку набора данных, работу с пропущенными значениями и преобразование необработанных данных в формат, удобный для анализа тональности. В данном случае мы переведем столбец “Overall_Rating” набора данных с отзывами на авиакомпании в категории тональности. Мы будем использовать эти категории в качестве целевых меток при обучении модели анализа тональности.

import pandas as pd

# Загрузка набора данных
df = pd.read_csv('/kaggle/input/airline-reviews/Airline_Reviews.csv')

# Преобразование значений 'n' в NaN, а затем преобразование столбца в числовой тип данных
df['Overall_Rating'] = pd.to_numeric(df['Overall_Rating'], errors='coerce')

# Удаление строк с пропущенными значениями в столбце Overall_Rating
df.dropna(subset=['Overall_Rating'], inplace=True)

# Преобразование рейтингов в многоклассовые категории
def rating_to_category(rating):
    if rating <= 2:
        return "Очень отрицательный"
    elif rating <= 4:
        return "Отрицательный"
    elif rating == 5:
        return "Нейтральный"
    elif rating <= 7:
        return "Положительный"
    else:
        return "Очень положительный"

# Применение функции для создания столбца 'Sentiment'
df['Sentiment'] = df['Overall_Rating'].apply(rating_to_category)

Токенизация

Текст преобразуется в токены с помощью процесса токенизации. Затем модель использует эти токены в качестве входных данных. Мы будем использовать токенизатор DistilBERT, улучшенный для повышения точности и производительности. С помощью этого токенизатора наши отзывы будут преобразованы в формат, понятный модели DistilBERT.

from transformers import DistilBertTokenizer

# Инициализация токенизатора DistilBert с предварительно обученной моделью 'distilbert-base-uncased'
tokenizer = DistilBertTokenizer.from_pretrained('distilbert-base-uncased')

Набор данных и загрузчик данных

Нам необходимо реализовать классы Dataset и DataLoader PyTorch, чтобы эффективно обучать и оценивать нашу модель. DataLoader позволит нам пакетно обрабатывать данные, ускоряя процесс обучения, а класс Dataset поможет нам организовать данные и метки.

from torch.utils.data import Dataset, DataLoader
from sklearn.model_selection import train_test_split

# Определение пользовательского класса Dataset для анализа тональности
class SentimentDataset(Dataset):
    def __init__(self, reviews, labels):
        self.reviews = reviews
        self.labels = labels
        self.label_dict = {"Очень негативное": 0, "Негативное": 1, "Нейтральное": 2, 
                           "Положительное": 3, "Очень положительное": 4}
    
    # Возвращение общего количества образцов
    def __len__(self):
        return len(self.reviews)
    
    # Получение образца и метки по заданному индексу
    def __getitem__(self, idx):
        review = self.reviews[idx]
        label = self.label_dict[self.labels[idx]]
        tokens = tokenizer.encode_plus(review, add_special_tokens=True, 
        max_length=128, pad_to_max_length=True, return_tensors='pt')
        return tokens['input_ids'].view(-1), tokens['attention_mask'].view(-1),
         torch.tensor(label)

# Разделение набора данных на обучающую и тестовую выборки
train_df, test_df = train_test_split(df, test_size=0.2, random_state=42)

# Создание загрузчика данных для обучающей выборки
train_dataset = SentimentDataset(train_df['Review'].values, train_df['Sentiment'].values)
train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)

# Создание загрузчика данных для тестовой выборки
test_dataset = SentimentDataset(test_df['Review'].values, test_df['Sentiment'].values)
test_loader = DataLoader(test_dataset, batch_size=16, shuffle=False)

'''Этот код определяет пользовательский класс Dataset для анализа тональности и затем создает
DataLoader для обучающего и тестового наборов данных.
'''

Инициализация модели и обучение

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

from transformers import DistilBertForSequenceClassification, AdamW
from torch.nn import CrossEntropyLoss

# Инициализация модели DistilBERT для классификации последовательностей с 5 метками
model = DistilBertForSequenceClassification.from_pretrained('distilbert-base-uncased', 
num_labels=5)

# Инициализация оптимизатора AdamW для обучения
optimizer = AdamW(model.parameters(), lr=1e-5)

# Определение функции потерь Cross-Entropy
loss_fn = CrossEntropyLoss()

# Цикл обучения на протяжении 3 эпох
for epoch in range(3):
    for batch in train_loader:
        # Разбиение входных и меток тензоров из пакета DataLoader
        input_ids, attention_mask, labels = batch
        
        # Обнуление градиентов
        optimizer.zero_grad()
        
        # Прямой проход: получение предсказаний модели
        outputs = model(input_ids, attention_mask=attention_mask)
        
        # Вычисление потери между предсказаниями и истинными значениями
        loss = loss_fn(outputs[0], labels)
        
        # Обратный проход: вычисление градиентов
        loss.backward()
        
        # Обновление параметров модели
        optimizer.step()

'''Этот код инициализирует модель DistilBERT для классификации последовательностей, настраивает
оптимизатор AdamW и CrossEntropyLoss, а затем обучает модель на протяжении 3 эпох.
'''

Оценка

После обучения мы должны оценить производительность нашей модели на непроверенных данных. Это поможет нам определить, насколько хорошо наша модель будет работать в практических ситуациях.

correct_predictions = 0
total_predictions = 0

# Установка модели в режим оценки
model.eval()

# Отключение вычисления градиентов, поскольку мы выполняем только вывод
with torch.no_grad():
    # Перебор пакетов в тестовом DataLoader
    for batch in test_loader:
        # Разбиение входных и меток тензоров из пакета DataLoader
        input_ids, attention_mask, labels = batch

        # Получение предсказаний модели
        outputs = model(input_ids, attention_mask=attention_mask)

        # Получение предсказанных меток
        _, preds = torch.max(outputs[0], dim=1)

        # Подсчет количества правильных предсказаний
        correct_predictions += (preds == labels).sum().item()

        # Подсчет общего числа предсказаний
        total_predictions += labels.size(0)

# Вычисление точности
accuracy = correct_predictions / total_predictions

# Печать точности
print(f"Точность: {accuracy * 100:.2f}%")

'''Этот фрагмент кода оценивает обученную модель на тестовом наборе данных и печатает
общую точность.
'''
  • ВЫВОД: Точность: 87,23%

Развертывание

Мы можем сохранить модель, когда мы довольны ее производительностью. Это позволяет использовать модель на различных платформах или приложениях.

# Сохранение обученной модели на диск
model.save_pretrained("/kaggle/working/")

# Сохранение токенизатора на диск
tokenizer.save_pretrained("/kaggle/working/")

''' Этот фрагмент кода сохраняет обученную модель и токенизатор в указанную
директорию для будущего использования.
'''

Вывод

Давайте использовать настроение примера обзора для обучения нашей обученной модели, чтобы предсказать его. Это показывает, как можно выполнять анализ настроения в реальном времени с использованием модели.

# Функция для предсказания настроения заданного обзора
def predict_sentiment(review):
    # Токенизация входного обзора
    tokens = tokenizer.encode_plus(review, add_special_tokens=True, max_length=128,
    pad_to_max_length=True, return_tensors='pt')
    
    # Запуск модели для получения прогнозов
    with torch.no_grad():
        outputs = model(tokens['input_ids'], attention_mask=tokens['attention_mask'])
    
    # Получение метки с максимальным предсказанным значением
    _, predicted_label = torch.max(outputs[0], dim=1)
    
    # Определение словаря для сопоставления числовых меток со строковыми метками
    label_dict = {0: "Очень негативное", 1: "Негативное", 2: "Нейтральное", 3: "Позитивное",
    4: "Очень позитивное"}
    
    # Возвращение предсказанной метки
    return label_dict[predicted_label.item()]

# Пример обзора
review_sample = "Полет был потрясающим, и персонал был очень дружелюбным."

# Предсказание настроения примера обзора
sentiment_sample = predict_sentiment(review_sample)

# Вывод предсказанного настроения
print(f"Предсказанное настроение: {sentiment_sample}")

''' Этот фрагмент кода определяет функцию для предсказания настроения заданного
обзора и демонстрирует ее использование на примере обзора.
'''
  • ВЫВОД: Предсказанное настроение: Очень позитивное

Перенос обучения в NLP

Обработка естественного языка (NLP) претерпела революцию благодаря переносу обучения, который позволяет моделям использовать предыдущие знания из одной задачи и применять их к новым, связанным задачам. Исследователи и разработчики теперь могут настраивать предварительно обученные модели для конкретных задач, таких как анализ настроения или распознавание именованных сущностей, вместо обучения моделей с нуля, что часто требует огромного количества данных и вычислительных ресурсов. Часто обучаемые на огромных корпусах, таких как вся Википедия, эти предварительно обученные модели улавливают сложные лингвистические паттерны и отношения. Перенос обучения позволяет NLP-приложениям работать быстрее, требуя меньше данных и часто демонстрируя передовую производительность, делая доступными превосходные языковые модели для широкого круга пользователей и задач.

Заключение

Сочетание традиционных лингвистических методов и современных техник глубокого обучения привело к необычайным прогрессам в быстро развивающейся области NLP. Мы постоянно расширяем границы того, что машины могут понимать и обрабатывать на естественном языке. От использования эмбеддингов для понимания тонкостей контекста до использования мощи архитектур Transformer, таких как BERT и T5. Особенно перенос обучения сделал использование высокопроизводительных моделей более доступным, снизив порог вхождения и стимулируя инновации. По мере обсуждения вопросов становится ясно, что взаимодействие между лингвистическими навыками человека и вычислительной мощностью машин обещает наступление времени, когда машины не только будут понимать, но и смогут улавливать тонкости человеческого языка.

Основные моменты

  • Контекстные эмбеддинги позволяют NLP-моделям понимать слова в связи с их окружением.
  • Архитектура Transformer значительно расширила возможности NLP-задач.
  • Перенос обучения повышает производительность модели без необходимости обширного обучения.
  • Техники глубокого обучения, особенно с использованием моделей на основе Transformer, предоставляют нюансированные представления текстовых данных.

Часто задаваемые вопросы

Показанное в этой статье медиа не принадлежит Analytics Vidhya и используется по усмотрению автора.