Мешок слов и сентимент-анализ на R

Мешок слов и сентимент-анализ на R

504
ПОДЕЛИТЬСЯ

Оригинальное задание изготовлено на Python. Я же желал оценить способности языка R для обработки текстов на естественном языке и заодно испытать реализацию Random Forest в обертке R-пакета caret. Эта статья подготовлена по мотивам (первой части) учебного задания Bag of Words Kaggle , но это не перевод.

Смысл задания – выстроить «машину», которая будет определенным образом обрабатывать обзоры кинофильмов на британском языке и определять тональность обзора, относя его к одному из 2-ух классов: нехорошие/положительные. В качестве обучающей подборки в задании употребляется набор данных с 20 пятью тыщами ревю из IMDB, размеченных неизвестными добровольцами.

Код для статьи и подготовки задания можно отыскать в моем репозитарии на GitHub. Дополнительно нужно установить последующие пакеты: Для его выполнения будет нужно R версии 3.1.3 (раз не обращать внимания на предупреждения от пакетов, то в 3.1.2 тоже всё будет работать).

tm — набор инструментов для работы с текстами
caret – обертка, поддерживающая наиболее 100 способов машинного обучения
randomForest — пакет, реализующий одноименный метод
SnowballC — вспомогательный пакет для лемматизации в tm
e1071 — пакет доп функций для randomForest

Во время обучения модели употребляется около 12 Гб физической памяти. Задачку в сокращенном виде (тыща обзоров и около 100 более нередко встречающихся определений) можно сделать на машине с 32-битной ОС, но для полной версии будет нужно 64 бита и 16 Гб RAM.

Контрольная подборка также содержит 25000 ревю, но естественно без разметки. Файлы можно загрузить с данной странички. Для этого будет нужно регистрация на Kaggle. Обучающая подборка представляет собой набор данных разбитых табуляцией.

Подготовительная обработка данных
У меня это вышло не сходу из-за кавычек в тексте. Я экспериментировал на первой записи. Соответственный обзор достаточно длиннющий, 2304 знака, потому привожу лишь его фрагмент: Опосля загрузки и распаковки рекомендую проверить размерность, обязано быть 25000 строк на три столбца.

Some of it has subtle messages about MJ’s feeling towards the press and also the obvious message of drugs are bad m’kay.<br /><br />Visually impressive but of course this is all about Michael Jackson so unless you remotely lik …" "" Moonwalker is part biography, part feature film which i remember going to see at the cinema when it was originally released.

Для начала я очистил ревю от HTML. Ради энтузиазма поглядел на 1-ые 20: В тексте есть знаки препинания, HTML-теги и особые знаки от которых нужно было избавиться. Позже убрал знаки препинания, спецсимволы, числа. Вообщем говоря, при схожем анализе некие конструкции из символов препинания, вроде смайликов, лучше не удалять, а преобразовывать в слова, но я сиим заниматься не стал, просто преобразовал все знаки в нижний регистр и разобрал на отдельные слова. Осталось убрать слова общей лексики, которые не добавляли смысла в обзор. Перечень таковых слов для британского языка я взял из пакета tm.

«i» «me» «my» «myself» «we» «our» «ours» «ourselves» «you» «your» «yours» «yourself» «yourselves» «he» «him» «his» «himself» «she» «her» «hers»

Заодно убрал однобуквенные слова, оставшиеся от конструкций типа MJ’s. Дальше я повторил перечисленные выше операции для всех 25000 записей в обучающей выборке.

Мешок слов
Ячейка на пересечении строчки и столбца содержит количество вхождений слова в соответственный документ. Мешок слов (либо Bag of Words) это модель текстов на натуральном языке, в которой каждый документ либо текст смотрится как неупорядоченный набор слов без сведений о связях меж ними. Его можно представить в виде матрицы, любая строчка в которой соответствует отдельному документу либо тексту, а каждый столбец — определенному слову.

