Введение и практика fastText

искусственный интеллект

0. Пишите впереди

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

Личный опыт:

  1. N-грамма на уровне символов разбивает слова на подстроки, отдельно обучает вложения и накладывает их друг на друга для получения вложений слов. Может выучить словоформу и справиться с встраиванием незарегистрированных слов.
  2. fastText можно использовать для решения задач классификации, таких как классификация настроений, классификация текста и т. д.

Адрес бумаги:

АР Вест V.org/PDF/1607.01…

1. Архитектура модели

fastText использует типичную трехуровневую архитектуру нейронной сети. Как показано ниже.

Подводя итог в одном предложении, входной слой представляет собой векторное представление каждой сегментации текста n-грамм.После суммирования и усреднения он передается скрытому слою и, наконец, отправляется в softmax для получения результата прогнозирования.Если число категорий слишком велико, для повышения эффективности классификации можно использовать иерархический softmax. , если категорий меньше, используйте обычный softmax. Кажется, что fastText посредственен, даже немного похож на структуру CBOW word2vec.На самом деле, fastText имеет большую точку оптимизации, которая является только что упомянутой N-граммой. Давайте посмотрим, что такое N-граммы и почему их нужно оптимизировать таким образом.

2. N-gram

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

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

N-граммы можно разделить на N-граммы на уровне символов и N-граммы на уровне фраз в соответствии с разной степенью детализации. Возьмем в качестве примера «Я практикую программирование в школе».

уровень персонажа

я в/учусь/в школе/практике в школе/практике/учусь/программирую

Уровень фразы

Я практикую/практикую программирование в/в школе/школе

FastText использует метод n-грамм на уровне символов для встраивания сегментации слова в документ.Для слова яблоко оно будет разделено на ap/ppl/ple и встроено, и, наконец, суммировано, чтобы получить результат встраивания яблока. Таким образом, это может быть решено:

  1. Подобные слова часто имеют схожие значения, и вложения, полученные с помощью n-грамм символьного уровня, также подобны.
  2. Разлагая незарегистрированные слова, можно получить его вектор вложения

3. Настоящий бой

В этой статье используется версия fastText для Python. В среде Linux введите следующую команду для установки fastText

$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ pip install .

См. следующие шаги

к data science.com/natural-blue…

Первый шаг — ввести в терминал следующую команду для загрузки набора данных, где cook.stackexchange.txt — это образец набора данных, который нам нужен.

wget https://dl.fbaipublicfiles.com/fasttext/data/cooking.stackexchange.tar.gz && tar xvzf cooking.stackexchange.tar.gz

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

$ head -n 12324 cooking.stackexchange.txt > training_data.txt 
$ tail -n 3080 cooking.stackexchange.txt > testing_data.txt

Третий шаг, python запускает fastText. Примерная программа выглядит следующим образом:

import fasttext

def train():
    model = fasttext.train_supervised("training_data.txt", lr=0.1, dim=100,
             epoch=5, word_ngrams=2, loss='softmax')
    model.save_model("model_file.bin")

def test():
    classifier = fasttext.load_model("model_file.bin")
    result = classifier.test("testing_data.txt")
    print("acc:", result)
    with open('testing_data.txt', encoding='utf-8') as fp:
        for line in fp.readlines():
            line = line.strip()
            if line == '':
                continue
            print(line, classifier.predict([line])[0][0][0])

if __name__ == '__main__':
    train()
    test()

Интерфейс выведет:

__label__dough __label__yeast __label__cinnamon cinnamon in bread dough __label__baking
__label__coffee __label__fresh Freshly ground coffee, how fresh should it be? __label__food-safety
__label__sauce __label__thickening How to thicken a Yoghurt based cold sauce? __label__baking
...

То есть обучение и тестирование модели fastText успешно завершено.