Data Science / Text Mining

Осмысление кластеризации текста

И насколько это может быть полезно?

Тексты есть повсюду, и социальные сети являются одним из крупнейших генераторов. Люди постоянно делятся ими на многих платформах. Вместо того, чтобы оставить все как есть, мы можем преобразовать их во что-то полезное, используя методы интеллектуального анализа текста. Одним из известных приложений является анализ настроений, с помощью которого мы можем определить, является ли мнение текста положительным, отрицательным или нейтральным. Но здесь мы поговорим о другом методе и его понимании: кластеризация текста.

Как часть обучения без учителя, кластеризация используется для группировки похожих точек данных, не зная, к какому кластеру принадлежат данные. Таким образом, в некотором смысле кластеризация текста - это то, как похожие тексты (или предложения) группируются вместе. Но как именно определить, похожи ли какие-то тексты? Как мы можем сказать машине, что слово «дерево» похоже на «растение»?

Думайте о бесконтрольном обучении как о некой математической версии того, как заставить «птичек пера стаяться вместе». - Кэсси Козырков

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

Вы можете просто пропустить раздел кода, если вы не кодовый человек. Кому интересно, вы можете получить доступ к полному коду на GitHub.

Без лишних слов, поехали!

Давайте узнаем данные

Мы будем использовать данные из открытых источников, которые можно загрузить с Kaggle. Спасибо Доди Агунгу за создание этого набора данных Дорожно-транспортное происшествие в Индонезии.

Полный набор данных содержит более 150 000 твитов (язык на бахаса Индонезия) с ключевым словом «kecelakaan» (что означает авария). Он содержит идентификатор твита, время его написания, время его сканирования, имя пользователя, написавшего твит, и полный твит.

Создатель также предоставляет помеченный вручную набор данных, содержащий 1000 твитов и их флажки, независимо от того, указывает ли твит на настоящую аварию. Отметьте 1 для аварии и 0 для отсутствия аварии. Мы попытаемся выполнить кластеризацию текста, используя этот помеченный набор данных. Взглянем на данные.

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

Как упоминалось выше, как мы можем определить, похожи ли некоторые тексты? Компьютеры только вычисляют числа, поэтому мы переводим наши тексты в числа!

Прежде чем мы перейдем к этому, нам нужно очистить наш текст. Давайте посмотрим, почему нам нужно их очистить, используя это предложение в качестве нашего примера:

БЕЗОПАСНОЕ вождение по дороге - ОБЯЗАТЕЛЬНО для каждого из нас, будь то автобус, 🚗 автомобиль, 🚛 грузовик или двухколесный транспорт .. !! 😱😱😱

Фильтрация и складывание корпуса

Смайлы - это не текст, как и символы и специальные символы, такие как «.», «!», «~» И т. Д. Мы отфильтруем их, чтобы данные были в чистом виде.

Складывание корпуса выполняется также потому, что могут быть твиты со словом «вождение», «вождение», «вождение». Мы просто введем все тексты в нижний регистр, чтобы они имели одинаковый формат.

После применения фильтрации и сворачивания регистра предложение будет выглядеть чище:

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

Удаление стеммингов и стоп-слов

Стемминг (или мы можем использовать лемматизацию) - это процесс сокращения слова до его базовой формы. Дело в том, что слова вождение, вождение, управляемый имеют один и тот же контекст, поэтому мы используем его базовую форму драйв. Посмотрите разницу между стеммингом и лемматизацией здесь.

Другое дело - удаление стоп-слов, таких как «есть», «и», «или» и т. Д. Стоп-слова относятся к наиболее распространенным словам, которые встречаются в нашем языке. Мы часто их видим, и они избыточны, поэтому не предоставляют реальной информации. Следовательно, мы удаляем их полностью.

После применения стемминга и удаления игнорируемых слов предложение будет выглядеть так:

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

Для выполнения упомянутой предварительной обработки используется NLTK (набор инструментов для естественного языка), но, поскольку язык находится на бахаса, Индонезия, мы используем вместо него Sastrawi.

Встраивание слов

Эта часть является ключом к интуитивному пониманию того, как работает кластеризация текста. Мы можем легко найти сумму, среднее и количество целых чисел, но как насчет текста? В этой части мы конвертируем их в числа.

