начало:
www.diary.ru/~SonicCatPap/p45623499.htm#Т.к. мой диплом был без математики, то с помощью руководителя (+ совет еще одного препода) , я решил сделать чтобы сервер предлагал самые подходящие сервисы ( новости ) пользователю, на основании тех новостей, к которым он сейчас подключен.
Свел я эту задачу к задаче определения тематики ( класса ) по тексту.
т.к. тогда каждый сервис ( состоящий из статей ) можно представить вектором характеризующий сколько % текста относиться к каждому классу (тематике), а уже этот вектор можно сравнивать, через скалярное произведение между другими векторами-сервисами. И выдавать пользователю самые похожие сервисы, у которых это скалярное произведение больше.
Я решил воспользоваться для этого нейронными сетями. Увы, их у нас в универе не преподавали поэтому пришлось разбираться самому. Оказалось все тупо, хотя может это потому что я далеко не залезал.
Итак есть сеть, представленная одним слоем нейронов (это которые справа - круг и квадрат вместе ):
Кратко:
На вход поступает представление слов из текста.
На выходе один из классов ( количество классов = количеству нейронов ).
Существует связь между любым словом и каждым классом
В каждом нейроне считается сумма произведений веса (wi) на вход (xi), где эта сума больше значит тот класс и является победителем (ответом)
Подробнее:
читать дальше
На вход я посылаю массив ( вектор ) длинна которого равна кол-ву слов, каждая ячейка отвечает за слово
значение 1 говорит что слово есть, значение 0 говорит что слова нет, этот массив я предварительно нормирую т.е. делю каждую единицу на длину вектора. Также нужно удалять из этого массива, слова которые встречаются в каждом тексте, и не влияют на класс к которому он принадлежит, это в основном предлоги, прилагательные.
начальное значение весов устанавливается случайным образом от 0 до 1
Чтобы все это заработало сеть нужно обучить ( по сути настроить ) т.е. определить подходящие веса для каждой связи.
Для этого я использую обучение с учителем т.е. задаю множество текстов и соответствующие им классы. Затем если сеть определила текст правильно, то ничего не делаю, если неправильно, то корректирую веса входы которых равны 1 на 1/(длина входного вектора)*коэффициент.
Тут я схитрил. Я решил использовать в качестве обучающего множества - сайт lenta.ru. Т.е. я парсю его новости и заодно копирую его классификацию ( Кино Спорт Игры Музыка Интернет Технологии ). Все пишу на php и сохраняю в MySQL. Затем перевожу отпарсенный текст в формат входного вектора т.е. выделяю слова и сохраняю. И под конец запускаю скрипт на обучение.
Пока выходит не очень:
я отпарсил 469 новостей с lenta.ru ( это за продолжительность 10 дней по вышеперечисленным классам )
это 18705 различных слов
удалось выделить 346 слов не влияющих на класс
но после обучения значения нейронов не сильно отличаются друг от друга, гдето на 1 или 2. Но одна коррекция как раз изменяет значение нейрона на 1.
При выборе коэффициента равного 20 у меня нашлось
6105 весов со значением больше 1
6225 весов со значением меньше 0
всео весов 130935
буду думать ...
Хотя вот 2 статьи из инента послал на вход сети и класс определился как я ожидал
Class: 1 S: 0
Class: 5 S: 2.00716842673283
Class: 6 S: 2.47665754082183
Class: 7 S: 0.640066331671634
Class: 8 S: 2.57327291032608
Class: 9 S: 1.29522023314174
Class: 10 S: 6.57391202143353
т.е. тут сеть прямо уверена в классе 10
думаю еще новостей с ленты закачать