Думаю, многие в напряженных дискуссиях в интернете сталкивались с обвинением людей в том, что они боты, тролли и проплачены Кремлем, Киевом или Вашингтоном. Но как действительно выявить таковых или просто людей пытающихся активно донести своё мнение до остальных?
Возьмём, к примеру четыре текста (комментария):
text_1 = 'Комментарий в первой теме характеризующий Михаил Михайловича умным, целеустремленным и ответственным человеком'
text_2 = 'Комментарий из второй темы про Михаил Михайловича, описывающий его как умного, ответственного и упорного человека'
text_3 = 'Случайный текст похожей длинны с первыми двумя комментариями не несущей какой либо смысловой нагрузки'
text_4 = 'Комментарий из другой темы, не касающийся Михаила, но тоже про умного человека, ответственно подходящего к работе'
На человеческий взгляд сходство в первом и втором комментариях определенно есть, они написаны про одного человека и характеризуют его положительные стороны. И так же никак не связаны с текстами три и четыре.
Как прийти к такому же результату с точки зрения математики?
Банально сравнить количество одинаковых слов в обоих текстов. Но сразу появляется проблема — как сравнить слова умный и умного? Лемматизация текста подходит не всегда, так как готовые библиотеки не поддерживают многие языки.
В таких моментах оправдано использование Алгоритма шинглов разбивающего текст n частей, размер которых подбирается опытным путём для конкретной задачи.
Пример:
['ком', 'омм', 'мме', 'мен', 'ент', 'нта', 'тар', 'ари', 'рий', 'ий ', 'й в', ' в ', 'в п', ' пе', 'пер', 'ерв', 'рво', 'вой', 'ой ', 'й т', ' те', 'тем', 'еме', 'ме ', 'е х', ' ха', 'хар', 'ара', 'рак', 'акт', 'кте', 'тер', 'ери', 'риз', 'изу', 'зую', 'ующ', 'ющи', 'щий', 'ий ', 'й м', ' ми', 'мих', 'иха', 'хаи', 'аил', 'ил ', 'л м', ' ми', 'мих', 'иха', 'хай', 'айл', 'йло', 'лов', 'ови', 'вич', 'ича', 'ча ', 'а у', ' ум', 'умн', 'мны', 'ным', 'ым ', 'м ц', ' це', 'цел', 'еле', 'леу', 'еус', 'уст', 'стр', 'тре', 'рем', 'емл', 'мле', 'лен', 'енн', 'нны', 'ным', 'ым ', 'м и', ' и ', 'и о', ' от', 'отв', 'тве', 'вет', 'етс', 'тст', 'ств', 'тве', 'вен', 'енн', 'нны', 'ным', 'ым ', 'м ч', ' че', 'чел', 'ело', 'лов', 'ове', 'век', 'еко']
['комме', 'оммен', 'ммент', 'мента', 'ентар', 'нтари', 'тарий', 'арий ', 'рий в', 'ий в ', 'й в п', ' в пе', 'в пер', ' перв', 'перво', 'ервой', 'рвой ', 'вой т', 'ой те', 'й тем', ' теме', 'теме ', 'еме х', 'ме ха', 'е хар', ' хара', 'харак', 'аракт', 'ракте', 'актер', 'ктери', 'териз', 'еризу', 'ризую', 'изующ', 'зующи', 'ующий', 'ющий ', 'щий м', 'ий ми', 'й мих', ' миха', 'михаи', 'ихаил', 'хаил ', 'аил м', 'ил ми', 'л мих', ' миха', 'михай', 'ихайл', 'хайло', 'айлов', 'йлови', 'лович', 'овича', 'вича ', 'ича у', 'ча ум', 'а умн', ' умны', 'умным', 'мным ', 'ным ц', 'ым це', 'м цел', ' целе', 'целеу', 'елеус', 'леуст', 'еустр', 'устре', 'стрем', 'тремл', 'ремле', 'емлен', 'мленн', 'ленны', 'енным', 'нным ', 'ным и', 'ым и ', 'м и о', ' и от', 'и отв', ' отве', 'ответ', 'тветс', 'ветст', 'етств', 'тстве', 'ствен', 'твенн', 'венны', 'енным', 'нным ', 'ным ч', 'ым че', 'м чел', ' чело', 'челов', 'елове', 'ловек', 'овеко']
Рассчитаем сходство первого и второго / первого и четвертого текстов при n (1,9) по формуле:
sim = len(set(Shingles_1) & set(Shingles_2)) / len(set(Shingles_1) | set(Shingles_2)))
ShingleSize: 1
0.9166666666666666 / 0.7857142857142857
ShingleSize: 2
0.5196078431372549 / 0.40350877192982454
ShingleSize: 3
0.3404255319148936 / 0.2375
ShingleSize: 4
0.28205128205128205 / 0.18497109826589594
ShingleSize: 5
0.2289156626506024 / 0.13812154696132597
ShingleSize: 6
0.1896551724137931 / 0.10752688172043011
ShingleSize: 7
0.15730337078651685 / 0.07894736842105263
ShingleSize: 8
0.13333333333333333 / 0.057291666666666664
ShingleSize: 9
0.10989010989010989 / 0.04145077720207254
Закономерная картина, при увеличение длины — увеличивается общее количество шинглов и падает отношение общих шинглов к совокупному объёму. Так при больших объёмах текстов лучше использовать длину шинглов от 5 до 8, а при работе с короткими, например твиты или комментарии — 2-4.
Но вернемся к практике, возьмём предварительно собранные данные, с популярного российского, развлекательного портала. Ссылка на kaggle.
Для сбора максимально жарких дискуссий был выбран тэг (раздел) — Политика, итого собрано:
- 944 поста с тегом политика
- 267000 комментариев к ним
- из них длиннее 100 символов ~ 140 тысяч
Перейдем к коду:
Очистка текста и разделение на шинглы:
def clean_text(text):
text = text.split('\n')
text = list(filter(None, text))
text = ' '.join(text)
text = re.sub(r"http\S+", "", text)
text = re.sub(r'[^\w\s]', '', text)
shingle = [text[i:i + ShingleSize] for i in range(len(text))][:-ShingleSize]
return ','.join(shingle)
Если мы берем только комментарии длиннее 100 символов, то количество итераций сравнения составляет: , что довольно много и обработка даже в мультипоточном режиме займет достаточно продолжительное время.
Поэтому сравнивать будем не попарно, а матрицами m*n, используя косинусное сходство
где m – число строк, которое подбирается опционально в зависимости от объёма оперативной памяти, а n – число столбцов, общее количество всех шинглов;
Реализация алгоритма:
csrMatrix = []
idArray = []
textArray = []
for i in range(ChunkSize, sparse_matrix.shape[0] + ChunkSize, ChunkSize):
temp = sparse_matrix[i - ChunkSize:i - 1]
idArray.append(corpusId[i - ChunkSize:i - 1])
textArray.append(OriginalCorpus[i - ChunkSize:i - 1])
csrMatrix.append(temp)
matrixCombinations = itertools.combinations_with_replacement(range(len(csrMatrix)), 2)
При m = 20000 и длинной шингла = 8, получаем 7 матриц размером 20000 * ?8800000 и следовательно 21 итерации сравнения. Уже намного лучше.
def Sim(A, B, C, D):
similarities = cosine_similarity(B[A[0]].astype(np.float32), B[A[1]].astype(np.float32))
x, y = np.where(similarities > similarityPercent)
res = []
for k, j in zip(x, y):
if D[A[0]][k] != D[A[1]][j]:
res.append((D[A[0]][k], C[A[0]][k], similarities[k][j].item(), D[A[1]][j], C[A[1]][j]))
return res
s = pool.starmap(Sim, zip(matrixCombinations, itertools.repeat(csrMatrix), itertools.repeat(textArray), itertools.repeat(idArray)))
s = [item for sublist in s for item in sublist]
Чтобы уменьшить занимаемый объём используем так же тип данных float32. Его точности вполне хватает для корректной работы алгоритма.
Результаты работы заносятся в MySQL базу, для дальнейшей обработки. Так например сгруппируем комментарии, посчитав для каждого сходство с его парами:
SELECT FirstText, SUM(sim) as c FROM pikabu.similarity GROUP BY FirstId ORDER BY c DESC
Топ совпадений:
- Комментарий удален. Причина: данный аккаунт был удалён.
- Комментарий удален. Причина: оскорбление пользователей.
- Комментарий удален. Причина: оскорбления, грубое общение и провокации.
- Комментарий удален. Причина: запрещено размещать комментарии, единственная цель которых – вызвать неприязнь или возбуждение вражды, а также запрещены комментарии с призывами к насилию или травле.
Стандартная ситуация для политических дискуссий в интернете.
Отбрасывая ссылки, сообщения администрации, прочий шум — переходим непосредственно к анализу смысловой нагрузки комментариев:
Ермошина подтвердила, что Тихановская записывала свое обращение в ее кабинете в ЦИКе
DaimosShip,2020-08-14 23:05:41,
Ермошина подтвердила, что Тихановская записывала свое обращение в ее кабинете в ЦИКе
DaimosShip,2020-08-14 23:05:52,
Ермошина подтвердила, что Тихановская записывала свое обращение в ее кабинете в ЦИКе
DaimosShip,2020-08-14 23:05:26,
Ермошина подтвердила, что Тихановская записывала свое обращение в ее кабинете в ЦИКе
DaimosShip,2020-08-14 23:05:22,
Ермошина подтвердила, что Тихановская записывала свое обращение в ее кабинете в ЦИКе
DaimosShip,2020-08-14 23:07:02,
Ермошина подтвердила, что Тихановская записывала свое обращение в ее кабинете в ЦИКе
DaimosShip,2020-08-14 23:06:53,
Ермошина подтвердила, что Тихановская записывала свое обращение в ее кабинете в ЦИКе
DaimosShip,2020-08-14 23:06:18,
Ермошина подтвердила, что Тихановская записывала свое обращение в ее кабинете в ЦИКе
Человек за пять минут написал 8 одинаковых сообщений в одной и той же теме, касающихся событий в Белоруссии. Всего в базу попало 260 сообщения данного автора, беглый взгляд на них даёт понять явное негативное отношение к ситуации в Белоруссии, так же сам пользователь идёт на опережения и в качестве аргументов сам называет своих оппонентов ботами.
А ещё у него брат был наблюдателем на выборах:
DaimosShip,2020-08-18 22:52:41
У меня брат был наблюдателем — никуда не пустили
Остаётся ещё около 17 миллионов Вермахта и СС.Не буду утверждать точно, но читал немецкого исследователя, он пишет, что 80% вермахта (НЕ СС!) участвовали в актах геноцида и других военных преступлениях.
NoisePanzer,2017-11-20 15:33:26,
Вы не правы. Читал книгу немецкого исследователя о добровольческом батальоне вермахта. Люди (подавляющее большинство!) добровольно шли убивать невиновных. Работ на эту тему, явно доказывающих, что БОЛЬШИНСТВО немцев было не против массовых убийств очень много. Если вы (вполне резонно) не верите мне, ссылки откопаю и приведу вам.
NoisePanzer,2017-11-20 15:26:55,
Нет. Вы не правы. Читал книгу немецкого исследователя о добровольческом батальоне вермахта. Люди (подавляющее большинство!) добровольно шли убивать невиновных. Работ на эту тему, явно доказывающих, что БОЛЬШИНСТВО немцев было не против массовых убийств очень много. Если вы (вполне резонно) не верите мне, ссылки откопаю и приведу вам.
NoisePanzer,2017-11-21 03:51:46,
Нет. Вы не правы. Читал книгу немецкого исследователя о добровольческом батальоне вермахта. Люди (подавляющее большинство!) добровольно шли убивать невиновных. Работ на эту тему, явно доказывающих, что БОЛЬШИНСТВО немцев было не против массовых убийств очень много. Если вы (вполне резонно) не верите мне, ссылки откопаю и приведу вам.
NoisePanzer,2017-11-21 03:52:14,
Нет. Вы не правы. Читал книгу немецкого исследователя о добровольческом батальоне вермахта. Люди (подавляющее большинство!) добровольно шли убивать невиновных. Работ на эту тему, явно доказывающих, что БОЛЬШИНСТВО немцев было не против массовых убийств очень много. Если вы (вполне резонно) не верите мне, ссылки откопаю и приведу вам.
NoisePanzer,2017-11-21 03:53:22,
Читал книгу немецкого исследователя о добровольческом батальоне вермахта. Люди (подавляющее большинство!) добровольно шли убивать невиновных. Работ на эту тему, явно доказывающих, что БОЛЬШИНСТВО немцев было не против массовых убийств очень много. Если вы (вполне резонно) не верите мне, ссылки откопаю и приведу вам.
Автор явно любитель немецкой исторической литературы
Интересная тенденция на Пикабу вырисовывается, последние пару дней замечаю все больше заплюсованых постов с негативным отношением к императору. Неужели фабрика троллей сбавила обороты и мы можем видеть реальные настроения в интернете?
Kumuj,2018-03-25 01:53:56,
Интересная тенденция на Пикабу вырисовывается, последние пару дней замечаю все больше заплюсованых постов с негативным отношением к императору. Неужели фабрика троллей сбавила обороты и мы можем видеть реальные настроения в интернете?
Kumuj,2018-03-25 01:46:26,
Интересная тенденция на Пикабу вырисовывается, последние пару дней замечаю все больше заплюсованых постов с негативным отношением к императору. Неужели фабрика троллей после выборов сбавила обороты и мы можем видеть реальные настроения юзеров в интернете?
Kumuj,2018-03-25 01:42:29,
Интересная тенденция на Пикабу вырисовывается, последние пару дней замечаю все больше заплюсованых постов с негативным отношением к императору. Неужели фабрика троллей сбавила обороты и мы можем видеть реальные настроения в интернете?
Человек ищет следы фабрики троллей. Привет, коллега.
на мой взгляд здесь будет кстати цитата из Пелевина:"«Так вот, «уловка-22» заключается в следующем: какие бы слова ни произносились на политической сцене, сам факт появления человека на этой сцене доказывает, что перед нами блядь и провокатор. Потому что если бы этот человек не был блядью и провокатором, его бы никто на политическую сцену не пропустил — там три кольца оцепления с пулемётами. Элементарно, Ватсон: если девушка сосёт хуй в публичном доме, из этого с высокой степенью вероятности следует, что перед нами проститутка. Я почувствовал обиду за свое поколение.— Почему обязательно проститутка, — сказал я. — А может это белошвейка. Которая только вчера приехала из деревни. И влюбилась в водопроводчика, ремонтирующего в публичном доме душ. А водопроводчик взял её с собой на работу, потому что ей временно негде жить. И там у них выдалась свободная минутка.Самарцев поднял палец:— Вот на этом невысказанном предположении и держится весь хрупкий механизм нашего молодого народовластия…»"
Fynjif18,2020-09-09 13:44:56,
Ну что же вы это прям по Пелевину.— Правильно, — сказал Самарцев. — Так вот, «уловка-22» заключается в следующем: какие бы слова ни произносились на политической сцене, сам факт появления человека на этой сцене доказывает, что перед нами блядь и провокатор. Потому что если бы этот человек не был блядью и провокатором, его бы никто на политическую сцену не пропустил — там три кольца оцепления с пулеметами. Элементарно, Ватсон: если девушка сосет хуй в публичном доме, из этого с высокой степенью вероятности следует, что перед нами проститутка.
wakeonlan,2020-06-23 01:38:29,
«уловка-22» заключается в следующем: какие бы слова ни произносились на политической сцене, сам факт появления человека на этой сцене доказывает, что перед нами б**дь и провокатор. Потому что если бы этот человек не был б**дью и провокатором, его бы никто на политическую сцену не пропустил — там три кольца оцепления с пулеметами. Элементарно, Ватсон: если девушка сосет х*й в публичном доме, из этого с высокой степенью вероятности следует, что перед нами проститутка.
KKirill1992,2017-06-18 00:06:30,
Знаете, в книге Хеллера "«Уловка-22»" есть один персонаж по имени Орр. Так вот, он прикидывался идиотом, но только для того, чтобы спасти себе жизнь. Это я понимаю.Но вы-то с какой целью прикидываетесь идиотом в комментариях на пикабу? У вас что, за спиной стоит фсбшник с волыной?
nezabuddha,2018-11-01 15:29:56,
ru.m.wikipedia.org/wiki/Уловка-22 Нет. Пелевин лишь цитирует принцип, описанный гораздо раньше.
ihateyou,2016-09-19 02:52:14,
Так вот, «уловка-22» заключается в следующем: какие бы слова ни произносились на политической сцене, сам факт появления человека на этой сцене доказывает, что перед нами блядь и провокатор. Потому что если бы этот человек не был блядью и провокатором, его бы никто на политическую сцену не пропустил — там три кольца оцепления с пулеметами. Элементарно, Ватсон: если девушка сосет хуй в публичном доме, из этого с высокой степенью вероятности следует, что перед нами проститутка. Я почувствовал обиду за свое поколение.— Почему обязательно проститутка, — сказал я. — А может это белошвейка. Которая только вчера приехала из деревни. И влюбилась в водопроводчика, ремонтирующего в публичном доме душ. А водопроводчик взял ее с собой на работу, потому что ей временно негде жить. И там у них выдалась свободная минутка. Самарцев поднял палец:— Вот на этом невысказанном предположении и держится весь хрупкий механизм нашего молодого народовластия…Пелевин "«Empire V»"
Наверное то, что реальность противоположна твоим словам точно не потому что ты здесь откровенно врешь в надежде на то, что сонмы таких же малолетних пизд… Совков тебя заплюсуют.По данным опроса Левады центра уровень поддержки СССР сильно вырос за два десятилетия. Сильнее всего у тех, кому сейчас 18-24 годаВне зависимости от того, как мы разбиваем совокупность респондентов, наиболее сильный рост поддержки от 2008-го к 2019-му году фиксируется в отношении двух позиций, характеризующих Советский Союз как государство социальной справедливости и патернализма. Наиболее заметные изменения в поддержке фиксируются в молодежной средеОдно из самых устойчивых представлений, характеризующих положение дел в Советском Союзе, это представление населения о «дружбе народов», поддержка которого во всех трех опросах находилась на идентичном уровне. Уверенность в отсутствии межнациональных конфликтов всегда входила в тройку самых популярных суждений о СССР. При этом, например, вопросы о депортации народов в советский период давали высокую долю затруднившихся ответить – до трети, что является свидетельством незнания этой страницы в истории своей страны (среди 18-24-летних более половины уходят от содержательного ответа на вопросы о депортациях). Если, напротив, обратиться к суждениям, заметно теряющим поддержку, то на первом месте среди них – «направляющая роль коммунистической партии» (на 14 п.п.) и «очереди, дефицит, карточки» (на 18 п.п.).https://www.levada.ru/2019/06/24/chernovik/
EtovamneTo,2020-08-18 00:50:15,
Каждый раз, когда я кидаю пруфы, я получаю только тишину, оскорбления и демагогию от коммунистов, изучивших историю страны по выпускам Гоблина и пикабушечкам. Естественно, ни и какой культуре или адекватном уровне IQ речи там и нет.Вот вы посмотрите: комментатор выше ничем не подкрепляет свои слова. А теперь посмотрим это: По данным опроса Левады центра уровень поддержки СССР сильно вырос за два десятилетия. Сильнее всего у тех, кому сейчас 18-24 годаВне зависимости от того, как мы разбиваем совокупность респондентов, наиболее сильный рост поддержки от 2008-го к 2019-му году фиксируется в отношении двух позиций, характеризующих Советский Союз как государство социальной справедливости и патернализма. Наиболее заметные изменения в поддержке фиксируются в молодежной средеОдно из самых устойчивых представлений, характеризующих положение дел в Советском Союзе, это представление населения о «дружбе народов», поддержка которого во всех трех опросах находилась на идентичном уровне. Уверенность в отсутствии межнациональных конфликтов всегда входила в тройку самых популярных суждений о СССР. При этом, например, вопросы о депортации народов в советский период давали высокую долю затруднившихся ответить – до трети, что является свидетельством незнания этой страницы в истории своей страны (среди 18-24-летних более половины уходят от содержательного ответа на вопросы о депортациях). Если, напротив, обратиться к суждениям, заметно теряющим поддержку, то на первом месте среди них – «направляющая роль коммунистической партии» (на 14 п.п.) и «очереди, дефицит, карточки» (на 18 п.п.).https://www.levada.ru/2019/06/24/chernovik/
EtovamneTo,2020-08-27 23:22:35,
Нет. Сейчас социалисты те самые малолетние дол*****(с). А это еще в статистику нельзя включать людей моложе 18 лет.По данным опроса Левады центра уровень поддержки СССР сильно вырос за два десятилетия. Сильнее всего у тех, кому сейчас 18-24 годаВне зависимости от того, как мы разбиваем совокупность респондентов, наиболее сильный рост поддержки от 2008-го к 2019-му году фиксируется в отношении двух позиций, характеризующих Советский Союз как государство социальной справедливости и патернализма. Наиболее заметные изменения в поддержке фиксируются в молодежной средеОдно из самых устойчивых представлений, характеризующих положение дел в Советском Союзе, это представление населения о «дружбе народов», поддержка которого во всех трех опросах находилась на идентичном уровне. Уверенность в отсутствии межнациональных конфликтов всегда входила в тройку самых популярных суждений о СССР. При этом, например, вопросы о депортации народов в советский период давали высокую долю затруднившихся ответить – до трети, что является свидетельством незнания этой страницы в истории своей страны (среди 18-24-летних более половины уходят от содержательного ответа на вопросы о депортациях). Если, напротив, обратиться к суждениям, заметно теряющим поддержку, то на первом месте среди них – «направляющая роль коммунистической партии» (на 14 п.п.) и «очереди, дефицит, карточки» (на 18 п.п.).https://www.levada.ru/2019/06/24/chernovik/
EtovamneTo,2020-09-10 03:32:13,
Каких? что популярность тематики резко выросла? Погугли тег СССР с рейтингом выше 25.За август 2010 было 44 таких поста.За август 2020 было 274 таких поста.Или что среди молодежи? Да вотПо данным опроса Левады центра уровень поддержки СССР сильно вырос за два десятилетия. Сильнее всего у тех, кому сейчас 18-24 годаhttps://www.levada.ru/2019/06/24/chernovik/
EtovamneTo,2020-09-09 19:00:42,
По данным опроса Левады центра уровень поддержки СССР сильно вырос за два десятилетия. Сильнее всего у тех, кому сейчас 18-24 годаВне зависимости от того, как мы разбиваем совокупность респондентов, наиболее сильный рост поддержки от 2008-го к 2019-му году фиксируется в отношении двух позиций, характеризующих Советский Союз как государство социальной справедливости и патернализма. Наиболее заметные изменения в поддержке фиксируются в молодежной средеОдно из самых устойчивых представлений, характеризующих положение дел в Советском Союзе, это представление населения о «дружбе народов», поддержка которого во всех трех опросах находилась на идентичном уровне. Уверенность в отсутствии межнациональных конфликтов всегда входила в тройку самых популярных суждений о СССР. При этом, например, вопросы о депортации народов в советский период давали высокую долю затруднившихся ответить – до трети, что является свидетельством незнания этой страницы в истории своей страны (среди 18-24-летних более половины уходят от содержательного ответа на вопросы о депортациях). Если, напротив, обратиться к суждениям, заметно теряющим поддержку, то на первом месте среди них – «направляющая роль коммунистической партии» (на 14 п.п.) и «очереди, дефицит, карточки» (на 18 п.п.).https://www.levada.ru/2019/06/24/chernovik/
Приведенные примеры находились на поверхности. Для выявления более тесных связей необходимо расширить набор данных на порядок, не только по количеству информации, но и по временным отрезкам. Это позволит более точно выявлять ключевые темы, вокруг которых строятся дискуссии, их инициаторов, анализировать временные метки событий и их корреляцию.
Но даже на таком наборе, при детальном ручном анализе, например рассмотрении одиночных связей — можно найти что-то интересное, дающее почву для размышлений и дальнейшей работы.
GitHub
P.S. Обработка матрицы 140000 * 8800000 заняла примерно 7 минут на процессоре rayzen 5 1600
В дальнейшем планирую продолжать данную тему, буду рад критике и предложениям.
aamonster
А если прогнать текст через спеллчекер – он сразу отсеет комментарий 3, и задача упростится ;-)