[{{mminutes}}:{{sseconds}}] X
Пользователь приглашает вас присоединиться к открытой игре игре с друзьями .

Форум «Пит-стоп» / Словарный запас чата и база всех сообщений

Passer Сообщение #1 23 марта 2015 в 02:18
Маньяк
18
Я на днях немного упоролся и скачал логи чата с 1 января 2013 года по 15 марта 2015. Это оказалось довольно просто и быстро и поэтому я решил, что на этом останавливаться не стоит и надо бы занести всё в базу. И я занес уже 862 384 сообщений за весь 2013 год.

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

скачать с dropbox урезанную версию без ников пользователей (полную спрашивайте приватно)
скачать с copy то же и самое

UPDATE: 1 734 961 сообщений за 2013-01-01 - 2015-03-14
скачать с dropbox урезанную версию без ников пользователей (полную даю лично)



Это sqlite база, лично я с ней работаю через утилиту sqlite3. Изнутри база из себя представляет 3 таблицы:

messages (id, username, message, time, timestamp)
words (id, word, count)
usages (word_id, message_id)

В таблице words содержатся слова, найденные по регулярному выражению:
([а-яА-Я]+-[а-яА-Я]+)|([а-яА-Я]+)

и количество использований в сообщениях, не больше одного использования в одном сообщении - здесь, наверное, я лохонулся и надо было колонку count вынести в таблицу usages, но уже пофиг. Иными словами: если слово в сообщении используется несколько раз ("если бы я был богат, я бы дозаправил клавогонки"), то в words.count это было посчитано за один раз.

Таблица usages связывает слово с сообщением, в котором оно было использовано один или более раз.
То есть запросом
select username, message from messages join usages on messages.id=usages.message_id where usages.word_id=1;

можно вывести все сообщения, в которых используется слово с id=1 (слово "так").

Пожалуй отвечу на очевидный вопрос: а нафига это надо?
- Да просто так. Мне показалось забавным написать парсер и забить всё в базу и я на быструю руку это реализовал. Но а раз уж у меня что-то получилось, не удалять же это теперь.

Возможно, кому-то еще это покажется интересным и может быть кто-то придумает, как можно использовать то, что у меня получилось. Хоть логи и публичны и каждый пользователь понимает, что его сообщения могут читать все, кому не лень, я все-таки спрятал ники пользователей в базе, которую я предоставляю публично. Но я с радостью предоставлю полную версию базы любому, кто у меня ее спросит, приватно.

Вот какие у меня возникали идеи, как можно было бы это использовать:
  • топ слов - по сути уже реализован, но ему не повредил бы фильтр что ли,
  • график количества сообщений по часам/дням/месяцам,
  • слова опять же если их отфильтровать глазом или еще как-то можно использовать для создания пользовательских словарей.


un4given, например, написал генератор сообщений-бреда пользователя на основе его слов в чате своими силами, теперь вот мог бы использовать для этого базу. Если захочет, поделится ссылкой сам.

Если у кого-то есть только идеи и/или алгоритмы для реализации, но не хватает знаний для воплощения, то буду рад их рассмотреть и если будет желание/время/умения, то с радостью реализую.
Последний раз отредактировано 26 марта 2015 в 18:44 пользователем Passer
Passer Сообщение #2 23 марта 2015 в 02:25
Маньяк
18
Топ 10 слов:
select word, count from words order by count desc limit 10;

не|111588
я|99571
в|91856
и|84502
а|67376
на|61301
да|50198
что|49742
это|47108
с|37335


Топ 10 слов с количеством букв больше 3:
select word, count from words where length(word) > 3 order by count desc limit 10;

меня|25656
если|14196
есть|13320
надо|12209
только|12164
можно|10675
тебя|10199
просто|10024
тоже|9933
будет|9850


Количество слов. Число не точное, выше описано, почему.
select sum(count) from words;

3 981 499


Количество уникальных слов. На самом деле очень много среди этих слов - слова с опечатками или всякая ересь.
select count(*) from words;

226 402

Количество замеченных в чате пользователей. Доступно в полной версии.
select count(*) from (select count(*) from messages group by username);

3665
Отсюда среднее количество сообщений, оставленных одним пользователем: 862384/3665=235,3
Последний раз отредактировано 23 марта 2015 в 02:47 пользователем Passer
Passer Сообщение #3 23 марта 2015 в 20:19
Маньяк
18
Количество сообщений, оставленных пользователем в дни, когда он появлялся:
select username, count(*) as cnt, strftime('%Y-%m-%d', timestamp / 1000, 'unixepoch') as day from messages group by username, day;


Количество дней, когда пользователь появлялся в чате:
select count(*) as days_count, username from (select username, count(*) as cnt, strftime('%Y-%m-%d', timestamp / 1000, 'unixepoch') as day from messages group by username, day)


