Архив мая, 2009

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

Этап 1: Определение ключевых слов сайта

1) Получаем страницу
2) Убираем теги, и все кроме букв и пробелов. Знаки препинания заменяем на пробелы. (Цифры удалить!!!)
3) Разбиваем весь текст на слова, то есть делаем одномерный массив слов.
4) удаляем слова меньшие 2 букв
4) Каждое слово прогоняем через стеммер.  Я использую алгоритм Портера. Для тех кто не в курсе стеммер - это программа которая отбразывает от слова суффиксы и приставки, оставляя корень. Алгоритм Портера слаб, но пока сойдет. Как найду морфологический словарь - сменю на него.
5) При прогоне через стеммер создаем новый ассоциативный массив, где ключом будет само слово, а значением колличество повторений слова. Например (”Yandex” =>3, “Тиц” =>5) и т.д.
6) Упорядочиваем ассоциативный массив по убыванию колличества повторений.
7) Удаляем все слова повторяющиеся менее трех раз (колличество под вопросом).
8) В итоге мы получили ключевики сайта с их “тошнотой”. Обычно их на этом этапе 50-100 штук.
9) Проверяем каждый ключевик по базе общих слов не несущих тематику. Например слова: “меня”, “когда”, “сколько” и т.д. Я храню эти слова в отдельной таблице бд и написал отдельный скрипт, который позволяет их сформировать. Обойдя сотню сайтов мы набираем базу самых популярных не имеющих тематику слов.
Этап 2: Создаем тематическую базу

1) Для начала в бд нужно создать три таблицы: “слова”, “тематики” и “веса”.
Поля таблиц:
“Слова”: word_id, word
“Тематики”: theme_id, parent_id, theme
“Веса”: word_id, theme_id, ves
2) Заполняем таблицу тематик. Я для этих целей пользуюсь базой Ашманова (где-то 5000 тематик). Не использую ЯК, потому что сайты в него заносятся вручную, то бишь робот тут не причем. В нашем случае необходимо знать тематику, которую видит робот на обычных сайтов. Я не говорю что тематика по Ашманову совпадет с тем что определил робот яндекса, но нам это и не нужно. Представьте что по Ашманову у нас вышло “кпк” для донора и акцептора, а по яндексу “сотовые телефоны”.Не все ли равно?
3) Самый трудный момент. Выбираем нужную тему, например “интернет-ресуры”. Из найденных в первом этапе ключевиков страницы выбираем относящиеся к этой теме, и проставляем им коэффициенты, насколько сильно они относятся к данной теме (балл от 0 до 1). Позже будем корректировать это значение, сейчас это не суть важно. Это значение и будет синаптической силой. В сумме они дадут активацию нейрона к данной тематике.  В реальности это дает потрясающие возможности даже для многозначных слов. Например слово “лук” можно отнести и к кухне и к “охоте”. Это не повлияет на верность определения.
Этот момент трудный, потому что придется обойти множество сайтов, чтобы собрать хотя бы по 10 слов для каждой тематики. На деле десяти слов вполне достаточно. Итого необходимо 50000 слов, чтобы определить тему сайта по Ашманову. Кто-то скажет это много, но в день при нормальной оболочке можно легко собрать тысячу слов. Итого 50 дней пассивного труда.
4) Мы создали семантическое ядро для каждой тематики, и указали с каким весом относится к каждой теме определенное слово.

Этап 3: Узнаем тему неизвестных сайтов и корректируем результаты

1) Поскольку мы первоначально как-то обучили программу. Теперь покажу как ей пользоваться.
Для неизвестного сайта выполняем этап 1 и узнаем ключевые слова с “тошнотой”.  В результате полученные примерно 30 ключевиков проверяем по базе к каким темам они относятся и какие коэффициенты имеют.

Примитивный пример:
Текст “Лук и стрелы это лук”.
Лук тошнота 2. Тема “охота” вес 0.7.  Тема “кухня” вес 0.6.
Стрелы тошнота 1.  Тема “охота” вес 0.8.
Находим активацию нейрона:
К теме охота: 0.7*2+1*0.8=2.2
К теме кухня: 0.6*1=0.6

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

Результат.

Данный алгоритм не нуждается в обсуждении его необходимости. Это каждый решает сам для себя. Мне плевать с колокольни если он вам не нужен:)

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

Усиленно читают у меня в блоге:

Google Bookmarks Digg del.icio.us Technorati Yahoo My Web News2.ru БобрДобр.ru Memori.ru МоёМесто.ru Mister Wong

Приветствую всех!
Ужас, я не писал уже больше полмесяца. Работы было очень много. Сейчас наша фирма готовится к релизу idoblog 2.0 (компонент для joomla 1.5, для построения социальных сообществ типа хабр+жж+я.ру), и надеюсь скоро закончится разработка Linkfeedator 2 (анализатор купленных ссылок для популярных бирж).
Вот как раз о нем я хотел бы поговорить, и спросить совета.
Столкнулся с такой проблем - очень легко попасть в шары (линфидатор начнет ходить по сети бесплатно). Хотя я крайне не рекомендовал бы качать такую версию, потому что в ней может быть код, который заберет ваши пароли от аккаунтов бирж. Но врятли кто меня послушает, так что вижу два выхода:

1) Зашифровать коды продукта с помощью ioncube. Но в этом случае две проблемы - клиент может ставиться в локалке на денвер у человека, который имеет динамический ip. В этом случае я не могу сказать - “работай только с определенного ip-адреса”. А если даже заставлю ставить клиент только на сервера, то народ начнет сомневаться, что я сам не краду пароли. Ведь код зашифрован и проверить невозможно.

2) Часть функций linkfeedator будут работать через мой сервер, И я буду вести статистику по заходам с различных ip и под какими логинами заходят. Под логинами тут подразумеваю логин/пароль от оффсайта компонента. Но тут опять минус - линкфидатор позиционировался как автономный клиент, который дает почуствовать независимость от различных сервисов.

Что же делать, я пока не знаю. Может у кого-нибудь есть идеи, как защитить мой продукт?

Усиленно читают у меня в блоге:

Google Bookmarks Digg del.icio.us Technorati Yahoo My Web News2.ru БобрДобр.ru Memori.ru МоёМесто.ru Mister Wong