Для подготовки Мешка слов я пользовался способностями пакета tm. Для того чтоб составить корпус поначалу необходимо преобразовать тексты в вектор, каждый элемент которого представляет отдельный документ. А позже выстроить на базе корпуса матрицу «документ-термин». Она и станет мешком слов. В нашем случае — все тексты это обзоры кинофильмов. Этот пакет в качестве объекта работает с так именуемым лингвистическим корпусом первого порядка — коллекцией текстов, объединенных общим признаком.

Опосля лемматизации, другими словами, приведения словоформы к лемме — обычной, словарной форме, осталось 49549 определений. Поначалу у меня вышла матрица в 25000 документов и 73759 определений. В уникальном задании использовалось 5000 слов, к огорчению, параметр разреженности нелинейно влияет на количество определений, потому, варьируя его, я тормознул на цифре 5072. Это было всё равно чрезвычайно много. Потому я убрал слова, которые в особенности изредка встречаются в обзорах. Разумеется, что определений было очень много.

Вот так смотрелся фрагмент Мешка с более нередко употребляемыми словами:
Docs act actor actual also anoth back bad best better can
1 0 0 1 2 1 0 3 0 0 1
2 0 0 0 0 0 0 0 0 0 1
3 0 1 0 0 0 0 1 0 1 0
4 0 1 0 1 2 0 0 0 0 1
Обучение модели
Для построения модели я избрал пакет randomForest в обертке caret. К тому с caret же можно применять сходу несколько ядер процессора. Caret дозволяет гибко управлять действием обучения, имеет интегрированные способности для предобработки данных и контроля свойства обучения.

На настоящей выборке (25000 x 5072) с данным количеством деревьев, nree=100, обучение заняло около 110 часов на компе с OS X 10.8, 2.3 ГГц Intel Core i7, 16 Гб 1600 MГц DDR3.

mtry задает количество определений, которые случайным образом выбираются при каждом разветвлении дерева. Замечу, что при использовании caret поочередно учится сходу три модели с различными значениями mtry, а потом по показателю Точность (Accuracy) выбирается лучшая.

В целях экономии машинного времени я заменил его на скользящий контроль с пятью группами, т.е. в каждом цикле 80% употребляется для обучения, 20% для контроля. По умолчанию при обучении модели предполагается применять бутстреппинг с 25 циклами.

Но это на контрольной выборке, пусть даже со скользящим контролем. Наилучшая модель для сокращенной подборки показала точность в 0.71. Это означало, что приблизительно 29% всех ревю в итоге будут классифицированы ошибочно. На испытательной выборке точность будет несколько ужаснее. Но для нашего сокращенного набора данных это не так уж и плохо.

1-ые 10 выглядели полностью ожидаемо: Функция varImp из пакета caret дозволяет получить список характеристик, использованных для обучения модели, в порядке убывания значимости.

term rate
great 100.00000
bad 81.79039
movi 59.40987
film 53.80526
even 42.43621
love 39.98373
time 38.14139
best 36.50986
one 36.36246
like 35.85307

Прогнозирование и проверка в Kaggle
Тестовую подборку я обрабатывал точно также как и обучающую за одним исключением – словарь, приобретенный из обучающей подборки, употреблялся для отбора определений в испытательной.

Прогноз сохранил в csv и через форму на веб-сайте выслал в Kaggle. Опосля того как у меня вышла матрица документы/определения, я преобразовал её в датафрейм, который выслал в predict() для прогнозирования по обученной модели.

Итог довольно умеренный, 231 из 277, но всё же моя «машина» ошиблась приблизительно в одном случае из 6, что внушает некий оптимизм.

Как оказалось, способностей R полностью довольно для обработки текстов на естественном языке. Существует даже реализация Google word2vec и, невзирая на то, что она еще в разработке, можно испытать сделать вторую часть задания Kaggle, где word2vec является центральным технологическим компонентом. habrahabr.ru Наиболее-наименее актуальный список инвентарем можно поглядеть тут. Пакет tm не единственный доступный инструмент, в R есть интерфейсы к OpenNLP, Weka и целый ряд пакетов, позволяющих решать отдельные задачки. К огорчению, у меня нет данных о том, как скорее задачка выполняется на Python.

НЕТ КОММЕНТАРИЕВ

ОСТАВЬТЕ ОТВЕТ

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.