И количество пользователей, которые появлялись в чате больше чем 1 день:
select count(*) from (select count(*) as days_count, username from (select username, count(*) as cnt, strftime('%Y-%m-%d', timestamp / 1000, 'unixepoch') as day from messages group by username, day) group by username having days_count > 1);


1267

То есть в чате за год засветилось 3665 разных пользователей и только 1267 (34.5%) из них хотя бы один раз вернулись в чат в другой день.


86 пользователей появлялись в чате больше 50 дней.
Последний раз отредактировано 23 марта 2015 в 20:22 пользователем Passer
Passer Сообщение #4 23 марта 2015 в 20:25
Маньяк
18
Количество сообщений в чате по месяцам:
select strftime('%m', timestamp / 1000, 'unixepoch') as month, count(*) as cnt from messages group by month;

01|82328
02|69162
03|77370
04|66468
05|52364
06|35540
07|35902
08|66520
09|80458
10|77773
11|93483
12|125016
Passer Сообщение #5 23 марта 2015 в 22:49
Маньяк
18
Windows (точнее консоль) не очень дружит с русскими символами (utf8), что немного затрудняет использование sqlite3. Отобразить русские символы еще можно, если перед использованием sqlite3 вбить:
chcp 65001

А вот ввод чего-нибудь русского в запросах лично у меня приводил к вылетанию sqlite3 утилиты.

В свою очередь например на ubuntu все работает на ура:
sudo apt-get install sqlite3
sqlite3 /path/to/chatlogs.db
...

Passer Сообщение #6 23 марта 2015 в 23:19
Маньяк
18
Топ приветственных слов, которое я вспомнил:
select word, id from words where word in ("привет", "здравствуйте", "здорово", "здарова", "саламалейкум", "салам", "здрасте", "здрасти", "ахой", "чау", "хелло", "хеллоу") order by count desc;

привет|6702
здравствуйте|280
здарова|221
здорово|198
здрасте|134
хеллоу|123
здрасти|64
салам|41
хелло|18
чау|2
Последний раз отредактировано 24 марта 2015 в 01:16 пользователем Passer
un4given Сообщение #7 24 марта 2015 в 00:46
Клавокодер
122
Последний раз отредактировано 2 декабря 2018 в 23:49 пользователем un4given
Passer Сообщение #8 24 марта 2015 в 01:15
Маньяк
18
select word, count from words where word in ("привет", "здравствуйте", "здорово", "здарова", "саламалейкум", "салам", "здрасте", "здрасти", "ахой", "чау", "хелло", "хеллоу", "хай", "халло", "салют", "превед", "приветствую") order by count desc;

привет|6702
хай|927
превед|381
здравствуйте|280
здарова|221
здорово|198 употребление этого слова как приветственного, кстати, сомнительно
приветствую|192
здрасте|134
хеллоу|123
салют|89
здрасти|64
халло|49
салам|41
хелло|18
чау|2
Последний раз отредактировано 24 марта 2015 в 01:19 пользователем Passer
Passer Сообщение #9 24 марта 2015 в 01:28
Маньяк
18
Слово "ок" использовалось только в
select count from words where word="ок";

7891 сообщении из 862+к. По-моему, мало. Либо народ не любит соглашаться, либо делает это другими словами.
Passer Сообщение #10 24 марта 2015 в 19:32
Маньяк
18
Словарный запас для каждого пользователя:
select distinct word_id, words.word, messages.username from usages join messages on message_id=messages.id, words on words.id=word_id;


Можно, кстати, вынести в отдельную таблицу.

Топ 10 пользователей, использующих больше разных слов в своих сообщениях:
select username, count(*) as cnt from
  (select distinct word_id, messages.username from usages join messages on message_id=messages.id)
group by username order by cnt desc limit 10;

un4given 45404
udezik 36808
Slonic 27982
sudo 25029
buzzy 24626
IGovernFun 21178
Vicompte 20698
G-Light 19455
Роша 17740
batton 17033

Важно. Словом считается любая последовательность русских букв. То есть каждая падежная форма слова считается новым словом. Здесь можно было бы воспользоваться алгоритмом стемминга для выдачи более правдивого результата.
Последний раз отредактировано 24 марта 2015 в 19:34 пользователем Passer
Passer Сообщение #11 25 марта 2015 в 00:16
Маньяк
18
Немного визуализации:


По рекомендации ун4а сервис: https://www.jasondavies.com/wordcloud/#
На скриншоте 500 слов из топа 1000.

Скачать список слов вместе с повторениями. Можно копипастить сразу в текстовое поле, менять настройки по вкусу и смотреть на результат.

Запрос:
select word, count from words where length(word) > 2 and not word like "%-%" order by count desc limit 1000;


Я попутно удалил 10 нецензурных слов, если что, так что по факту топ990.

