«Общественное мнение - это все». - Авраам Линкольн

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

Вы узнаете об основных навыках обработки естественного языка, включая:

  • Предварительная обработка текста
  • Токенизация
  • Встраивание слов с TF-IDF
  • Моделирование с помощью LSTM, логистической регрессии, OneVsRest, LinearSVC и т. Д.
  • Оценка по шкале F1, точность, отзывчивость, точность

Сквозная дорожная карта для проектов НЛП будет предоставлена ​​в конце этой статьи.

Загрузите данные и быстро изучите данные

import numpy as np 
import pandas as pd 
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Dense, Embedding, LSTM, SpatialDropout1D
from keras.utils.np_utils import to_categorical
import re

from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
from sklearn.multiclass import OneVsRestClassifier
from sklearn.linear_model import RidgeClassifier

В наборе данных 21 столбец. Мы сохраняем здесь только столбцы «текст» и «настроение».

Форма набора данных. У нас есть 13871 строка записи.

В столбце «тональность» 3 уникальных значения. Обратите внимание, что набор данных несбалансирован, что означает, что количество записей для каждой категории неодинаково.

Произвольно проверьте твит из набора данных.

Разделите набор данных на случайные подмножества поездов, проверок и тестов.

Train_test_split - это метод в scikit-learn, который разбивает массивы или матрицы на случайные обучающие и тестовые подмножества.

X_train, X_test, y_train, y_test = train_test_split(df['text'], df['sentiment'], test_size=0.33, random_state=42)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=42)

Теперь у нас есть 3 подмножества: обучение, проверка и тестирование. X_train включает твиты, y_train включает соответствующие настроения.

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

Определите функцию text_prepare для предварительной обработки текста, которая выполняет следующие задачи:

  • заменить символы в «REPLACE_BY_SPACE_RE» пробелом из входящего текста
  • удалить символы в “BAD_SYMBOLS_RE” из входного текста
  • расширить список стоп-слов с помощью «rt» и «http»
  • удалить стоп-слова из текста

Обработайте текст в наборе обучающих данных следующим образом.

Подать заявку на проверку и тестовый набор данных.

Какие самые распространенные слова?

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

Встраивание слов с помощью TF-IDF

Алгоритмы машинного обучения работают с числовыми данными, и мы не можем использовать предоставленные текстовые данные, такие как «@JebBush сказал, что он сократил налоги FL на 19 миллиардов долларов». Нам нужно преобразовать текстовые данные в числовые векторы, что называется «встраиванием слов», прежде чем передавать их моделям.

TF-IDF

Подход TF-IDF (Term Frequency Inverse Document Frequency) расширяет структуру набора слов, принимая во внимание общие частоты слов во всем наборе данных собранных твитов. По сравнению с мешком слов, TF-IDF штрафует слишком частые слова и обеспечивает лучшее пространство для функций.

  • Используйте класс TfidfVectorizer из scikit-learn
  • Отфильтровать слишком редкие слова (встречаются менее чем в 5 заголовках)
  • Отфильтруйте слишком частые слова (встречаются более чем в 90% твитов).
  • Используйте 2 грамма вместе с 1 граммом

текст - ›векторы

Наконец, мы готовы опробовать разные модели.

1-я модель: логистическая регрессия

Используйте LogisticRegression из sklearn.linear_model

LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, intercept_scaling=1, max_iter=100, multi_class=’warn’, n_jobs=None, penalty=’l2', random_state=None, solver=’warn’, tol=0.0001, verbose=0, warm_start=False)

Средняя точность перекрестной проверки 67,86%, стандартное значение 0,38.

2-я модель: LinearSVC

Вызов LinearSVC из sklearn.svm

Средняя точность перекрестной проверки 63,76%, стандартное значение 0,45.

3-я модель: OneVsRest

Вызов OneVsRestClassifier из sklearn.multiclass

Оценка OneVsRestClassifier

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

4-я модель: LSTM с Keras

Напомним, что раньше мы импортировали библиотеки keras.

from sklearn.feature_extraction.text import CountVectorizer
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Dense, Embedding, LSTM, SpatialDropout1D
from keras.utils.np_utils import to_categorical

Сохраните результат предварительной обработки текста в другом фрейме данных pandas «X».

Используйте Tokenizer от keras

Создать модель LSTM

Обратите внимание на функцию активации оптимизатора и адама.

Кодирование столбца прогноза «настроение» (положительное, нейтральное, отрицательное)

Обучите модель LSTM за 20 эпох

Поздравляю! Вы только что изучили основные технологии обработки естественного языка, в том числе:

  • Предварительная обработка текста
  • Токенизация
  • Встраивание слов с TF-IDF
  • Моделирование с помощью LSTM, логистической регрессии, OneVsRest, LinearSVC и т. Д.
  • Оценка по шкале F1, точность, отзывчивость, точность

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

Дорожную карту проектов НЛП можно скачать по этой ссылке.

Следующим шагом будет испачкать руки, играя с кошкой. Нет, я имею в виду кодирование. Удачи.