этот пост любезно предоставлен https://aboullaite.me/sentiment-analysis-fasttext/ .. большое спасибо за обмен информацией

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

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

Анализ настроений в Twitter с использованием FastText

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

Между прочим, в этой статье мы собираемся использовать набор данных sentiment140, который содержит 1 600 000 твитов, извлеченных с помощью twitter api. Извлеченные твиты были помечены двумя ключами: 0 = negative и 4 = positive. Нашей целью будет классифицировать данный твит (текст) и проверить, является ли он положительным или отрицательным, с помощью fastText.

Установка FastText

FastText - это библиотека, созданная исследовательской группой Facebook для эффективного изучения представлений слов и классификации предложений. Я использовал последнюю стабильную версию, доступную на момент написания этой статьи, это 0.2.0.
Файл Readme.md содержит необходимый шаг для создания fasttext, который я также описываю ниже:

$ wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip
$ unzip v0.2.0.zip
$ cd fastText-0.2.0
$ make

Это сгенерирует объектные файлы для всех классов и основного двоичного файла fasttext, которые мы собираемся использовать в этом посте.

Предварительная обработка и очистка твитов

Наш набор данных в основном представляет собой csv файл с 1 600 000 твитов, состоящий из 6 полей:

  • target: полярность твита (0 = отрицательный, 4 = положительный).
  • ids: идентификатор твита.
  • date: дата твита.
  • flag: запрос. Если запроса нет, то это значение NO_QUERY.
  • пользователь: пользователь, который написал в Твиттере
  • текст: текст твита.

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

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

Все эти требования реализованы в скрипте ниже:

import csv  
import re
train = open('tweets.train','w')  
test = open('tweets.valid','w')  
with open('sentiment140.1600000.csv', mode='r', encoding = "ISO-8859-1") as csv_file:  
    csv_reader = csv.DictReader(csv_file, fieldnames=['target', 'id', 'date', 'flag', 'user', 'text'])
    line = 0
    for row in csv_reader:
        # Clean the training data
        # First we lower case the text
        text = row["text"].lower()
        # remove links
        text = re.sub('((www\.[^\s]+)|(https?://[^\s]+))','',text)
        #Remove usernames
        text = re.sub('@[^\s]+','', text)
        # replace hashtags by just words
        text = re.sub(r'#([^\s]+)', r'\1', text)
        #correct all multiple white spaces to a single white space
        text = re.sub('[\s]+', ' ', text)
        # Additional clean up : removing words less than 3 chars, and remove space at the beginning and teh end
        text = re.sub(r'\W*\b\w{1,3}\b', '', text)
        text = text.strip()
        line = line + 1
        # Split data into train and validation
        if line%16 == 0:
            print(f'__label__{row["target"]} {text}', file=test)
        else:
            print(f'__label__{row["target"]} {text}', file=train)

Обучение нашего классификатора

Прежде всего нам нужно создать наш первый классификатор! Для этого нам нужно просто запустить следующую команду:

$ ./fasttext supervised -input tweets.train -output model_tweet
Read 13M words  
Number of words:  578422  
Number of labels: 2  
Progress: 100.0% words/sec/thread:  472970 lr:  0.000000 loss:  0.288137 ETA:   0h 0m

В конце обучения, которое занимает всего несколько секунд, в текущем каталоге создается файл model_tweet.bin, содержащий обученный классификатор. Обратите внимание, что для обучения модели мы использовали только параметры по умолчанию. Мы можем дополнительно указать настраиваемые аргументы во время обучения, чтобы улучшить производительность. Например, ниже мы указываем скорость обучения (ltr) процесса обучения и количество просмотров каждого примера (epoch).

$ ./fasttext supervised -input tweets.train -output model_tweet -epoch 30 -lr 0.1
Read 13M words  
Number of words:  578422  
Number of labels: 2  
Progress: 100.0% words/sec/thread:  512276 lr:  0.000000 loss:  0.312297 ETA:   0h 0m
123456

Тестируем наш классификатор

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

$ ./fasttext test model_tweet.bin tweets.valid
N    100000  
P@1    0.765  
R@1    0.765
1234

Вывод описывает количество примеров (100000), P@1 - точность, а R@1 - отзыв. Конечно, мы можем добавить еще несколько функций на этапе обучения, чтобы еще больше улучшить нашу производительность!

Тестирование нашего классификатора с использованием python API

fastText также предлагает API-интерфейс Python, который мы можем использовать для взаимодействия с ним. Шаги, описанные [здесь] (https://github.com/facebookresearch/fastText/tree/master/python) показывают, как его создать.

После этого мы собираемся использовать его для импорта нашей ранее сохраненной модели и протестировать ее на нескольких поддельных твитах!

from fastText import load_model
classifier = load_model("model_tweet.bin")  
texts = ['Ugghhh... Not happy at all! sorry', 'Happyyyyyyy', 'OH yeah! lets rock.']
labels = classifier.predict(texts)  
print (labels)
1234567

Результат выполнения приведенного выше кода выглядит приемлемым:

([['__label__0'], ['__label__4'], ['__label__4']], array([[0.65397215],
       [0.80476588],
       [0.99866331]]))

Он успешно классифицировал наши 3 твита на отрицательные (метка 0) для первого и положительные (метка 4) для остальных, и показывает вероятность для каждого из них. Неплохо!

полный код в https://colab.research.google.com/drive/1bb2OWQcDDolESwhkATD0el0RvF33fenZ#scrollTo=X5PWbhOzZ3ze