«Общественное мнение - это все». - Авраам Линкольн
Источником данных являются десятки тысяч твитов о первых президентских дебатах Республиканской партии 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, точность, отзывчивость, точность
Источник данных, используемый в этом проекте, можно найти по этой ссылке.
Дорожную карту проектов НЛП можно скачать по этой ссылке.
Следующим шагом будет испачкать руки, играя с кошкой. Нет, я имею в виду кодирование. Удачи.