P.S. Сервис учитывает повторения слов и повторяющиеся чаще рисует бОльшими бувами. Чтобы не повторять каждое слово по несколько тысяч раз согласно топу я взял минимальное значение count и все остальные count разделил на него (repeats = round(word.count / min)) и потом каждое из слов повторил в файле посчитанное количество раз. Делал я это в консоли хрома на javascript само собой, опять же на скорую руку.
Последний раз отредактировано 25 марта 2015 в 00:25 пользователем Passer
Passer Сообщение #12 26 марта 2015 в 00:52
Маньяк
18
Топ 100 слов с количеством букв >= 8


Топ 500 слов с количеством букв >= 8


Запрос:
select word, count from words where length(word) >= 8 and id not in (94649, 94628) and not word like "%-%" order by count desc limit 500;
Последний раз отредактировано 26 марта 2015 в 00:53 пользователем Passer
Passer Сообщение #13 26 марта 2015 в 19:06
Маньяк
18
2013.01.01-2015.03.14 dropbox
Эту же ссылку можно найти в первом сообщении.

На днях возникли споры о том, что с файлами работать лучше, чем с базой. Да, работа напрямую с файлами будет намного быстрее, чем с базой, но для работы напрямую с файлами надо
* либо знать какой-то из языков программирования и для более сложных анализов даже на достаточно неплохом уровне (регулярные выражения, массивы, ассоциативные массивы, многомерные массивы, для быстроты структуры данных, например, деревья),
* либо достаточно хорошо знать возможности unix shell, я бы сказал, что очень хорошо и иметь под рукой либо виртуалку с unix-системой, либо эту же unix-систему в установленном виде, либо надеяться, что cygwin под виндой позволит все то же, что доступно в unix shell.

Если посчитать количество сообщений, используя утилиту, напрямую из файла/файлов занимает пару сотен миллисекунд, то через базу это может занять пару секунд. Разница десятикратная, да, но время ожидания в обоих случаях скажем так не ощутимо и не играет роли, если нам не требуется повторить этот процесс несколько сотен/тысяч раз.

В свою очередь познать sql намного проще, все мои запросы выше можно сохранить как views прямо в базе, а также понасоздавать дополнительные таблицы и проставить индексы. Всё это по-прежнему будет храниться в одном файле и для использования не надо ничего устанавливать - большинство утилит на базе sqlite портабельны.

Ну и данные из базы всегда можно вытащить обратно в файл, для этого в sqlite предусмотрены команды
.mode
.output
.separator

Например:
sqlite3 chatlogs_20130101-20150314.db
.mode tabs
.output chatlogs_20130101-20150314.log
select strftime("%Y-%m-%d", timestamp / 1000, "unixepoch"), time, username, message from messages;
Последний раз отредактировано 26 марта 2015 в 19:15 пользователем Passer
Jovany Сообщение #14 26 марта 2015 в 20:28
Новичок
80
Внезапно красное словцо нарисовалось
Passer Сообщение #15 4 апреля 2015 в 18:15
Маньяк
18
График количества сообщений в каждый из дней в период 2013-01-1 - 2015-03-31, реализованный пользователем un4given с использованием Google Charts.



И так выглядит график с интервалом в 7 дней за 2013-01-01 - 2015-01-01. Интервал скорее всего не совпадает с днями недели понедельник-воскресенье:


Если кого интересуют реализации, можете смело обращаться приватно. Всеми своими скриптами, если не брезгуете читать говнокод, с радостью поделюсь.
Nowhereman42nd Сообщение #16 4 апреля 2015 в 20:35
Организатор событий
41
Ну всё, можно словарик делать: самые употребительные слова чата.
ТОМА-АТОМНАЯ Сообщение #17 4 апреля 2015 в 20:39
Организатор событий
116
ага или расширить словарик: бесячные слова.
Не поняла почему Светулька - животное, в ряд расположили. Светулька редко бывает в открытых заездах, но на драге играет неплохо.
Последний раз отредактировано 4 апреля 2015 в 20:40 пользователем ТОМА-АТОМНАЯ
Passer Сообщение #18 4 апреля 2015 в 21:29
Маньяк
18
За 2013 год я уже сделал: http://klavogonki.ru/vocs/104975/

Распорядок слов на картинке случайный. Я некоторые оскорбительные и нецензурные слова убрал, чтоб они ни с кем рядом не оказались. Если кто-то действительно оскорблен тем, как его ник расположился в картинке или не нравится, что он вообще фигурирует в моих "исследованиях", пишите - сделаю фильтр и исключу конкретные ники.
Последний раз отредактировано 4 апреля 2015 в 21:47 пользователем Passer
ТОМА-АТОМНАЯ Сообщение #19 4 апреля 2015 в 21:59
Организатор событий
116
скрытый текст…


За словарик отдельное спасибо.
Brateevsky Сообщение #20 4 мая 2015 в 21:45
Новичок
24
И за экскурс в SQL спасибо.
Знаю хорошо, но не часто пишу такие запросы, как в конце...

Чтобы писать в форуме, нужно зарегистрироваться.


Связаться
Выделить
Выделите фрагменты страницы, относящиеся к вашему сообщению
Скрыть сведения
Скрыть всю личную информацию
Отмена