Существуют самые популярные методы кодирования, такие как CountVectorizer и TF-IDF, но в этом эксперименте мы будем специально использовать встраивание слов. По сути, встраивание слов представляет слова как векторы в пространстве, где похожие слова отображаются рядом друг с другом.

Вот пример представления вектора слова в трехмерном пространстве.

Чтобы применить встраивание слов к нашему набору данных, мы воспользуемся библиотекой fastText. Они предоставляют предварительно подготовленную модель для индонезийского языка, но вместо этого мы попытаемся обучить нашу собственную модель встраивания слов, используя имеющиеся 150 000+ твитов в качестве нашего корпуса. Я заранее обработал текст и сохранил его в twitter.txt.

По умолчанию train_unsupervised fastText будет использовать модель skipgram и выводить 100-мерные векторы. Эти векторы представляют, где расположен твит в пределах 100 измерений.

Если вы заметили, что мы не токенизировали предложения, причина в том, что с get_sentence_vector он автоматически токенизирует их (разбивает текст на части). Более подробно с моделью можно ознакомиться здесь.

FastText также вычисляет оценку сходства между словами. Используя get_nearest_neighbors, мы можем увидеть 10 самых похожих слов, а также каждую оценку сходства. Чем ближе оценка к 1, тем больше похоже слово с заданным словом.

Вот демонстрация с веб-сайта fastText.

model.get_nearest_neighbors(‘accomodation’)

[(0,96342, «размещение»), (0,942124, «размещение»), (0,915427, «размещение»), (0,847751, «размещение»), (0,794353, «размещение»), (0,740381, «размещение»), ( 0,729746, «удобства»), (0,725975, «общественное питание»), (0,703177, «размещение»), (0,701426, «гостеприимство»)]

Их предварительно обученная модель даже знает, что контекст accomodation может быть catering и hospitality. Теперь он стал еще более мощным, когда вы заметили, что введено неправильное написание accommodation (да, он может обрабатывать опечатки).

Как насчет нашей модели? Давай проверим.

# Motorcycle in Bahasa Indonesia
model.get_nearest_neighbors(‘motor’)

[(0,776196300983429, 'sepedamotor'), (0,7229066491127014, 'мотор'), (0,7132794260978699, 'sepeda'), (0,698093056678772, 'motore'), (0,6889493465423584, 'мотор'), (0,68598091602plus 0,6410694718360901, 'nmax'), (0,6405101418495178, 'bonceng'), (0,6383005976676941, 'мотортабракан'), (0,6309819221496582, 'matic')]

# Car in Bahasa Indonesia
model.get_nearest_neighbors(‘mobil’)

[(0,7426463961601257, 'рингсек'), (0,7367433905601501, 'табрак'), (0,7266382575035095, 'мобил'), (0,7141972780227661, 'мобилвоу' '), (0,709760427474749756, '12765550'), (мобилсек ') (0,706623375415802, 'pajero'), (0,705599844455719, 'удача'), (0,7012485265731812, '«pajero'), (0,6936420798301697, 'mpv')]

Хорошо выглядеть! Если вы индонезиец, вы четко скажете, что эти слова находятся в том же контексте. Некоторые слова, такие как mobilio, pajero, fortuner и mpv, на самом деле являются хорошо известными в Индонезии моделями автомобилей.

После завершения обучения модель будет использоваться для преобразования каждого твита в 100-мерные векторы. Вот пример векторизованного твита:

[-0.03824997, 0.00133674, -0.0975338 , 0.07422361, 0.04062992, 0.15320793, 0.0624048 , 0.08707056, -0.04479782, 0.01363136, 0.17272875, -0.03097608, 0.05366326, -0.09492738, 0.06163749, 0.04166117, -0.0779877 , 0.11031814, 0.04414257, -0.04424104, 0.02991617, -0.02359444, 0.08660134, -0.01918944, -0.02529236, -0.06084985, 0.00374846, 0.07403581, 0.03064661, 0.0105409 , 0.02821296, -0.08867718, -0.00845077, -0.04583884, -0.03845499, -0.04432626, 0.08085568, 0.0762938 , -0.03690336, 0.00286471, 0.05640269, 0.08347917, -0.12400634, 0.06856565, 0.09385975, 0.07298957, -0.03306708, 0.07894476, -0.03820109, -0.05187325, -0.08153208, -0.05167899, -0.07915987, 0.05901144, 0.00445149, -0.14628977, 0.04536996, 0.12275991, 0.14212511, -0.04074997, 0.04834579, 0.1293375 , 0.13116567, 0.10201992, -0.1010689 , -0.01407889, -0.01707099, 0.13866977, 0.03039356, 0.08307764, 0.06886553, 0.08681376, 0.02241692, -0.0974027 , -0.02969944, -0.06031594, 0.07977851, 0.09534364, -0.0803275 , -0.18087131, 0.00296218, 0.06247464, -0.00784681, -0.0209177 , 0.10568991, -0.06968653, -0.07200669, 0.06571897, 0.01448524, 0.15396708, 0.00435031, 0.02272239, 0.05981111, -0.03069473, -0.11629239, -0.11808605, -0.01497007, -0.00028591, 0.02116462, -0.11837215]

Это набор цифр, не так ли? Не пытайтесь визуализировать 100 измерений в своей голове, хорошо? Люди не могут (по крайней мере, сейчас?), Но наши компьютеры прекрасно справляются с этим! Теперь, когда мы создали векторы слов, как мы можем сгруппировать похожие твиты вместе?

Кластеризация текста

Для обновления кластеризация - это алгоритм обучения без учителя для кластеризации данных в k групп (обычно количество заранее определено нами) без фактического знания, к какому кластеру принадлежат данные. Алгоритм кластеризации попытается самостоятельно изучить шаблон. Мы будем использовать наиболее распространенный алгоритм кластеризации: K-means. Этот алгоритм может кластеризовать твиты на основе их расстояния до центра тяжести кластера.

Мы сохранили вывод кластера, которому принадлежит твит. Давайте попробуем изобразить это, но как мы можем визуализировать 100 измерений?

На помощь приходит анализ главных компонентов (PCA). Это широко используемый метод уменьшения размера. Не все данные являются репрезентативными для полной картины, некоторые могут что-то объяснить, а некоторые нет. Идея PCA заключается в извлечении основных компонентов данных. Эти основные компоненты могут использоваться для визуализации наших данных, поскольку они представляют большую часть наших данных.

Отлично, теперь давайте изобразим это на диаграмме рассеяния 2D.

Некоторые точки данных накладываются друг на друга. Что, если мы спроецируем его в 3D?

Красивый!

Но ждать,

Некоторые из вас заметили, что мы могли бы просто построить трехмерную модель встраивания слов вместо 100-мерной модели, а затем использовать для нее PCA? Давай попробуем.

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

Результат эксперимента

Давайте посмотрим на долю каждого кластера на этикетке. На первом рисунке использовалось трехмерное встраивание слов, а на втором - 100 измерений по умолчанию. Существует большая разница в том, как создается кластер 0.

Благодаря большему количеству измерений модель встраивания слов может собирать больше информации и позволяет лучше группировать кластеры. Визуализация с использованием PCA предназначена только для интуитивного понимания. Возможность точно кластеризовать тексты с одинаковыми свойствами / характеристиками является более предпочтительной!

Теперь посмотрим, есть ли у каждого кластера какие-то характеристики. Мы увидим несколько примеров из каждого кластера. Я опишу характеристики каждого кластера для людей, не являющихся индонезийцами (или вы можете использовать переводчика).

Кластер 0 - Несчастный случай - Красные очки

Характеристика твита: живые отчеты от проверенных пользователей.

‘23.27: @PTJASAMARGA: Kunciran KM 14 - KM 16 arah Bitung PADAT, ada penanganan kecelakaan kendaraan truk fuso di bahu jalan. ”,

«20 .35 WIB #Tol_Japek Karawang Timur KM 51 - KM 52 arah Cikampek PADAT, ada Evakuasi Kecelakaan Kendaraan Truk di lajur 1 / kiri dan bahu jalan.»,

