Анализ эмоциональной окраски текста в социальных сетях на основе методов машинного обучения
Обзор предметной области анализа тональности. Анализ и описание существующих подходов к анализу тональности текстов. Исследование особенностей текстовых сообщений в социальных сетях, которые необходимо учитывать при разработке методов анализа текстов.
Рубрика | Экономика и экономическая теория |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 23.09.2018 |
Размер файла | 1,7 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
· Удаление знаков препинания и других символов.
Символьные знаки, имеющиеся в тексте сообщений, никак не влияют на их дальнейший анализ из-за отсутствия информативности, поэтому их наличие обязательно приведёт к образованию неэффективных признаков;
· Удаление цифр
Цифры, как и знаки препинания, также не несут в себе смысла в контексте анализа тональности и должны быть удалены;
· Удаление букв в словах, которые повторяются более двух раз.
Зачастую авторы сообщений используют повторяющиеся буквы в слова, например, «I'm so haaaaappyyyyyyyyyyy!», с целью акцентировать внимание читателей на этом слове и показать экспрессивность выражения. Это порождает огромное множество слов с одинаковым значением, что усложняет анализ и значительно увеличивает размерность признакового пространства. По этой причине в каждом слове следует удалить буквы, повторяющиеся три раза или более, и оставить вместо них две буквы. Так, приведённый пример возможного твита превратится из «I'm so haaaaappyyyyyyyyyyy!» в «I'm so haappyy!»;
· Лемматизация.
«Лемматизация - процесс приведения словоформы к лемме - её нормальной (словарной) форме». Процесс лемматизации заключается в поиске нормальной формы слова в словаре: если она найдена, то исходное слово заменяется его леммой. Её применение положительно сказывается на точности классификации, так как признаки, извлечённые из коллекции после лемматизации, становятся более информативными. Также это сильно сокращает признаковое пространство и, как следствие, снижает эффект переобучения модели и время её обучения. Ниже приведены примеры слов до лемматизации и после:
· are be
· better good
· walking walk
· beautifully beauty
· uncertainly certain
Главная проблема лемматизации - необходимость наличия словаря, в котором содержатся леммы и их производные формы. Согласно [17], «… Для языков с простой морфологией наподобие английского размеры таблиц небольшие, но для сильно флективных языков (например, турецкого) таблица может иметь сотни возможных флективных форм для каждого корня». Однако это является серьёзной проблемой в контексте данной работы, так как слова с грамматическими ошибками, сленги и подобные слова могут не присутствовать в словаре лемм. Также серьёзной проблемой является необходимость указывать часть речи слова при его лемматизации: от части речи слова сильно зависит результат поиска его леммы. Для решения этой проблемы требуется решить задачу не менее сложную, чем поставленная в данной работе цель - создать словарь, содержащий кортежи вида (word part of the speech), иначе применение лемматизации в контексте данной задачи не имеет смысла.
· Стемминг.
«Стемминг -- это процесс нахождения основы слова для заданного исходного слова. Основа слова не обязательно совпадает с морфологическим корнем слова». Разница между процессами стемминга и лемматизации заключается в том, что стемминг направлен на получение корневой формы слов, тогда как лемматизация подразумевает замену исходного слова на её словарную форму. Простой вид стемминга основан на поиске корневой формы слова в специальном словаре, что делает этот процесс практически идентичным лемматизации. Остальные виды стемминга заключаются в выполнении последовательности заранее построенных правил по обработке слова. Двумя самыми известными и применяемыми на практике видами стемминга являются алгоритм Портера и алгоритм Ланкастера. Алгоритм стемминга Портера - «алгоритм стемминга, опубликованный Мартином Портером в 1980 году. Оригинальная версия стеммера была предназначена для английского языка и была написана на языке BCPL. Впоследствии Мартин создал проект «Snowball» и, используя основную идею алгоритма, написал стеммеры для распространённых индоевропейских языков, в том числе для русского». Помимо создания стеммеров для других языков, Портер улучшил алгоритм и для английского языка, добавив к нему несколько правил, которые грамотно обрабатывают слова из трёх букв и некоторые группы слов-исключений. По этой причине на сегодняшний день самым популярным алгоритмом стемминга является не оригинал, а именно обновленная версия, которая имеет название, созвучное проекту Портера - «Snowball stemmer». Алгоритм состоит из 5 основных фаз по сокращению слова, которые применяются последовательно. В каждой фазе существуют различные соглашения для выбора правила из группы правил применительно к конкретному слову, например, выбор правила, которое применяется к самому длинному суффиксу в слове. Подробное описание работы алгоритма в данной работе является излишним, однако в книге, написанной исследователями Кембриджского университета, есть качественное краткое описание основных правил данного алгоритма. Например, в первой фазе измеряется длина слова и проверяется наличие в слове суффиксов SSES, IES, SS, S. В случае обнаружения одного из перечисленных суффиксов применяется преобразование, соответствующее суффиксу. Ниже представлены примеры правил, применяемых на первой стадии.
Таблица 1. Правила приведения слов к их корневой форме, стемминг
· Rule |
· Example |
|
· SSES SS |
· caresses caress |
|
· IES I |
· ponies poni |
|
· SS SS |
· caress caress |
|
o S _ |
· cats cat |
Большинство правил более поздних стадий использует концепцию измерения слова, то есть на каждом шаге проверяется количество оставшихся слогов в слове, чтобы быть уверенным, что на каждом шаге правила по урезанию применяются именно к суффиксам, а не к корню слова. Ниже представлен пример такого правила:
(m > 1): EMENT _, m - длина слова без учёта указанной последовательности букв. |
Применяя это правило, слово replacement превратится в replac, а слово cement останется неизменным.
Алгоритм стемминга Ланкастера (англ. Lancaster stemming) был создан в конце 1980-ых учёными Ланкастерского университета Chris Paise и Gareth Tusk, поэтому часто в научной литературе этот алгоритм называют «Paice/Husk stemmer». Данный вид стеммера использует отдельный файл правил, который при запуске алгоритма сначала считывается в словарь. Этот файл разделен на ряд разделов, каждый из которых соответствует букве алфавита. Раздел для конкретной буквы, например «е», содержит правила для всех окончаний слов, заканчивающихся на букву «е», причем разделы упорядочены по алфавиту. Алгоритм действия стеммера следующий:
1. Выделяется последняя буква в слове
2. Происходит поиск в наборе правил, индекс которого - выделенная буква
3. Выбирается правило, которое по условию подходит к данному слову, начиная с первого
4. Если не найдено, то слово меняется, и стеммер заканчивает работу.
5. Если правило найдено, то оно выполняется.
Эти шаги повторяются если:
· в словаре остаются подходящих для слова правил,
· длина слова без анализируемой части больше определённой,
· в слове без анализируемой части есть гласная буква.
При нарушении хотя бы одного из правил стеммер завершает работу.
Этот стеммер считается «агрессивным», так как зачастую он обрезает слово настолько, что оно перестаёт иметь смысл даже для человека.
Все описанные техники, кроме последних двух, будут применены в практической части данной работы. Проблема последних двух техник заключается в том, что применять их вместе бессмысленно, так как они выполняют очень похожую работу: приводят слова к их базовым формам таким образом, чтобы одинаковые слова в разных формах имели один и тот же вид. Поэтому в дальнейшей работе будет реализован алгоритм стемминга. Он был выбран по следующим причинам:
· Стемминг приводит слова к их базовой форме более «агрессивно», чем лемматизация. Это может негативно повлиять на качество классификатора, однако в контексте анализа тональности текстов из социальных сетей это влияние будет абсолютно незначительным: из-за наличия сленга, грамматических ошибок и подобных факторов лемматизация будет менее эффективна, и её результат не будет сильно отличаться от стемминга;
· Более «агрессивное» усечение слов методом стемминга приведёт к уменьшению признакового пространства, что снизит эффект переобучения и время обучения классификаторов
· Качественная лемматизация возможна только при наличии коллекции текстов, где слова размечены по их частям речи. Однако задача разметки слов в коллекции по частям речи является не менее сложной, чем поставленная в данной работе цель. При отсутствии разметки, лемматизатор априори считает каждое слово существительным, что приводит к низкокачественной обработке текста. Например, при отсутствии разметки слов по частям речи, стемминг превратит слово «loving» в «love», тогда как лемматизатор оставит это слово неизменным. То же самое произойдёт с большинством слов, которые не являются существительными, так как лемматизатор не будет знать, как их обрабатывать.
Из двух описанных алгоритмов стемминга был выбран алгоритм Портера, так как он проводит «урезание» слов более мягко, нежели алгоритм Ланкастера. Это позволит не потерять важную информацию из исходного текста и, тем самым, сделает извлечённые из коллекции признаки более информативными.
2.5 Векторизация коллекции текстов
После обработки необходимо приступить к их векторизации. Далее будут описаны основные эффективные техники извлечения признаков из текстовых данных.
1. Мешок слов.
Самым базовым и, одновременно, эффективным является метод мешка слов (англ. Bag of words). Согласно работе исследователей НИЯУ МИФИ, «суть мешка слов заключается в кодировании всех слов выборки в единый словарь и создания пространства порядковых переменных, каждое измерение в котором отражает количество раз, какое слово с данным индексом встретилось в документе:
где - множество слов в объекте , - количество объектов в коллекции. Размерность признакового пространства при этом становится равной количеству уникальных слов во всей выборке, а матрица признаков становится сильно разреженной». Разреженной матрицей называется матрица, основная часть элементов которой является нулями. Для работы с таким видом матриц обычно используют методы понижения размерности, которые создают множество новых информативных признаков меньшего размера, либо используют модели, которые тратят мало времени на обучение, например, линейные.
Мешок слов довольно качественно описывает каждое предложение, однако этот метод не учитывает последовательность слов в тексте, то есть каждое слово рассматривается отдельно. Это приводит к потере информации о тексте, так как значение слова можно однозначно определить лишь в контексте.
Необходимо отметить, что признаки, получившиеся из слов, которые встечались во всей коллекции не более 10 раз, являются практически неинформативными. По этой причине такие признаки нужно удалить. Это поспособствует понижению риска переобучения модели и увеличит скорость её обучения.
2. N-grams.
N-граммы (англ. N-gramms) - это имеющиеся в коллекции уникальные словосочетания, где N - количество слов в словосочетании. В частности, словосочетания, состоящие из одного слова, называются униграммами, из двух - биграммами, из трёх - триграммами, и так далее. N-грамма может быть крайне информативным признаком, так как теперь, в отличие от мешка слов, слова стоят рядом друг с другом, и из их сочетания становится более понятно, какой именно они несут смысл. Однако в случае извлечения N-грамм из коллекции текстов, признаковое пространство обучающей матрицы увеличивается в несколько раз по сравнению с мешком слов, что сильно замедляет вычислительный процесс и может привести к переобучению. Однако на практике, извлечение N-грамм из текста увеличивает предсказательную способность модели примерно на 5-15%. В данной работе будут использованы 1-4граммы, так как их большее количество сильно затруднит вычисления и более вероятно приведёт к переобучению.
3. TF-IDF.
Третий важный метод векторизации называется TF-IDF (англ. TF - Term Frequency, IDF - Inverse Document Frequency) - «статистическая мера, используемая для оценки важности слова в контексте документа, являющегося частью коллекции текстовых документов». TF каждого слова вычисляется через отношение числа вхождений этого слова к общему числу слов документа:
,
где - количество вхождений слова в документ , а - общее количество слов в документе
IDF вычисляется через натуральный логарифм от отношения общего числа документов к количеству документов, в которых встречается данное слово.
где число документов в коллекции,
- число документов, в которых встречается слово
Проще говоря, значение TF отражает значимость каждого слова в рамках одного документа (показывает долю вхождений данного слова в конкретный текст), а IDF уменьшает важность этого слова, если оно часто встречается в других документах.
Таким образом, TF-IDF - это произведение двух описанных коэффициентов:
.
Данный коэффициент получает высокое значение в случае, если слово много раз употребляется в одном документе, но редко во всей коллекции. Плюс ко всему, этот коэффициент можно высчитывать как для отдельных слов, так и для их сочетаний.
Также существует улучшенный, сбалансированный вариант данного коэффициента под названием «delta TF-IDF», значение которого для конкретного слова равно разности значений коэффициента TF-IDF, полученных из текстов положительной и отрицательной полярностей, взятых отдельно:
Качество классификации моделей сентимент-анализа после извлечения сбалансированной версии данного коэффициента стабильно выше, чем у моделей, обученных на обычном TF-IDF. Например, в работе исследователей из Балтимора, а также в работе [22] извлечение признаков delta TF-IDF из обзоров кино увеличило точность классификации тональности отзывов на 5.9%, а также это увеличило точность классификации текстов в задаче предсказания результатов голосования за членов конгресса после их дебатов на 5.5%. По этим причинам в практической части данной работы будет использоваться именно сбалансированный коэффициент.
Для анализа эффективности каждого вида признаков в практической части работы классификаторы будут обучаться на трёх разных обучающих выборках:
N-граммы,
delta TF-IDF, вычисленный для N-грамм,
N-граммы + delta TF-IDF, вычисленный для N-грамм. Результаты обучения каждого из классификаторов будут проанализированы в конце исследования.
2.7 Вывод
Итак, в данной главе были рассмотрены алгоритмы классификации, которые будут реализованы в следующей главе. Были проанализированы особенности данных классификаторов, выбраны метрики проверки их качества. Плюс ко всему, были полностью описаны, проанализированы и выбраны этапы подготовки текстов к их векторизации, а также были определены признаки, на которых будут обучаться модели:
· В качестве основных метрик были выбраны точность, полнота и F-мера;
· Для обработки слов в документах был выбран алгоритм Snowball stemmer;
· В качестве извлекаемых признаков выступят первичные признаки + N-граммы (где N = [1, 2, 3, 4]), первичные признаки + коэффициент delta TF-IDF, а также совокупность всех перечисленных признаков. Модели будут обучены на каждом из множеств признаков для анализа качества каждой пары «алгоритм-признак» и выбора наиболее эффективных в контексте поставленных задач.
Глава 3. Программная реализация
Данная глава полностью посвящена программной реализации классификаторов, оценки их эффективности и анализу результатов.
3.1 Среда разработки и модули
Все вычисления производились на языке Python 3.6.2 в IDE под названием Jupyter Notebook.
Ниже приведено описание модулей, использованных в течение практической части:
Pandas - модуль для удобного оперирования данными,
NLTK - библиотека, предоставляющая доступ к функциям и массивам данным, связанным с обработкой естественного языка. В течение работы использовались две функции:
· «stem.snowball.SnowballStemmer» - обновленный стеммер Портера
· «corpus.stopwords» - массив стоп-слов английского языка
«Lightgbm.LGBMClassifier» - модель градиентного бустинга
Scikit-learn - основной модуль, предоставляющий функции анализа данных и машинного обучения. Было использовано 9 основных функций:
· «feature_extraction.text. CountVectorizer» - функция, извлекающая признаки N-грамм из текста;
· «sklearn_deltatfidf.DeltaTfidfVectorizer» - функция, извлекающая признаки коэффициента delta TF-IDF;
· «model_selection. train_test_split» - функция, разбивающая выборку на тренировочную и тестовую;
· «svm. LinearSVC» - линейный SVM-классификатор;
· «naive_bayes.MultinomialNB» - мультиномиальный Байесовский классификатор;
· metrics.{precision_score, recall_score, f1_score} - функции для вычисления значений точности, полноты и F-меры.
3.2 Описание результатов
1) Изначально, перед началом работы, коллекция текстов содержала 1350598 уникальных слов. После удаления веб-сайтов, знаков препинания, цифр и других неинформативных данных, не включая процесс стемминга, в коллекции осталось 376814 уникальных слов. После применения обновленного стеммера Портера, в коллекции осталось 322025 слов.
2) В процессе извлечения N-грамм из текстовых данных, из признакового пространства удалялись все N-граммы, которые встречались в коллекции реже 0,01% от числа всех текстов. Благодаря этому удалось отсечь неинформативные N- граммы и снизить размерность признакового пространства до 8995 уникальных словосочетаний. Эта матрица была объединена с матрицей первичных признаков, и в итоге получилось 9002 уникальных признака.
Затем были извлечены коэффициенты delta TF-IDF для набора уже имеющихся N-грамм, их количество, очевидно, было равно количеству
N-грамм. Далее все три матрицы (первичных признаков, N-грамм и коэффициента TF-IDF) были объединены в одну. Каждый из классификаторов был обучен на каждом из трёх видов обучающих выборок, причем 70% данных были тренировочными, а 30% - тестировочными.
3) Параметры классификаторов во время обучения:
· Linear SVC: C=100.0, penalty=«L1», random_state=241;
· Naпve Bayes classifier: alpha=1.0, fit_prior=True, class_prior=None;
· Gradient Trees Boosting: n_estimators=500, random_state=241, n_jobs=-1, reg_lambda=0.2.
Ниже представлена таблица с информацией о затраченном времени на обучение каждого классификатора:
Таблица 2. Количество времени, затраченное на обучение, сек.
SVM |
NB |
Gradient Boosting |
||
N-gramms |
4min 28s |
1.14 s |
2min 37s |
|
Delta TF-IDF |
4min 26s |
1.14 s |
3min 8s |
|
All features |
8min 40s |
1.23 s |
5min 22s |
В следующих таблицах приведены значения точности, полноты и F-меры, выраженные в процентах и округлённые до двух знаков после запятой, для каждого классификатора и признакового пространства:
Таблица 3. Значения метрики точности для каждого набора модель-признаковое пространство, %
SVM |
NB |
Gradient Boosting |
||
N-gramms |
78,64% |
75,65% |
75,36% |
|
Delta TF-IDF |
77,4% |
74,98% |
75,83% |
|
All features |
79,46% |
75,57% |
77,81% |
Таблица 4. Значения метрики полноты для каждого набора модель-признаковое пространство, %
SVM |
NB |
Gradient Boosting |
||
N-gramms |
82,01% |
77,21 |
80,57 |
|
Delta TF-IDF |
80,62% |
71,43% |
80,34% |
|
All features |
80,96% |
75,51% |
80,35% |
Таблица 5. Значения F-меры для каждого набора модель-признаковое пространство, %
SVM |
NB |
Gradient Boosting |
||
N-gramms |
79,73% |
76,42% |
77,88% |
|
Delta TF-IDF |
78,98% |
73,16% |
77,81% |
|
All features |
80,21% |
75,54% |
78,77% |
3.3 Выводы
Судя по результатам, полученным в процессе обучения классификаторов, можно сделать следующие выводы:
1) N-граммы и delta TF-IDF являются довольно информативными признаками, поскольку средние значения метрик при обучении на этих признаках приблизительно равны 78%. Объединение этих признаковых пространств даёт незначительную прибавку к значениям метрик, однако это не является целесообразным, так как новое признаковое пространство увеличивается в два раза, как и время обучения невероятностных моделей.
Также важно заметить, что полученные признаки были информативными благодаря качественной предобработке текстов. Однако есть предположение, что лемматизация с разметкой слов в коллекции по частям речи сможет обработать слова с меньшими потерями, нежели алгоритмы стемминга, что потенциально может улучшить качество обучаемых моделей на несколько процентов.
2) Наивный Байесовский классификатор показывал одни из самых низких значений метрик, однако разница в 2-4% не является критичной проблем для многих сфер деятельности человека. При этом, как и ожидалось, данная модель обучалась практически мгновенно, что делает её крайне полезной во всех задачах машинного обучения. Также есть предположение о том, что Байесовский классификатор смог бы проявить себя более эффективно в задачах обработки больших текстов. Поэтому, несмотря на его небольшое отставание в показателях, он может применяться в подобных задачах крайне эффективно.
3) Линейный классификатор SVM стабильно показывает более высокие значения метрик, однако на его обучение требовалось больше всего времени. Поэтому: если в процессе задачи идёт борьба за лишние проценты эффективности метрик, но линейный SVC в задачах анализа тональности является отличным выбором.
4) Значения метрик градиентного бустинга практически постоянно были средними. С одной стороны, это может характеризовать данную модель как стабильную, и её вполне можно использовать. Однако, с другой стороны, выбирая одну модель из трёх рассмотренных, разумно выбрать либо самую точную, либо самую быструю, подстраиваясь под условия решаемой задачи, и данная модель не удовлетворяет ни одному из этих критериев.
Заключение
Итак, в данной работе были определены фундаментальные понятия области сентимент-анализа, описаны основные аспекты и проанализированы базовые существующие методы анализа тональности. Также были проанализирован каждый этап предобработки текста и извлечения признаков из текстовых документов; путём анализа научной литературы были выбраны основные методы и техники обработки и векторизации текста. Необходимо отметить, что процесс выбора техник по предобработке текста, извлечению информативных признаков, основных методов анализа тональности, метрик эффективности классификаторов и параметров моделей был продиктован условиями и контекстом поставленной в работе цели. Итогом работы стала реализация трёх классификаторов - Linear SVM Classifier, Naпve Bayes Classifier и Gradient Boosting on Decision Trees. Параметры и метрики измерения их эффективности были подобраны, опираясь на знания, полученные из научных статей. Концом исследования стал проведённый анализ достигнутых результатов. Выводы, сделанные из результатов исследования, могут быть полезными при решении задач, схожих с поставленной.
Приложение
Все вычисления производились на ноутбуке со следующими характеристиками:
· Фирма: Dell
· Операционная система: Windows 10
· Процессор: Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz 2.70 GHz
· ОЗУ: 8.00 ГБ
· Тип системы: 64-разрядная операционная система, процессор х64
Код с комментариями:
# Импортирование необходимых библиотек
import pandas as pd
import numpy as np
import re
from sklearn.utils import shuffle
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, recall_score, confusion_matrix
from scipy.sparse import hstack
from nltk.stem.wordnet import WordNetLemmatizer
# Чтение данных из .csv файла
df = pd.read_csv('Datasets/Sentiment_analysis/training_nlp.csv',
names=['Sentiment', 'ID', 'Date', 'SQL', 'Nickname', 'Text'],
encoding='Latin-1')
df = shuffle(df, random_state=241).reset_index(drop=True)
# Разбиение выборки на признаки и целевую переменную
X = pd.DataFrame(df['Text'])
y = pd.DataFrame(df['Sentiment'])
# Извлечение первичных признаков: количество слов, цифр, средняя длина слов, количество стоп-слов, количество слов с заглавной буквы, количество вопросительных и восклицательных знаков.
X['word_count'] = X['Text'].apply(lambda text: len(str(text).split(" ")))
X['char_count'] = X['Text'].str.len()
def average_word_length(text):
words = text.split()
return sum(len(word) for word in words)/len(words)
X['average_word_length'] = X['Text'].apply(average_word_length)
stop_words = stopwords.words('english')
X['stopwords_count'] = X['Text'].apply(lambda text: len([stopword for stopword in text.split() if stopword in stop_words]))
X['upper_count'] = X['Text'].apply(lambda text: len([word for word in text.split() if word[0].isupper()]))
X['!_count'] = X['Text'].apply(lambda text: len([char for char in text if char=='!']))
X['?_count'] = X['Text'].apply(lambda text: len([char for char in text if char=='?']))
# Deleting websites
for tag in ['http', 'www.', 'goo.gl', '.com']:
X['Text'] = X['Text'].apply(lambda text: ' '.join([word for word in text.split() if word.find(tag)==-1]))
# Deleting other's nicknames
X['Text'] = X['Text'].apply(lambda text: ' '.join([word for word in text.split() if not word.startswith('@')]))
#Quotes removing
X['Text'] = X['Text'].apply(lambda text: text.replace('"', ''))
X['Text'] = X['Text'].apply(lambda text: text.lower())
# Removing punctuation
X['Text'] = X['Text'].str.replace('[^\w\s]', '')
# Removing numerics
X['Text'] = X['Text'].apply(lambda text: re.sub('[^a-zA-Z]', " ", text))
# Duplicates dropping
X['Text'] = X['Text'].apply(lambda text: " ".join([re.sub(r'(.)\1+', r'\1\1', text)]))
#Removing stopwords
X['Text'] = X['Text'].apply(lambda text: ' '.join(word for word in text.split() if word not in stop_words))
#Stemming
stemmer = SnowballStemmer(language='english')
X['Text'] = X['Text'].apply(lambda text: " ".join([stemmer.stem(word) for word in text.split()]))
X['Text'] = X['Text'].apply(lambda text: "".join(re.sub(r'\b(a*ha+h[ha]*|o?l+o+l+[ol]*)\b', r"haha", text)))
#Text vectorization
X_features = X.drop('Text', axis=1)
X_features = csr_matrix(X_features)
# Matrixes with n-grams and columns_names(unique words)
vect_ngram = CountVectorizer(analyzer='word', ngram_range=(1, 3), min_df=0.0001)
X_ngram = vect_ngram.fit_transform(X['Text'].values)
ngram_names = vect_ngram.get_feature_names()
X_ngram = hstack([X_features, X_ngram])
X_train, X_test, y_train, y_test = train_test_split(X_ngram, y, test_size=0.3, shuffle=True)
# Сетка для LinearSVC with penalty=L1
grid = {'C': np.power(10.0, np.arange(-3, 4))}
cv = KFold(n_splits=5, shuffle=True, random_state=241)
svc = LinearSVC(penalty='l1', dual=False, random_state=241)
gs = GridSearchCV(svc, grid, scoring='precision', cv=cv)
gs.fit(X_ngram, y)
mean_svm_score = []
C_values = []
for a in gs.grid_scores_:
mean_svm_score.append(a.mean_validation_score)
C_values.append(a.parameters)
print(a.mean_validation_score, a.parameters)
%%time
# LinearSVC with penalty=L1 on Ngrams
svc = LinearSVC(C=100, penalty='l1', dual=False, random_state=241)
svc.fit(X_train, y_train)
svс_pred_ng = svc.predict(X_test)
print('SVM scores on N-grams:\n')
print('precision: {}\nrecall: {}\nF-measure: {}\nconfusion_matrix: \n{}'.format(precision_score(y_test, svс_pred_ng),
recall_score(y_test, svс_pred_ng), f1_score(y_test, svс_pred_ng),
confusion_matrix(y_test, svс_pred_ng)))
# Naive Bayes on Ngrams
NB = MultinomialNB()
NB.fit(X_train, y_train)
NB_pred_ng = NB.predict(X_test)
print('Naive Bayes scores:\n')
print('precision: {}\nrecall: {}\nF-measure: {}\nconfusion_matrix: \n{}'.format(precision_score(y_test, NB_pred_ng),
recall_score(y_test, NB_pred_ng),
f1_score(y_test, NB_pred_ng), confusion_matrix(y_test, NB_pred_ng)))
lgbm.fit(X_train, y_train)
LB_pred_ng = lgbm.predict(X_test)
print('Light GBM scores:\n')
print('precision: {}\nrecall: {}\nF-measure: {}\nconfusion_matrix: \n{}'.format(\
precision_score(y_test, svс_pred), recall_score(y_test, svс_pred),\
f1_score(y_test, svс_pred), confusion_matrix(y_test, svс_pred)))
delta_vectorizer = DeltaTfidfVectorizer(analyzer='word', ngram_range=(1, 3), min_df=0.0001)
delta_tfidf = delta_vectorizer.fit_transform(X['Text'].values, list(y))
delta_names = delta_vectorizer.get_feature_names()
delta_tfidf = hstack([X_features, delta_tfidf])
X_train, X_test, y_train, y_test = train_test_split(delta_tfidf, y, test_size=0.3, shuffle=True)
# LinearSVC on delta TF-IDF
svc = LinearSVC(C=100, penalty='l1', dual=False, random_state=241)
svc.fit(X_train, y_train)
svс_pred = svc.predict(X_test)
print('SVM scores on delta TF-IDF:\n')
print('precision: {}\nrecall: {}\nF-measure: {}\nconfusion_matrix: \n{}'.format(\
precision_score(y_test, svс_pred), recall_score(y_test, svс_pred),\
f1_score(y_test, svс_pred), confusion_matrix(y_test, svс_pred)))
# Naive Bayes on delta TF-IDF
NB = MultinomialNB()
NB.fit(X_train, y_train)
NB_pred = NB.predict(X_test)
print('Naive Bayes scores on delta TF-IDF:\n')
print('precision: {}\nrecall: {}\nF-measure: {}\nconfusion_matrix: \n{}'.format(\
precision_score(y_test, NB_pred), recall_score(y_test, NB_pred),\
f1_score(y_test, NB_pred), confusion_matrix(y_test, NB_pred)))
# Boosting on delta TF-IDF
lgbm.fit(X_train, y_train)
LB_pred = lgbm.predict(X_test)
print('Light GBM scores on delta TF-IDF:\n')
print('precision: {}\nrecall: {}\nF-measure: {}\nconfusion_matrix: \n{}'.format(precision_score(y_test, LB_pred),
recall_score(y_test, LB_pred), f1_score(y_test, LB_pred), confusion_matrix(y_test, LB_pred)))
All_features = hstack([X_ngram, delta_tfidf])
X_train, X_test, y_train, y_test = train_test_split(All_features, y, test_size=0.3, shuffle=True)
# LinearSVC on all features
svc = LinearSVC(C=100, penalty='l1', dual=False, random_state=241)
svc.fit(X_train, y_train)
svс_pred_all = svc.predict(X_test)
print('SVM scores on all features:\n')
print('precision: {}\nrecall: {}\nF-measure: {}\nconfusion_matrix: \n{}'.format(precision_score(y_test, svс_pred_all),
recall_score(y_test, svс_pred_all),f1_score(y_test, svс_pred_all), confusion_matrix(y_test, svс_pred_all)))
# Naive Bayes on all features
NB = MultinomialNB()
NB.fit(X_train, y_train)
NB_pred_all = NB.predict(X_test)
print('Naive Bayes scores on all features:\n')
print('precision: {}\nrecall: {}\nF-measure: {}\nconfusion_matrix: \n{}'.format(precision_score(y_test, NB_pred_all),
recall_score(y_test, NB_pred_all), f1_score(y_test, NB_pred_all), confusion_matrix(y_test, NB_pred_all)))
# Boosting on all features
lgbm.fit(X_train, y_train)
LB_pred_all = lgbm.predict(X_test)
print('Light GBM scores on all features:\n')
print('precision: {}\nrecall: {}\nF-measure: {}\nconfusion_matrix: \n{}'.format(precision_score(y_test, LB_pred_all),
recall_score(y_test, LB_pred_all), f1_score(y_test, LB_pred_all), confusion_matrix(y_test, LB_pred_all)))
Подобные документы
Экономический анализ как необходимый элемент управления экономикой, характеристика его особенностей и основных приемов и методов. Классификация видов экономического анализа. Методика детерминированного факторного анализа. Типы детерминированных моделей.
контрольная работа [115,4 K], добавлен 16.03.2013Понятие экономического анализа как науки, его сущность, предмет, общая характеристика методов и социально-экономическая эффективность. Основные группы эконометрических методов анализа и обработки данных. Факторный анализ экономических данных предприятия.
реферат [44,7 K], добавлен 04.03.2010Понятие социальных сетей, их влияние на экономику. Структура социального капитала. Потребительское сотрудничество в Интернете. Преимущества торговли через соцсети. Примеры их эффективного использования. Экономические аспекты рекламы в социальных сетях.
курсовая работа [130,3 K], добавлен 17.05.2012Характеристика форм документального оформления результатов анализа хозяйственной деятельности предприятия. Исследование особенностей методики анализа фонда оплаты труда, а также методов расчета абсолютного и относительного отклонения по его использованию.
контрольная работа [36,5 K], добавлен 30.08.2010Методы анализа детерминированных моделей. Методы анализа стохастических моделей. Методы оптимизации в экономическом анализе. Методы комплексного анализа. Принципы их построения и подходы по использованию.
курсовая работа [49,1 K], добавлен 12.04.2008Понятие экономического анализа. Характеристика основных приемов и методов экономического анализа. Методика факторного анализа. Многофакторные мультипликативные модели. Построение факторной модели - первый этап детерминированного анализа.
контрольная работа [105,1 K], добавлен 12.09.2006Обзор методов статистического обеспечения качества. Применение семи традиционных японских методов анализа качества. Разработка идеи статистического приемочного контроля. Основы и применение математического аппарата, используемого для статистики.
методичка [58,3 K], добавлен 18.08.2009Понятие и суть системного анализа. Методологические принципы системного анализа. Этапы системного анализа. Описание и характеристика разных подходов к определению основных этапов системного исследования. Принципы и этапы системного анализа, его описание.
реферат [25,0 K], добавлен 12.01.2009Сущность и отличительные черты статистических методов анализа: статистическое наблюдение, группировка, анализа рядов динамики, индексный, выборочный. Порядок проведения анализа рядов динамики, анализа основной тенденции развития в рядах динамики.
курсовая работа [1,0 M], добавлен 09.03.2010Классификация методов экономического анализа. Применение статистических (формализованных) методов для предварительной и общей оценки хозяйственной деятельности. Метод бухгалтерского и финансового анализа. Экономико-математические и эвристические методы.
лекция [40,1 K], добавлен 27.01.2010