Классификация многоязычных документов

Как создать приложение НЛП, не зависящее от языка.

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

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

Влияние

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

Соревнование

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

К счастью, есть интересная альтернатива, называемая межъязыковой классификацией документов.

Он направлен на обучение классификатора документов для набора данных на одном языке и обобщение его возможностей прогнозирования на другие языки без необходимости использования наборов данных на других языках.

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

Вариант использования

Без промедления давайте приступим к делу и создадим один многоязычный классификатор заголовков новостей.

Набор данных включает 72000 заголовков статей из различных медиа-компаний на 35 разных языках. Они разделены на 4 взаимоисключающих тематических ярлыка. Задача - предугадать метку с учетом заголовка на любом из языков.

Трубопровод НЛП

Как подойти к такой сложной проблеме? Давайте разберем его поэтапно.

Шаг 1. Разбор и очистка HTML

Корпус, кажется, очищен от кода HTML, поскольку он содержит много кодов символов HTML; некоторые из них сломаны. Был создан небольшой синтаксический анализатор для очистки заголовков.

Шаг 2. Определение языка

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

Теперь давайте воспользуемся библиотекой fast-text Facebook для определения языка.

import fastext
import pandas as pd
def predict_language(text, language_classifier):
    language = language_classifier.predict(text)
    return language
language_classifier = fasttext.load_model('lid.176.ftz')
df = pd.read_csv('headlines.csv').to_frame()
df['language'] = (df['headline']
                  .apply(predict_language, 
                         args=(language_classifer)))

Шаг 3–4. Универсальное многоязычное кодирование предложений (MUSE)

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

МУЗА, простая и понятная, превращает предложение в вектор чисел. Векторы предложений с одинаковым значением в разных языках имеют близкое геометрическое расстояние друг от друга.

Модель обучена на 16 языках, поэтому необходимо будет применить фильтр, чтобы удалить другие языки в конвейере. Это возможно, поскольку только 3% набора данных выходит за рамки MUSE.

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

special_chars = [
    ',', '.', '"', ':', ')', '(', '-', '!', '?', '|', ';', "'", '/', 
    '[', ']', '>', '%', '=', '#', '*', '+', '\\', '•',  '~', '·', 
    '_', '{', '}', '©', '^', '®', '`',  '<', '→', '°', '™', '›','♥',
    '←', '×', '§', '″', '′', '█', '½', '…', '“', '★', '”','–', '●', 
    '►', '−', '¢', '²', '¬', '░', '¶', '↑', '±', '¿', '▾','═', '¦',
    '║', '―', '¥', '▓', '—', '‹', '─', '▒', ':', '⊕', '▼', '▪',  
    '†', '■', '’', '▀', '¨', '▄', '♫', '☆', '¯', '♦', '¤', '▲', '∞',
    '∙', ')', '↓', '、', '│', '(', '»', ',', '♪', '╩', '╚', '³',
    '・', '╦', '╣', '╔', '╗', '▬','❤', 'ï', 'Ø', '¹', '≤', '‡', '√'
]

TensorFlow выполняет свою работу, и становится легко внедрить предложение в виде вектора чисел длиной 512.

import tensorflow_hub as hub
import numpy as np
import tensorflow_text
embed = hub.load("https://tfhub.dev/google/universal-sentence-encoder-multilingual-large/3")
X_embeded = embed(df['filtered_cleaned_headline'].values)

Шаг 5. Слияние качественных и количественных характеристик.

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

Длина текста заголовка может быть хорошим предиктором для различения заголовков «спорт», «бизнес + технологии» и «мир», как видно из разницы между этими тремя средними показателями по группам.

Шаг 6. Уменьшение размерности кодировок.

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

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

Есть несколько вариантов, учитывающих уменьшение размерности вложений / кодировок:

  1. T-распределенное стохастическое вложение соседей (t-SNE)
  2. Анализ главных компонент (PCA)
  3. PCA + алгоритм постобработки

t-SNE поддерживает относительное расстояние между вложениями, что велико, но требует больших вычислительных ресурсов. PCA используется для быстрого и грязного прототипирования, поскольку он быстр и полностью интегрирован в конвейер scikit-learn. Но я бы посоветовал попробовать вариант 3, который в этой статье доказал свою превосходство.

Шаг 7. Отбор классификаторов

Конвейер НЛП построен в scikit-learn, что позволяет тестировать различные типы моделей.

# Design NLP pipeline
pipeline = Pipeline([
    # Fusion of features                 
    ('fuser', ColumnTransformer(
        [    
            # Transform MUSE encodings
            ('embedings', Pipeline([
                # Standardize MUSE encodings                   
                ('emb_scaler', StandardScaler()),
   
                # Dimensionality reduction of encodings
                ('emb_reducer', PCA(
                    n_components=0.75,
                    random_state=random_state))]),
              # Apply to only encodings columns
              emb_idx),
            
            # Standardize title length feature
            ('title_length', StandardScaler(), ['title_length']),
            # One-hot encode language feature
            ('language', OneHotEncoder(drop='first'), ['language'])            
       ]    
   )),
    # Determine classification model in the GridSearchCV
    ('classifier', None)
])

Из-за несбалансированных меток для оценки модели используются оценки f1_weigted и f1_macro. Первый учитывает распределение меток в наборе данных, а второй фокусируется на дискриминантной мощности модели между классами, давая каждой метке одинаковый вес.

Выбранные модели сравниваются со следующими ссылками:

  1. Генератор случайных классификаторов с учетом распределения меток в наборе данных
  2. Самый частый классификатор, всегда выбирающий наиболее частую метку.

Лучший выбор - логистическая регрессия. Классификатор опорных векторов (SVC) и классификатор ближайших соседей (KNN) пытаются запомнить набор данных. Несмотря на то, что настройка улучшит переобучение, это неразумно из-за их долгого обучения и предсказания. Все модели показали себя значительно лучше, чем эталоны.

Призыв к действию

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