‘♻️ @SenkomCMNP: 5:09 Виб. Kendaraan Truk Tangki Pertamina янь mengalami Kecelakaan ди км 16 + 600. Masih Penanganan Petugas. Lajur 1 дан 2 Sudah bisa di lewati. (Uda) @ SonoraFM92 @RadioElshinta https://t.co/9QqgdoBzQW ',

Кластер 1 - Зеленый Кластер - Случайный

Характеристика твита: случайные твиты от случайных пользователей, обычно рассказывающие их личную историю.

Поворот сюжета: Ибунья абис кечелакаан, неменин ке УГД дан бару биса дитинггал. \ N \ nTapi ya ga masalah sih. Yg penting kan eTikA pRofEsiOnaL. «Https://t.co/0e2zHaMkCo ',

'Dapet video kejadian kecelakaan tunggal di Margonda, Depok tadi pagi .. Йа Аллах .. sedih liatnya .. \ n \ nSudah biasa liat yg ky gt .. Ga serem, tp sedih iya .. Turut berduka ..: (\ n \ nBuat kalian yg bawa kendaraan, jgn lupa berdoa sebelum bepergian, hati2 dan patuhi rambu yaa .. ',

‘👦:« Abis kecelakaan dimna lo? »\ N \ n👧:« Gue gk kecelakaan kok, aman2 aja »\ n \ n👦:« trus itu knapa muka lo ancur »\ n \ nSABAR. Muka jelek emang banyak cobaan ’,

Кластер 2 - Пурпурный кластер - Не случайно

Характеристика твита: содержит новости и информацию (не об аварии в реальном времени, а о событиях прошлого)

«Rekaman CCTV Kecelakaan Motor di PIK, заместитель Таман Грисенда: \ nhttps: //t.co/gMHLep9IvZ mhmmdrhmtrmdhn \ nVisit Wonderful #MRahmatRamadhan»,

‘Tewaskan 346 Orang dalam 2 Kecelakaan, Boeing Minta Maaf https://t.co/wLRhFy8oYE

‘Anggota parlemen Taiwan juga berencana meningkatkan denda maksimum dan masa hukuman bagi orang yang menyetir dalam keadaan mabuk. Https://t.co/GSWqziaKDN ',

Так что же дальше?

Помните, что мы не передавали данные флага в модель, но половина данных была правильно сгруппирована (~ 99%) в ячейки реальных происшествий и неаварийных происшествий. Зная это, мы можем использовать методы кластеризации для маркировки немаркированных данных. Первоначальная цель помеченного набора данных - решить проблему классификации (контролируемое обучение), но, как мы видим, можно использовать метод кластеризации, чтобы обогатить его еще больше.

«У нас нет алгоритмов лучше. У нас просто больше данных ». - Питер Норвиг

Иногда больше данных (конечно, качественных) гораздо полезнее, чем улучшение алгоритма. Благодаря большему количеству и качеству данных даже простой алгоритм может дать отличные результаты. Мы также можем увидеть это явление во время эксперимента, в котором мы используем модель встраивания слов 3D вместо 100D, верно?

Вот моя аналогия:

Хорошая гоночная машина может быть достаточно быстрой, чтобы выиграть гонку, но вы можете добиться лучших результатов только с лучшей машиной.

Ваши навыки вождения - это алгоритм, а автомобиль - это данные.

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

Спасибо! Оставайтесь в безопасности и здоровье, ребята.

использованная литература

[1] Сапутро, Д. А., Гирсанг, А. С., Классификация информации о дорожно-транспортных происшествиях с использованием машинного обучения из социальных сетей (2020), Международный журнал новых тенденций в инженерных исследованиях, 8 (3), 630–637

[2] Кэсси Козырков, Демистификация обучения без учителя (2018), Hacker Noon

[3] Бояновски, Петр и Грав, Эдуард и Жулен, Арманд и Миколов, Томас, Обогащение векторов слов с помощью информации о подсловах (2017), Труды Ассоциации компьютерной лингвистики

[4] Встраивания, ускоренный курс машинного обучения.

Особая благодарность Омару Абдилле, Адриану Альфариси, Надии Маули Арвинта, Стефани Сугихарто и Рахадженгу Риндрасари за вычитку черновика!