Используя фреймворк машинного обучения Python scikit-learn, мы построили модель классификации и провели анализ тональности информации о комментариях на китайском языке. Он также представит метод обработки китайских стоп-слов.
путать
Несколько дней назад я получил сообщение от читателя на фоне WeChat.
Я был немного ошарашен — почему это до сих пор востребовано?
Но потом я пришел в себя, как будто раньше яму выкопал.
Я ранее писал "Как извлечь темы из массивного текста с помощью Python?», который содержит этот абзац:
Ради наглядности мы опустили здесь многие детали. Многие материалы используют предустановленные параметры по умолчанию и полностью игнорируют установку стоп-слов китайского языка, поэтому в результатах будут появляться такие стоп-слова, как «это», «если», «может быть» и «есть». Впрочем, это не имеет значения, завершенность гораздо важнее совершенства. Зная проблему, ее легко исправить позже.Когда у меня будет возможность, я напишу статью о том, как добавить ссылку для удаления китайских стоп-слов.
По правилу "выкопай себе яму и сам насыпь" я решил написать эту часть.
Я могу использовать ленивый способ.
Например, в исходном учебнике обновите часть обработки текста остановки китайского языка и внесите исправление.
Однако недавно я обнаружил, что в наших руководствах никогда не рассказывалось, как проводить анализ настроений с помощью машинного обучения.
Вы могли бы сказать, не так ли?
Разве не обсуждается анализ настроений? Сэр, вы, кажется, сказалиКак сделать анализ настроений с помощью Python?", "Как использовать Python для визуализации временных рядов общественного мнения?"и"Как провести анализ настроений в сюжетной линии «Игры престолов» с помощью Python и R?".
Ты так хорошо это помнишь, сделай комплимент.
Однако обратите внимание, что в этих предыдущих статьях методы машинного обучения не использовались. Мы просто вызываем инструмент анализа тональности текста, предоставленный третьей стороной.
Но вот проблема: эти сторонние инструменты обучены на других наборах данных и могут не подойти для вашего сценария приложения.
Например, некоторые инструменты анализа тональности больше подходят для анализа новостей, а некоторые лучше подходят для обработки данных Weibo. Вы приносите, но хотите проанализировать информацию отзывов магазина.
Это как веб-браузер в вашем собственном ноутбуке и веб-браузер в электронном читальном зале библиотеки, которые могут быть одного типа и версии. Но когда вы используете свой собственный браузер, это удобнее и эффективнее, чем общедоступный компьютер, потому что вы настроили «закладки», «хранение паролей» и «прочитать позже» в своем браузере в соответствии с вашими предпочтениями.
В этой статье мы расскажем вам, как использовать Python и машинное обучение для самостоятельного обучения модели и проведения классификации настроений для данных китайских комментариев.
# данные
Один из моих студентов использовал сканер для сканирования десятков тысяч данных отзывов о ресторанах на веб-сайте Dianping.
Когда эти данные сканируются, они содержат расширенные типы метаданных.
Я извлек из него текст обзора и звезды (1-5 звезд) для демонстрации этой статьи.
На основании этих данных мы случайным образом отобрали 500 обзоров с оценками 1, 2, 4 и 5. Всего 2000.
Почему нет возможности просто отказаться от 3-звездочного рейтинга?
Вы думаете 10 секунд, затем смотрите вниз и проверяете свой ответ.
Ответ таков:
Поскольку мы хотим провести только бинарную классификацию (положительных и отрицательных) эмоций, 4 и 5 звезд можно считать положительными эмоциями, 1 и 2 — отрицательными эмоциями... Как считается 3?
Поэтому, чтобы избежать путаницы, вызванной этой нечеткой границей, нам пришлось отказаться от контента, отмеченного 3 звездочками.
После сортировки данных комментария, как показано на рисунке ниже.
Я поместил данные в zip-файл демонстрационной папки. Следующий текст предоставит вам путь загрузки.
Модель
При использовании машинного обучения вы сталкиваетесь с проблемой выбора модели.
Например, для решения задач классификации можно использовать множество моделей. Логистическая регрессия, дерево решений, SVM, наивный байесовский подход... Какой из них мы должны использовать конкретно для нашей задачи классификации информационных настроений в комментариях?
К счастью, набор инструментов для машинного обучения scikit-learn на Python не только предоставляет нам удобный интерфейс для вызова, но и помогает нам очень близко составить шпаргалку.
На первый взгляд сложная и очень запутанная, эта диаграмма на самом деле является хорошим путеводителем по лабиринту. Зеленые прямоугольники — это различные модели машинного обучения. А синий круг — это место, где вы делаете выводы.
Видите ли, мы имеем дело с категориями, верно?
Глядя вниз, вам будет предложено определить, отмечены данные или нет. У нас есть.
Продолжайте снижаться, объем данных меньше 100 000?
Учтите, в наших данных 2000, что меньше этого порога.
Следующий вопрос: текстовые ли это данные? да.
Итак, путь подходит к концу.
Scikit-learn говорит нам: используйте наивную байесовскую модель.
Все шпаргалки созданы для удовлетворения потребностей пользователей Вы должны ожидать качества scikit-learn, верно? Если вам нужно использовать классические модели машинного обучения (вы можете понять все модели, кроме глубокого обучения), я рекомендую вам сначала попробовать scikit-learn.
векторизация
"Как извлечь темы из массивного текста с помощью Python?«В статье мы говорили о векторизации в обработке естественного языка.
забывать?
Ничего страшного.
Мастер сказал:
Интересно ли учиться и учиться время от времени?
Давайте рассмотрим это здесь.
Основная причина векторизации текста на естественном языке заключается в том, что компьютерне могу читатьестественный язык.
Компьютеры, как следует из названия, предназначены для подсчета. Текст не имеет для него реального значения (по крайней мере, по сей день).
Однако обработка естественного языка является важной проблемой, и она также нуждается в поддержке автоматизации. Поэтому люди должны найти способ заставить машину как можно лучше понимать и представлять человеческий язык.
Если здесь два предложения:
I love the game.
I hate the game.
Тогда мы можем просто и грубо извлечь следующие признаки (на самом деле перечислены все слова):
- I
- love
- hate
- the
- game
Для каждого предложения подсчитайте количество вхождений признаков отдельно. Таким образом, приведенные выше два предложения преобразуются в следующую таблицу:
В соответствии с единицей предложения прочитайте числа слева направо.Первое предложение выражается как [1, 1, 0, 1, 1], а второе предложение становится [1, 0, 1, 1, 1].
Это называется векторизацией.
В этом примере количество объектов называется измерением. Таким образом, два предложения после векторизации имеют 5 измерений.
Вы должны помнить, что в это время машина еще не может понять конкретное значение двух предложений. Но он попытался выразить их осмысленным образом.
Обратите внимание, что мы используем так называемую модель «мешка слов».
Следующая картинка (из ~https://goo.gl/2jJ9Kp~) наглядно демонстрирует значение этой модели.
Вы можете спросить: «Разве это не очень неточно? Не лучше ли было бы принять во внимание порядок и контекст?»
Правильно, чем более продуманно вы подходите к порядку и структуре текста, тем больше информации может получить ваша модель.
Однако все имеет свою цену. Имея только базовые знания о перестановках и комбинациях, вы можете вычислить разницу в размерности модели между рассмотрением слов по отдельности и рассмотрением n последовательных слов (называемых n-граммами).
Для простоты давайте воспользуемся набором слов. Я расскажу вам больше, когда у меня будет время...
Стоп, больше не копать.
китайский язык
В предыдущем разделе мы представили общие принципы векторизации естественного языка.
С китайцами сложнее.
Поскольку он отличается от английского, французского и других алфавитов на основе латиницы, китайский, естественно,нетПробелы действуют как разделители между словами.
Нам нужно сначала разделить китайский язык на слова, соединенные пробелами.
Например поставить:
"Я люблю эту игру"
стать:
"Я люблю эту игру"
Таким образом, векторизацию китайского языка можно выполнить, имитируя векторизацию английских предложений.
Вы можете быть обеспокоены тем, что компьютер обрабатывает китайские слова не так, как английские слова.
Это беспокойство излишне.
Потому что, как мы уже говорили, компьютеры не понимают даже английских слов.
В его глазах, какой бы ни была лексика естественного языка, это всего лишь определенная комбинация строк. Независимо от того, имеете ли вы дело с китайским или английским языком, словарный запас, с которым необходимо иметь дело, называется стоп-словами.
В китайской Википедии стоп-слова определяются следующим образом:
При информационном поиске, в целях экономии места для хранения и повышения эффективности поиска, определенные слова или слова автоматически отфильтровываются до или после обработки данных естественного языка (или текста).Эти слова или слова называются Stop Words (стоп-слова).
Мы занимаемся не поиском информации, а классификацией текста.
Для нас слова, которые вы не собираетесь использовать в качестве характеристик, могут использоваться в качестве стоп-слов.
Или возьмем только что английский пример, следующие два предложения:
I love the game.
I hate the game.
Подскажите, какие стоп-слова?
Интуиция подскажет вам, что определенный артикль должен быть.
Да, это служебное слово и не имеет особого значения.
Там, где он появляется, все это означает одно и то же.
Многократное появление определенного артикля в тексте является нормальным явлением. Сочетание его со словами, содержащими больше информации (например, любовь, ненависть), может легко помешать нашему пониманию характеристик текста.
Поэтому мы относимся к нему как к стоп-слову и удаляем его из функции.
Таким образом, вы найдете китайские предложения после слова «сегментация»:
"Я люблю эту игру"
«Это» должно быть стоп-словом, верно?
бинго!
Что делать со стоп-словами, как это сделать? Конечно, вы можете найти их по одному вручную, но это явно слишком неэффективно.
Некоторые организации или группы имеют дело со многими стоп-словами. Они обнаружат, что в определенном языке стоп-слова являются регулярными.
Они обобщают общие стоп-слова и объединяют их в таблицу. В дальнейшем вам нужно будет только проверить форму и сделать обработку, вы можете использовать предыдущий опыт и знания для повышения эффективности и экономии времени.
В scikit-learn встроены английские стоп-слова. Просто укажите язык как английский, и машина поможет вам обработать их автоматически.
Но китайский...
Вероятно, в команде разработчиков scikit-learn недостаточно носителей китайского языка.
Хорошей новостью является то, что вы можете использовать списки стоп-слов, предоставленные третьими лицами.
Где я могу скачать этот список стоп-слов?
я нашел это для васпроект на гитхабе, который содержит 4 списка стоп-слов от авторитетных подразделений по обработке естественного языка, таких как Харбинский технологический институт, Сычуаньский университет и Baidu.
Длина файлов этих списков стоп-слов различна, и содержимое также сильно различается. Для удобства и последовательности демонстрации давайте сначала воспользуемся списком стоп-слов Харбинского технологического института.
Я сохранил его в zip-архиве демонстрационного каталога, чтобы вы могли его загрузить. # окружение пожалуйста, приди первымэтот URLЗагрузите zip-архив, прилагаемый к этому руководству.
После загрузки и распаковки вы увидите следующие 4 файла в сгенерированном каталоге.
В дальнейшем мы будем называть этот каталог «демонстрационным каталогом».
Обязательно запомните его местонахождение.
Самый простой способ установить Python — это установить пакет Anaconda.
пожалуйста, перейдите кэтот URLЗагрузите последнюю версию Анаконды.
Пожалуйста, выберите Python слева3.6скачать версию и установить.
Если вам нужно конкретное пошаговое руководство или вы хотите узнать, как установить и запустить команды Anaconda на платформе Windows, обратитесь к тому, что я подготовил для вас.видеоурок.
Откройте терминал и введите команду cdдемонстрационный каталог. Если вы не знаете, как его использовать, вы также можете обратиться квидеоурок. Нам нужно использовать много пакетов. Если каждый из них установлен вручную, это будет очень хлопотно.
Я сделал для вас конфигурационный файл для виртуальной среды с именем environment.yaml, который также находится в каталоге demo.
Сначала выполните следующую команду:
conda env create -f environment.yaml
Таким образом, необходимые пакеты устанавливаются за один раз.
После выполнения
source activate datapy3
в эту виртуальную среду.
Обязательно выполните следующее предложение:
python -m ipykernel установить --user --name=datapy3
Только тогда текущая среда Python будет зарегистрирована в системе как ядро. Убедитесь, что Google Chrome установлен на вашем компьютере. Если не установлено, перейдите сюдаскачатьУстановить.
После этого в каталоге demo выполняем:
jupyter notebook
Google Chrome откроет и запустит интерфейс ноутбука Jupyter:
Вы можете напрямую щелкнуть файл demo.ipynb в списке файлов, чтобы увидеть весь пример кода этого руководства.
Вы можете выполнять эти коды один за другим во время просмотра руководства.
но япредположениеМетод заключается в том, чтобы вернуться к основному интерфейсу и создать новый пустой блокнот Python 3 (тот, который имеет отображаемое имя datapy3).
Пожалуйста, следуйте инструкциям и введите соответствующий контент посимвольно. Это может помочь вам глубже понять смысл кода и более эффективно усвоить навыки.
Подготовка окончена, приступим к формальному вводу кода.
код
Читаем в инструменте обработки фрейма данных pandas.
import pandas as pd
Используйте функцию чтения csv pandas для чтения данных.
Обратите внимание, что для совместимости с настройками Excel и системной среды кодировка CSV-файла данных — GB18030. Это нужно указать здесь явно, иначе будет сообщено об ошибке.
df = pd.read_csv('data.csv', encoding='gb18030')
Посмотрим, правильно ли прочитано.
df.head()
Первые 5 строк выглядят следующим образом:
Взгляните на общую форму фрейма данных:
df.shape
(2000, 2)
Наши данные имеют в общей сложности 2000 строк и 2 столбца. Читать полностью.
Мы не собираемся делить результаты анализа настроений на 4 категории. Мы собираемся разделить только на положительные и отрицательные стороны.
Здесь мы используем анонимную функцию для обработки числа оценок > 3 как положительного настроения со значением 1, в противном случае — как отрицательного настроения со значением 0.
def make_label(df):
df["sentiment"] = df["star"].apply(lambda x: 1 if x>3 else 0)
После программирования функции мы запускаем ее на фрейме данных.
make_label(df)
Проверьте результаты:
df.head()
Из первых 5 строк значение тональности преобразуется из количества звезд в соответствии с установленными нами правилами.
Ниже мы разбираем характеристики и этикетки.
X = df[['comment']]
y = df.sentiment
X — это все наши возможности. Поскольку мы судим о настроении только по тексту, X на самом деле имеет только 1 столбец.
X.shape
(2000, 1)
И y - соответствующие данные метки. Это также только 1 столбец.
y.shape
(2000,)
Давайте посмотрим на первые несколько строк данных для X.
X.head()
Обратите внимание, что данные комментариев здесь по-прежнему являются исходной информацией. Слова не разделены.
Чтобы выполнить векторизацию признаков, давайте воспользуемся инструментом сегментации заикающихся слов, чтобы разбить предложения на слова.
import jieba
Мы создаем вспомогательную функцию, которая объединяет результаты сегментации заикающихся слов с пробелами.
Таким образом, результат сегментации слов похож на английское предложение, которое разделено пробелами между отдельными временами.
def chinese_word_cut(mytext):
return " ".join(jieba.cut(mytext))
С помощью этой функции мы можем использовать команду применения для сегментации каждой строки данных комментария.
X['cutted_comment'] = X.comment.apply(chinese_word_cut)
Давайте посмотрим на эффект после сегментации слова:
X.cutted_comment[:5]
И слова, и знаки препинания разделяются пробелами, что соответствует нашим требованиям.
Вот общие шаги машинного обучения: нам нужно разделить данные на обучающую и тестовую выборки.
Зачем разделять набор данных?
существует"Занимать или не брать: как использовать Python и машинное обучение, чтобы решить?"В статье я объяснил это, вот обзор:
Если учитель дает вам набор вопросов и ответов перед выпускным экзаменом, вы запоминаете его. Затем при прохождении теста из набора тестовых вопросов выбирается только часть тестового вопроса. Вы получили 100 баллов за вашу сверхчеловеческую память. Усвоили ли вы знания этого курса? Интересно, сделали бы вы это, если бы вам дали новую тему? Ответ пока неизвестен. Поэтому экзаменационные вопросы должны отличаться от контрольных вопросов.
Точно так же, если предположить, что наша модель обучается только на определенном наборе данных, точность очень высока, но она никогда не видела других новых данных, так как же она работает с новыми данными?
Ты понятия не имеешь, не так ли?
Поэтому нам нужно разделить набор данных и тренироваться только на тренировочном наборе. Тестовый набор зарезервирован и используется в качестве экзаменационного вопроса, чтобы увидеть эффект классификации модели после обучения.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
Здесь мы устанавливаемrandom_state
Ценность заключается в том, чтобы гарантировать, что значение случайного числа согласовано в различных средах, чтобы проверить фактический эффект нашей модели.
Посмотрим на это времяX_train
Форма набора данных.
X_train.shape
(1500, 2)
Видимый, в режиме по умолчанию,train_test_split
Функция делит обучающую и тестовую выборки в соотношении 3:1.
Давайте рассмотрим другие 3 набора, чтобы увидеть:
y_train.shape
(1500,)
X_test.shape
(500, 2)
y_test.shape
(500,)
То же самое справедливо.
Далее мы будем иметь дело с китайскими стоп-словами.
Мы пишем функцию для сохранения и возврата стоп-слов в виде списка из китайского списка стоп-слов:
def get_custom_stopwords(stop_words_file):
with open(stop_words_file) as f:
stopwords = f.read()
stopwords_list = stopwords.split('\n')
custom_stopwords_list = [i for i in stopwords_list]
return custom_stopwords_list
Список стоп-слов, который мы указываем для использования, — это файл списка стоп-слов Харбинского технологического института, который мы загрузили и сохранили.
stop_words_file = "stopwordsHIT.txt"
stopwords = get_custom_stopwords(stop_words_file)
Взгляните на последние 10 пунктов в нашем списке стоп-слов:
stopwords[-10:]
Большинство из них являются модальными частицами, которые удаляются как стоп-слова и не влияют на основной смысл предложения.
Далее мы попробуем векторизовать китайские предложения после сегментации слов.
мы читаем вCountVectorizer
Инструмент векторизации, который преобразует векторы в соответствии с частотой появления слов.
from sklearn.feature_extraction.text import CountVectorizer
мы строимCountVectorizer()
Экземпляр с именем vect.
Обратите внимание здесь, чтобы проиллюстрировать роль стоп-слов. Сначала мы создаем вектор с параметрами по умолчанию.
vect = CountVectorizer()
Затем мы используем инструмент векторизации, чтобы преобразовать предложения сегментированного обучающего набора и преобразовать его во фрейм данных с именемterm_matrix
.
term_matrix = pd.DataFrame(vect.fit_transform(X_train.cutted_comment).toarray(), columns=vect.get_feature_names())
Посмотримterm_matrix
Первые 5 строк:
term_matrix.head()
Мы заметили, что есть много видов характерных слов, особенно много цифр здесь ставится в качестве признаков.
term_matrix
Форма выглядит следующим образом:
term_matrix.shape
(1500, 7305)
Количество строк правильное, количество столбцов соответствует количеству признаков, их 7305.
Проверим, с добавлением функции удаления стоп-слов, как изменится результат преобразования вектора признаков.
vect = CountVectorizer(stop_words=frozenset(stopwords))
Следующее утверждение такое же, как и раньше:
term_matrix = pd.DataFrame(vect.fit_transform(X_train.cutted_comment).toarray(), columns=vect.get_feature_names())
term_matrix.head()
Видно, что количество функций в это время сократилось с 7305 до 7144. Мы не настраивали никакие другие параметры, поэтому сокращенные 161 признак были словами, которые появились в списке стоп-слов.
Тем не менее, такой способ написания списка стоп-слов все равно пропустит много рыбы, проскользнувшей через сеть.
Во-первых, это куча заметных цифр спереди. Они не имеют здесь никакого смысла как функции. Числа бессмысленны без единиц измерения, без контекста.
Поэтому нам нужно установить, что числа не могут использоваться в качестве признаков.
В Python мы можем установитьtoken_pattern
для достижения этой цели.
Эта часть требует знания регулярных выражений, и мы не можем здесь ее подробно описывать.
Но если вам просто нужно избавиться от чисел как признаков, напишите так, и все будет в порядке.
Другая проблема заключается в том, что мы видим, что эта матрица на самом деле является очень разреженной матрицей, большая часть которой равна 0.
Это нормально и нормально.
Ведь большинство комментариев содержат от нескольких до десятков слов. Очевидно, что с более чем 7000 функциями одно заявление не может их охватить.
Однако некоторые слова как признаки стоит отметить.
Во-первых, это слишком общие слова. Несмотря на то, что мы используем список стоп-слов, почти в каждом комментарии неизбежно встречаются слова. Что такое функция? Характеристика – это атрибут, который отличает вещь от других вещей.
Предположим, вас попросили описать самого впечатляющего человека, которого вы встретили сегодня. Как бы вы это описали?
Я видел, как он, одетый как клоун, ходил на ходулях по оживленной торговой улице, бросал мячи на ходу и приветствовал прохожих.
все еще……
Я увидел, что у него два глаза и нос.
Последнее определенно не является хорошей характеристикой, потому что трудно отличить людей, которых вы описываете.
Крайности сходятся, и те слова, которые слишком особенные, не следует хранить. Потому что после того, как вы поймете эту функцию, вашей модели будет почти бесполезно обрабатывать новые суждения о тональности предложения.
Как будто ты научился убивать драконов у бессмертного, но никогда в жизни не видел дракона...
Поэтому, как показано в следующих двух фрагментах кода, мы настроили в общей сложности 3 уровня фильтрации словаря функций.
max_df = 0.8 # 在超过这一比例的文档中出现的关键词(过于平凡),去除掉。
min_df = 3 # 在低于这一数量的文档中出现的关键词(过于独特),去除掉。
vect = CountVectorizer(max_df = max_df,
min_df = min_df,
token_pattern=u'(?u)\\b[^\\d\\W]\\w+\\b',
stop_words=frozenset(stopwords))
В это время снова запустите наше предыдущее выражение, чтобы увидеть эффект.
term_matrix = pd.DataFrame(vect.fit_transform(X_train.cutted_comment).toarray(), columns=vect.get_feature_names())
term_matrix.head()
Как видите, все эти цифры исчезли. Количество функций изменилось с 7144 после метода единого словаря для удаления стоп-слов до 1864.
Вы можете подумать, что это жалко, не так ли? Слова, которые так легко различить, просто выбросить?
Вы знаете, многие функции не обязательно хороши.
Особенно, когда много шума смешано, это может значительно повлиять на производительность вашей модели.
Что ж, обучающий набор данных комментариев был векторизован. Далее мы будем использовать сгенерированную матрицу признаков для обучения модели.
В нашей модели классификации используется многочленный наивный байесовский метод.
from sklearn.naive_bayes import MultinomialNB
nb = MultinomialNB()
Обратите внимание, что наш поток обработки данных выглядит следующим образом:
- векторизация признаков;
- Наивная байесовская классификация.
Если нам нужно перезапускать так много функций каждый раз, когда мы изменяем параметр или переключаемся на набор тестов, это определенно будет неэффективно и раздражает. И пока это сложно, вероятность ошибки увеличивается.
К счастью, Scikit-learn предоставляет нам функцию, называемую конвейером, которая может легко решить эту проблему.
Это может помочь нам связать эти последовательные задания, скрыть в них функциональные последовательные ассоциации и сделать единственный вызов извне, чтобы завершить всю работу по последовательному определению.
Он очень прост в использовании, мы объединяем vect и nb, называемые pipe.
from sklearn.pipeline import make_pipeline
pipe = make_pipeline(vect, nb)
Посмотрите, какие шаги все это включает:
pipe.steps
Послушайте, работа, которую мы только что проделали, находится в стадии разработки. Мы можем назвать конвейер моделью в целом.
Следующая строка оператора может вводить содержимое обучающего набора без векторизации признаков, выполнять перекрестную проверку и вычислять среднее значение точности классификации модели.
from sklearn.cross_validation import cross_val_score
cross_val_score(pipe, X_train.cutted_comment, y_train, cv=5, scoring='accuracy').mean()
Насколько точна наша модель во время обучения?
0.820687244673089
Этот результат по-прежнему хорош.
Напомним, что на общее положительное и отрицательное настроение приходилось по половине набора данных.
Если мы построим «фиктивную модель», то есть все комментарии расценим как положительные (или отрицательные) эмоции, каков будет показатель точности?
Да, 50%.
Точность текущей модели намного превышает это значение. Превышение более 30% на самом деле является уверенностью, которую информация комментария вносит в модель.
Но не забывайте, мы не можем просто говорить о тренировочном наборе, верно? Давайте протестируем модель.
Мы используем тренировочный набор, чтобы подогнать модель.
pipe.fit(X_train.cutted_comment, y_train)
Затем на тестовом наборе мы делаем прогнозы по токенам классификации настроений.
pipe.predict(X_test.cutted_comment)
Вы ослеплены этой длинной последовательностью нулей и единиц?
Это не имеет значения, scikit-learn предоставляет нам множество инструментов для измерения производительности моделей.
Сначала мы сохраняем результаты прогнозирования вy_pred
.
y_pred = pipe.predict(X_test.cutted_comment)
Ознакомьтесь с набором инструментов измерения scikit-learn.
from sklearn import metrics
Давайте сначала посмотрим на точность теста:
metrics.accuracy_score(y_test, y_pred)
0.86
Этот результат вас удивил? Да, модель обладает такой высокой точностью классификации настроений перед лицом невидимых данных.
Для задач классификации недостаточно просто взглянуть на показатель точности, давайте взглянем на матрицу путаницы.
metrics.confusion_matrix(y_test, y_pred)
array([[194, 43],
[ 27, 236]])
4 числа в матрице путаницы представляют:
- ТП: Первоначально он был положительным, и предсказание тоже было положительным;
- ФП: Первоначально он был отрицательным, но прогноз был положительным;
- FN: изначально положительный, прогноз отрицательный;
- ТН: Изначально он был отрицательным, и прогноз тоже был отрицательным.
Следующая картинка (из https://goo.gl/5cYGZd) должна дать вам более четкое представление о том, что означает матрица путаницы:
На этом этапе вы, вероятно, можете понять производительность нашей модели.
Но мы не можем просто сравнить модель, которую мы обучили, с безмозглой «тупой моделью», верно? Это тоже несправедливо!
Затем мы вызываем нашего старого друга SnowNLP для сравнения.
Если вы забыли его, пожалуйста, пересмотритеКак сделать анализ настроений с помощью Python?》
from snownlp import SnowNLP
def get_sentiment(text):
return SnowNLP(text).sentiments
Мы используем тестовый набор, чтобы прокомментировать исходные данные, позволить SnowNLP снова запустить его и получить результаты.
y_pred_snownlp = X_test.comment.apply(get_sentiment)
Обратите внимание, что здесь есть небольшая проблема. Результатом, сгенерированным SnowNLP, является не 0 и 1, а десятичная дробь между 0 и 1. Поэтому нам нужно сделать одношаговое преобразование, рассматривая результаты выше 0,5 как положительные, а остальные как отрицательные.
y_pred_snownlp_normalized = y_pred_snownlp.apply(lambda x: 1 if x>0.5 else 0)
Взгляните на преобразованные 5 лучших прогнозов SnowNLP:
y_pred_snownlp_normalized[:5]
Что ж, он соответствует нашим требованиям.
Давайте сначала посмотрим на точность классификации модели:
metrics.accuracy_score(y_test, y_pred_snownlp_normalized)
0.77
Напротив, точность классификации нашего тестового набора составляет 0,86.
Давайте снова посмотрим на матрицу путаницы.
metrics.confusion_matrix(y_test, y_pred_snownlp_normalized)
array([[189, 48],
[ 67, 196]])
В результате сравнения и на TP, и на TN количество правильных суждений по нашей модели превышает SnowNLP.
резюме
Напомним, что в этой статье представлены следующие точки знаний:
- Как использовать модель мешка слов для векторизации предложений на естественном языке для формирования матрицы признаков;
- Как использовать список стоп-слов, порог частоты слов и шаблон токена для удаления нежелательных псевдотематических слов и уменьшения сложности модели.
- Как выбрать подходящую модель классификации машинного обучения для классификации матрицы признаков слова;
- Как объединить и упростить процесс шагов машинного обучения с помощью шаблона конвейера;
- Как выбрать подходящий инструмент измерения производительности для оценки и сравнения производительности моделей.
Надеемся, что это содержание поможет вам более эффективно справиться с классификацией тональности китайского текста.
обсуждать
Вы когда-нибудь делали проект по классификации настроений китайцев с помощью машинного обучения? Как вы убрали стоп-слова? Какую модель классификации вы используете? Как насчет полученной точности? Добро пожаловать, чтобы оставить сообщение, поделиться своим опытом и мыслями со всеми, мы обменяемся и обсудим вместе.
Лайк пожалуйста лайк. Вы также можете подписаться на мой публичный аккаунт в WeChat и закрепить его."Юшу Жилан" (nkwangshyi).
Если вы интересуетесь наукой о данных, вы можете прочитать мою серию постов с учебными указателями "Как эффективно начать работу с наукой о данных?", есть более интересные задачи и решения.