А ты уже научился заряжать левой ногой свой телефон?
начало: www.diary.ru/~SonicCatPap/p45623499.htm#
Т.к. мой диплом был без математики, то с помощью руководителя (+ совет еще одного препода) , я решил сделать чтобы сервер предлагал самые подходящие сервисы ( новости ) пользователю, на основании тех новостей, к которым он сейчас подключен.
Свел я эту задачу к задаче определения тематики ( класса ) по тексту.
т.к. тогда каждый сервис ( состоящий из статей ) можно представить вектором характеризующий сколько % текста относиться к каждому классу (тематике), а уже этот вектор можно сравнивать, через скалярное произведение между другими векторами-сервисами. И выдавать пользователю самые похожие сервисы, у которых это скалярное произведение больше.
Я решил воспользоваться для этого нейронными сетями. Увы, их у нас в универе не преподавали поэтому пришлось разбираться самому. Оказалось все тупо, хотя может это потому что я далеко не залезал.
Итак есть сеть, представленная одним слоем нейронов (это которые справа - круг и квадрат вместе ):

Кратко:
На вход поступает представление слов из текста.
На выходе один из классов ( количество классов = количеству нейронов ).
Существует связь между любым словом и каждым классом
В каждом нейроне считается сумма произведений веса (wi) на вход (xi), где эта сума больше значит тот класс и является победителем (ответом)
Подробнее:
читать дальше
Т.к. мой диплом был без математики, то с помощью руководителя (+ совет еще одного препода) , я решил сделать чтобы сервер предлагал самые подходящие сервисы ( новости ) пользователю, на основании тех новостей, к которым он сейчас подключен.
Свел я эту задачу к задаче определения тематики ( класса ) по тексту.
т.к. тогда каждый сервис ( состоящий из статей ) можно представить вектором характеризующий сколько % текста относиться к каждому классу (тематике), а уже этот вектор можно сравнивать, через скалярное произведение между другими векторами-сервисами. И выдавать пользователю самые похожие сервисы, у которых это скалярное произведение больше.
Я решил воспользоваться для этого нейронными сетями. Увы, их у нас в универе не преподавали поэтому пришлось разбираться самому. Оказалось все тупо, хотя может это потому что я далеко не залезал.
Итак есть сеть, представленная одним слоем нейронов (это которые справа - круг и квадрат вместе ):

Кратко:
На вход поступает представление слов из текста.
На выходе один из классов ( количество классов = количеству нейронов ).
Существует связь между любым словом и каждым классом
В каждом нейроне считается сумма произведений веса (wi) на вход (xi), где эта сума больше значит тот класс и является победителем (ответом)
Подробнее:
читать дальше
И еще - тоже тестировали и обучали на архиве из 100 тыщ новостей и могу по этому поводу сказать что тексты в новостях не достсаточно четкие - моя реализация постоянно путала к примеру категории Театр, Культура или Политика и Новости из за рубежа.... На более специфичных текстах результаты были более точны. Если интересно, могу покопатся на своем кладбище кода - давно дело было года два назад уже... но я такие вещи не удаляю
А как вы строили входной вектор? У меня это 0 или 1. Вы вводили вес слова по TF-IDF ?
и как вы убирали слова в разных формах типа: "кот", "котенок", "котенка" и др. - это должно быть одно и тоже слово, а именно "кот". Пока на ум приходит только обрубание окончаний, потом проверка по pspell есть ли такое слово и если есть его и считать.
попробуйте воспользоваться стеммером, где-то даже есть класс под php
во нашел forum.dklab.ru/php/advises/HeuristicWithoutTheD...
спасибо
А как обрубал:
Из aspell словарей сгенерил базу словоформ
(id, слово, id_словоформы) one-to-many (id_слоформы, словоформа)
Выбиралась слово по словоформе и в вектрое словоформа заменялась на слово..
собственно реализация была не быстрой в работе. На обучение на 60 или 80 тысячах статей я оставлял крутится сервер на ночь.
Входной вектор составлялся из пердположения(я его когда то на каком то умном сайте вычитал) что входной вектор начинается с n-ого слова в векторе(зависело от длинны нормальизированного вектора) и состоял m-слов(тоже зависело от того же), хотя есть в теории вероятности более точные и академические способы его сформировать. Я же положился на статистическое предположение - типа "Чаще всего вектор..."
нормализированный вектор к примеру
array(
частица => 10//колличество раз встретилось в тексте
физика => 8
квант => 5
атом => 5
бозон => 4
синхрофазатрон =>1
);
n к примеру у нас получилось 3 , а m 3(и з того самого предположения - к сожалению не помню где его откопал и деталей)
Значит вектор на вход должен получится
array(
квант => 5
атом => 5
бозон => 4
);
Вот...
даа поместить все словоформы в базу это сильно, почти все русские слова и их формы в базу запихать )).
я пока пытаюсь понять какие файлы из архива словаря куда надо поместить чтобы не было ошибки:
PSPELL couldn't open the dictionary. reason: No word lists can be found for the language "ru". in C:\Apache\htdocs\pspell.php on line 127
да, его и видел
еще по предподготовке
>удалось выделить 346 слов не влияющих на класс
можно составить частотный словарь, уже по обрубкам после стемера например - выше какого-то порога там и будут общеупотребительные слова (не влияющие на класс), редкие в принципе тоже можно выкинуть
да я как понял вместо слов эти обрубки и хранить в базе
и для этих обрубков считать TF-IDF
aspell.net/win32/
include_once( 'tools.php' );
$str = cp1251_to_utf8("Котс");
$pspell_config = pspell_config_create("ru","","","utf-8");
pspell_config_dict_dir($pspell_config, "C:\Apache\htdocs\dict");
$pspell_link = pspell_new_config($pspell_config);
if (!pspell_check($pspell_link, $str))
{
$suggestions = pspell_suggest($pspell_link, $str);
foreach ($suggestions as $suggestion) {
echo "Possible spelling: $suggestion
";
}
}
Ежели не сложно - отпиши на мыло admin#devgroup.ru
www.diary.ru/~SonicCatPap/p71980345.htm
вообще мне сказали что сети кохонена это лучшее чем я сделал, у меня просто двуслойный персептрон был
исходники да могу вечером залить куданить + сам диплом
идею после сдачи на развивал