0. Пишите впереди
До появления fastText линейные модели занимали доминирующее положение в задачах классификации текста и часто добивались хороших результатов при выборе правильных признаков. Однако его модельная простота становится узким местом при разработке линейных моделей. Нейронные сети обладают возможностями подбора признаков высокого порядка и подходят для различных сложных сценариев. fastText — это классическая работа, которая применяет DNN к классификации текста и в то время достигла эффекта SOTA.
Личный опыт:
- N-грамма на уровне символов разбивает слова на подстроки, отдельно обучает вложения и накладывает их друг на друга для получения вложений слов. Может выучить словоформу и справиться с встраиванием незарегистрированных слов.
- fastText можно использовать для решения задач классификации, таких как классификация настроений, классификация текста и т. д.
Адрес бумаги:
1. Архитектура модели
fastText использует типичную трехуровневую архитектуру нейронной сети. Как показано ниже.
Подводя итог в одном предложении, входной слой представляет собой векторное представление каждой сегментации текста n-грамм.После суммирования и усреднения он передается скрытому слою и, наконец, отправляется в softmax для получения результата прогнозирования.Если число категорий слишком велико, для повышения эффективности классификации можно использовать иерархический softmax. , если категорий меньше, используйте обычный softmax. Кажется, что fastText посредственен, даже немного похож на структуру CBOW word2vec.На самом деле, fastText имеет большую точку оптимизации, которая является только что упомянутой N-граммой. Давайте посмотрим, что такое N-граммы и почему их нужно оптимизировать таким образом.
2. N-gram
Для обучения вектора слов общепринятой практикой является сегментация китайского языка или обучение каждого слова в английском предложении для получения вектора встраивания. При таком подходе есть две проблемы:
- Каждое слово должно быть предварительно закодировано перед встраиванием, и закодированное слово теряет информацию о морфологическом сходстве. Например, загрузка и загрузка означают одно и то же, но встраивание их по отдельности вызовет большую разницу в семантике.
- Невозможно обработать незарегистрированные слова
N-граммы можно разделить на N-граммы на уровне символов и N-граммы на уровне фраз в соответствии с разной степенью детализации. Возьмем в качестве примера «Я практикую программирование в школе».
уровень персонажа
я в/учусь/в школе/практике в школе/практике/учусь/программирую
Уровень фразы
Я практикую/практикую программирование в/в школе/школе
FastText использует метод n-грамм на уровне символов для встраивания сегментации слова в документ.Для слова яблоко оно будет разделено на ap/ppl/ple и встроено, и, наконец, суммировано, чтобы получить результат встраивания яблока. Таким образом, это может быть решено:
- Подобные слова часто имеют схожие значения, и вложения, полученные с помощью n-грамм символьного уровня, также подобны.
- Разлагая незарегистрированные слова, можно получить его вектор вложения
3. Настоящий бой
В этой статье используется версия fastText для Python. В среде Linux введите следующую команду для установки fastText
$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ pip install .
См. следующие шаги
Первый шаг — ввести в терминал следующую команду для загрузки набора данных, где 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 успешно завершено.