Что бы такое почитать ...
Sep. 12th, 2010 02:26 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
У некоторых людей возникает вопрос, что бы такое и эдакое почитать ! Замечательно, что у нас есть друзья, которые могут подсказать, но чаще всего вы остаетесь наедине с самим собой и компьютером. Когда-то я решил написать скрипт, который бы мне рекомендовал книги для чтения, учитывая коллективный опыт посетителей онлайн библиотек. Я взял дамп базы данных lib.rus.ec, который был доступен для скачивания, преобразовал его в любимый постгрес, использовал амазоновский алгоритм item-item collaborative filtering ( гуглите ) и накатал sql скрипт, который на основе оценок читателей like-dislike вычисляет матрицу рекомендации. Для доступа к вебу я написал перловый скрипт, который по bookid выдает сортированный по похожести список рекомендованных книг. По-умолчанию, скрипт выдает похожести для книги Стругацких "Понедельник начинается в субботу". Так как я этим занимался в качестве упражнения, то все очень просто и никаких гарантий :) Было бы хорошо прикрутить его к flibusta.net, которой я теперь пользуюсь, но у меня нет данных о ее базе и где можно получить регулярный доступ к ней.
Достал скрипт и стряхнул пыль, можно попробовать. Сам веб-интерфейс.
Достал скрипт и стряхнул пыль, можно попробовать. Сам веб-интерфейс.
-- SQL example, change placeholder '?' by exact itemid -- libbook, libavtorname, libavtor - application specific tables SELECT * from ( select qq.itemid, array_to_string(ihu.category, ',') as categories, array_to_string ( ihu.rates, ',' ) as rates, array_to_string( ARRAY ( select coalesce(la.firstname,'')||' '|| coalesce(la.middlename,'')||' '|| coalesce(la.lastname,'') from libavtorname la, libavtor ba where ba.bookid=qq.itemid and la.authorid=ba.avtorid ),',') as author, ii.smlorig, ii.sml, b.title from ( select itemid2 as itemid from ii_view where itemid1=93860 ) as qq, libbook b, ii_view ii, ihu where b.bookid=qq.itemid and ihu.itemid=b.bookid --and ii.itemid1=? and ii.itemid2=qq.itemid and ii.sml >= ? order by ii.sml des and ii.itemid1=93860 and ii.itemid2=qq.itemid group by qq.itemid, categories, rates, author, ii.smlorig, ii.sml, b.title order by ii.sml desc limit 10 ) as t;