22:00 

SonicCat
А ты уже научился заряжать левой ногой свой телефон?
начало: 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
думаю еще новостей с ленты закачать


URL
Комментарии
2008-11-04 в 08:40 

Был опыт разарботки на основе наивного алгоритма Баеса... деталей не помню о самом алгоритме, но точно учитывали морфологию и синонимы. Для морфологии использовали словари aspell, а для синонимов - тоже какой то из этой оперы словари...
И еще - тоже тестировали и обучали на архиве из 100 тыщ новостей и могу по этому поводу сказать что тексты в новостях не достсаточно четкие - моя реализация постоянно путала к примеру категории Театр, Культура или Политика и Новости из за рубежа.... На более специфичных текстах результаты были более точны. Если интересно, могу покопатся на своем кладбище кода - давно дело было года два назад уже... но я такие вещи не удаляю :)

URL
2008-11-04 в 09:18 

SonicCat
А ты уже научился заряжать левой ногой свой телефон?
да, спасибо, не знал о такой штуке как Pspell (aspell) попробую ее в действии.

А как вы строили входной вектор? У меня это 0 или 1. Вы вводили вес слова по TF-IDF ?

и как вы убирали слова в разных формах типа: "кот", "котенок", "котенка" и др. - это должно быть одно и тоже слово, а именно "кот". Пока на ум приходит только обрубание окончаний, потом проверка по pspell есть ли такое слово и если есть его и считать.

URL
2008-11-04 в 13:15 

и как вы убирали слова в разных формах типа: "кот", "котенок", "котенка" и др. - это должно быть одно и тоже слово, а именно "кот". Пока на ум приходит только обрубание окончаний, потом проверка по pspell есть ли такое слово и если есть его и считать.

попробуйте воспользоваться стеммером, где-то даже есть класс под php

URL
2008-11-04 в 14:03 

SonicCat
А ты уже научился заряжать левой ногой свой телефон?
Гость
во нашел forum.dklab.ru/php/advises/HeuristicWithoutTheD...
спасибо

URL
2008-11-04 в 14:16 

Да вес слова по TF-IDF - точно помню - хотя суть уже надо освежать.
А как обрубал:
Из aspell словарей сгенерил базу словоформ
(id, слово, id_словоформы) one-to-many (id_слоформы, словоформа)
Выбиралась слово по словоформе и в вектрое словоформа заменялась на слово..
собственно реализация была не быстрой в работе. На обучение на 60 или 80 тысячах статей я оставлял крутится сервер на ночь.
Входной вектор составлялся из пердположения(я его когда то на каком то умном сайте вычитал) что входной вектор начинается с n-ого слова в векторе(зависело от длинны нормальизированного вектора) и состоял m-слов(тоже зависело от того же), хотя есть в теории вероятности более точные и академические способы его сформировать. Я же положился на статистическое предположение - типа "Чаще всего вектор..."

URL
2008-11-04 в 14:23 

Тут наверное пример подошел бы
нормализированный вектор к примеру
array(
частица => 10//колличество раз встретилось в тексте
физика => 8
квант => 5
атом => 5
бозон => 4
синхрофазатрон =>1
);
n к примеру у нас получилось 3 , а m 3(и з того самого предположения - к сожалению не помню где его откопал и деталей)
Значит вектор на вход должен получится
array(
квант => 5
атом => 5
бозон => 4
);
Вот... :)

URL
2008-11-04 в 14:57 

SonicCat
А ты уже научился заряжать левой ногой свой телефон?
kasyaar
даа поместить все словоформы в базу это сильно, почти все русские слова и их формы в базу запихать )).
я пока пытаюсь понять какие файлы из архива словаря куда надо поместить чтобы не было ошибки:

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

URL
2008-11-04 в 16:16 

Гость во нашел forum.dklab.ru/php/advises/HeuristicWithoutTheD... спасибо
да, его и видел

еще по предподготовке
>удалось выделить 346 слов не влияющих на класс
можно составить частотный словарь, уже по обрубкам после стемера например - выше какого-то порога там и будут общеупотребительные слова (не влияющие на класс), редкие в принципе тоже можно выкинуть

URL
2008-11-04 в 16:18 

SonicCat
А ты уже научился заряжать левой ногой свой телефон?
Гость
да я как понял вместо слов эти обрубки и хранить в базе
и для этих обрубков считать TF-IDF

URL
2008-11-04 в 18:02 

SonicCat
А ты уже научился заряжать левой ногой свой телефон?
Во, заработало. Оказалось нужно было скачивать скомпилированные словари:
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
";
}
}

URL
2010-06-02 в 15:21 

Чем закончилась работа? Исходники в паблик не дашь посмотреть? Я вот последнее время интересуюсь этим всем. Хочу провести небольшое исследование на основе алгоритма BM24f
Ежели не сложно - отпиши на мыло admin#devgroup.ru

URL
2010-06-02 в 15:40 

SonicCat
А ты уже научился заряжать левой ногой свой телефон?
диплом написал, и оно нормально работало на статьях из ленты и компьюленты
www.diary.ru/~SonicCatPap/p71980345.htm

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

идею после сдачи на развивал

URL
2013-12-01 в 07:52 

Похожее есть что-нибудь?

URL
2013-12-01 в 13:59 

SonicCat
А ты уже научился заряжать левой ногой свой телефон?
Не, по этой теме больше ничего не делал. Сейчас всецело посвящен клиентской разработке под ios)

URL
   

Дневник SonicCat

главная