- PVSM.RU - https://www.pvsm.ru -

Самые часто употребляемые слова на Хабре

Всем привет, хабрачитатели!

Это статья про очередной хабрапарсер.
В конце сентября я читал какую то статью и там опять были слова «стартап», «инновации», «javascript», «фреймворк».
Казалось что в каждом посте они есть. И я решил это проверить. Подробности под катом.

Написание парсера заняло чуть больше месяца. Писал изредка по настроению, разбирался с LINQ, MySQL и попутно написал еще 2 парсера.
Пользовался SharpDevelop 4.3 [1] и MySQL 5.5.25 из набора Денвер [2].
В качестве клиента на мускул использую Heidi SQL [3].
В базе данных 2 таблицы — tpost

CREATE TABLE `tpost` (
  `id_post` int(10) unsigned NOT NULL,
  `date` date NOT NULL,
  `name_post` varchar(255) NOT NULL,
  `author` varchar(255) NOT NULL,
  PRIMARY KEY (`id_post`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT="инфа о постахrn";

и twordsinpost

CREATE TABLE  `twordsinpost` (
  `id_post` int(10) unsigned NOT NULL,
  `count` int(11) NOT NULL,
  `word` varchar(255) NOT NULL,
  CONSTRAINT `FK_twordsinposts_tpost` FOREIGN KEY (`id_post`) REFERENCES `tpost` (`id_post`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT="количество слов в каждом посте";

Смысл работы — программа проверяет подключение к базе данных. Если удается, пользователь вводит id первого поста и последнего, программа создает для каждого id URL и качает с него страницу. Скачка происходит в однопоточном режиме, чтобы сервер хабра на меня не обиделся. Обработка страниц многопоточная, и загрузка в БД опять в один поток.
В скачанной странице через XPath выкусывается название поста, автор, дата и сама статья. Комменты пока не трогал — их много, это будет возможно реализовано в хабрапарсер 2.0.
В самой статье через регулярку убираются все знаки препинания, кроме точек и пробелов. Все слова переводятся в нижний регистр. Далее подсчитывается, сколько раз каждое слово встречается в данной статье, и записывается в БД.

Поначалу решил подключиться к MySQL через адаптеры (ADO.NET). MySQL connector 5.2.7 подключался к базе, но делал это крайне медленно. Добавление порядка 2000 строк занимало почти 5 минут.
Самые часто употребляемые слова на Хабре

Поэтому написал запросы по старинке, ручками. До Entity Framework еще не добрался, да и не думаю что оно будет быстрее. При этом подключение через адаптеры к MS SQL работает шустро — так же как и с запросами руками. Для тренировки забил MS SQL до 2,5 млн записей — скорость добавления не упала. Но я отвлекся.

Как всегда, при отладке вылезли баги.
1. На хабре бывают статьи без единого слова. До ноября их 716. Крайняя [4].
Находятся по подзапросу [5].
2. На хабре бывают статьи без автора. До ноября их 371. Крайняя [6].
Находятся по подзапросу [7].
3. На хабре есть статья с вирусом. К сожалению, не смог вспомнить адрес. На нее ругался антивирус (AVG) и прибивал всю программу. Пришлось его выключать.

Добавление 200 000 статей было разбито на 2 этапа и заняло в общем 26 часов. Последние статьи были за начало ноября и портили статистику, поэтому я их удалил.

Сейчас в базе примерно 34 миллиона записей. База весит 3 Гб (с индексацией) и включает 199983 статьи.
Настройки MySQL. Вот ini-файл запуска [8].
Ноут — i7, 8 Гб ОЗУ, HDD.
Сделал индексацию по полям (id_post, word, count) в таблице twordsinpost. Вроде стало пошустрее — вместо 2 минут на запрос уходит 30 секунд. Посоветуйте кстати как оптимизировать базу такого размера?

Есть мысль выложить базу на сайт, и написать на PHP простейшую обертку, но пока не научусь заставлять MySQL работать быстрее, приходится запросы набирать ручками. Да и гибче так.
Сам парсер!
Самые часто употребляемые слова на Хабре

Парсер жестко забит на IP 127.0.0.1, название БД — «habraparser», user — «root», password — «1».
Прописано тут — cDataBase.Connect ().

За неимением лучшего выкинул код, базу и результаты на свой дропбокс [9].

Итак, самое интересное!

Результаты всех запросов лежат в файле [10]. Поехали!
На хабре 83174 пустых постов.
Количество постов по месяцам — запрос [11]
Самые часто употребляемые слова на Хабре

Запрос на количество различных слов — запрос [12]. Нужно заменить слово WORD на свое. Очень интересно.
Например, при запросе «хабр%» встретилось слово «хабрареволюция». А на запрос «путин%» сами посмотрите.

И самый главный запрос — на упоминание слова в постах по месяцам — запрос [13].
Все точно так же, заменяете «WORD» на свое. Я начал со слова «java».
Самые часто употребляемые слова на Хабре

Затем слово «google».
Самые часто употребляемые слова на Хабре

Затем слово «хабр%».
Самые часто употребляемые слова на Хабре

Найти слово «C#» не представляется возможным, поскольку я походу регуляркой удалил решетку. То же и с «C++». Увы.
Слово «android».
Самые часто употребляемые слова на Хабре

Слово «apple».
Самые часто употребляемые слова на Хабре

И наконец мои любимые. «Стартап%».
Самые часто употребляемые слова на Хабре

«javascript».
Самые часто употребляемые слова на Хабре

«фреймворк» или «framework».
Самые часто употребляемые слова на Хабре

«инноваци%».
Самые часто употребляемые слова на Хабре

И напоследок самое вкусное.
Код [14]. Выложил в архиве, если надо залью куда-нибудь еще.
Файл со всеми часто употребляемыми словами [15].
Сама база. 1 077 Мб. Скачать бесплатно без смс [16]. Создавать через HeidiSQL.

В комментах можете предлагать еще интересные слова.

Надеюсь, читать было интересно! Всем спасибо за внимание! С уважением, Muxto [17].

Автор: Muxto

Источник [18]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/mysql/49252

Ссылки в тексте:

[1] SharpDevelop 4.3 : http://www.icsharpcode.net/opensource/sd/

[2] Денвер: http://www.denwer.ru/

[3] Heidi SQL: http://www.heidisql.com/

[4] Крайняя: http://habrahabr.ru/post/199460/

[5] подзапросу: http://pastie.org/8507997

[6] Крайняя: http://habrahabr.ru/post/191746/

[7] подзапросу: http://pastie.org/8508011

[8] ini-файл запуска: http://pastie.org/8507977

[9] дропбокс: https://www.dropbox.com/

[10] файле: https://www.dropbox.com/s/vjiy2vsipbx5s23/%D1%85%D0%B0%D0%B1%D1%80%D0%B0%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D1%8B.xlsx

[11] запрос: http://pastie.org/8508073

[12] запрос: http://pastie.org/8508107

[13] запрос: http://pastie.org/8508112

[14] Код: https://www.dropbox.com/s/bo0wdsxvivrsqo3/habraParser%200.5%20mysql%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D0%B5%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D1%8B.rar

[15] всеми часто употребляемыми словами: https://www.dropbox.com/s/cn2ogrywc0qqn5n/%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BA%D0%B0%20%D1%85%D0%B0%D0%B1%D1%80%20%D0%BB%D1%83%D1%87%D1%88%D0%B8%D0%B5.csv

[16] Скачать бесплатно без смс: https://www.dropbox.com/s/vfjsl25y6721pco/habraparser.sql

[17] Muxto: http://habrahabr.ru/users/muxto/

[18] Источник: http://habrahabr.ru/post/203650/