Алгоритм рекомендаций после загрузки файла для Инфостарта

1. support 4449 17.09.15 21:29 Сейчас в теме
Итак, исходные данные.
Есть таблица загрузок всех файлов за несколько лет:
ID файла, дата-время загрузки, ID пользователя.

Есть описание, теги, классификаторы, рейтинги у файла. Полнотекстовый поиск по всем публиками с файлами.

Надо пользователю выдать рекомендации после того, как он скачал очередной файл.

Необходимо получить 10 id рекомендованных файлов.

Какой оптимальный алгоритм?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
24. herfis 500 18.09.15 10:42 Сейчас в теме
(1) support, Красавец :) Еще критерии рекомендаций не выработал, а уже оптимальный запрос на SQL для этого просишь.
Тут только по критериям - обсуждать не переобсуждать.
Есть у меня оптимальный запрос на примете, если критерием будет последние 10 скачанных файлов :)
25. John_d 5432 18.09.15 10:42 Сейчас в теме
(1) Добрый день, Самое простое рекомендовать для скачивания файлы у которых наибольшие скачивания. За вычетом тех файлов которые пользователь уже скачал.
Samojlov_Denis; +1 Ответить
31. support 4449 18.09.15 11:24 Сейчас в теме
(25) John_d, (26) chavalah, и остальным, кто предлагает подобные алгоритмы.
Все это попадает в понятие "банановая ловушка".
Когда будут предлагаться при любом скачивании файла самый ходовой файл. Это как в магазине, чтобы вы не купили, вам бы рекомендовали банан, так как он самый популярный товар среди всех, в том числе и тех, кто покупал вами выбранный товар.
35. ya.Avoronov 115 18.09.15 12:04 Сейчас в теме
(31) support, а какую вы цель преследуете выводом списка 10 файлов? Если не хотите предлагать топовые закачки, то предлагайте файлы среднего рейтинга. Скажем нижние 10 файлов топ 1000. Там всегда будет смена позиций. Ну и формировать Топы к примеру за период 3 месяца. Простой запрос, никаких виртуальных таблиц.
37. John_d 5432 18.09.15 12:25 Сейчас в теме
(31) support, получается если покупатель покупает каждый день бананы, то ему их продолжают рекомендовать к покупке...

Чтобы не рекомендовать одно и тоже. Можно делать выборку из Топ 100 и случайным образом выбирать из нее 10.
39. John_d 5432 18.09.15 12:34 Сейчас в теме
(37) аналогия с бананами навела на мысль. Если он каждый день покупает бананы значит ему нужно рекомендовать товары из группы фрукты.
Топ 100 из Фрукты ( 10 случайным образом )
42. John_d 5432 18.09.15 12:40 Сейчас в теме
(39) можно даже так:
Если он покупает Фрукты (20%)
Сладкое (30%)
Молочку (50%)
То учитывать это так:
Топ 100 Фрукты (2 шт. случайным образом)
Топ 100 Сладкое (3 шт. случайным образом)
Топ 100 Молочку (5 шт. случайным образом)
40. chavalah 1073 18.09.15 12:35 Сейчас в теме
(31) тогда вообще нет смысла анализировать историю, т.к. по ней получится только "банановый алгоритм" :))
Как вариант, отказаться от истории и строить систему рекомендаций, ориентированную на персональное поведение пользователя
46. solutioncp24 136 18.09.15 12:48 Сейчас в теме
(31) support, А что мешает каждый раз исключать из запроса банан (в данном случее удалять из рекомендаций то что пользователь скачивал уже) + фильтр по короткому промежутку времени и вуаля "бананьев нема") в предложенном мной варианте это реализовано
28. Поручик 4675 18.09.15 11:15 Сейчас в теме
(1) В 1С эта задача называется поиск ассоциаций, вроде.
(16) SOUNDEX() во всех вариантах никогда не будет дружить с кириллицей, потому что изначально алгоритм разработан именно для английского языка.
43. Kashemir 352 18.09.15 12:42 Сейчас в теме
(28) Поручик, предварительная транслитерация решает эту проблему ;-)
38. TuneSoft 248 18.09.15 12:34 Сейчас в теме
(1) support,

мне ближе такой алгоритм:
1. При записи каждой публикации делать выборку ключевых фраз из содержания статьи и других свойств по заранее подготовленному словарю "ключевых фраз" (чтобы не делать привязку статьи к "пустым" незначащим фразам).
2. Найденные ключевые фразы через идентификаторы привязать к публикации.
3. После скачивания очередного файла пользователем сделать сопоставление "ключевых фраз" из статей, в которых пользователь в последнее время скачивал файлы с другими публикациями.
4. Показать в выборке публикации с наибольшим совпадением "ключевых фраз".
51. kuntashov 449 18.09.15 13:31 Сейчас в теме
(1) support, Доржи, а битриксовские механизмы BigData не думали применить, вроде бы они как раз эту задачу и решают (рассчитывают рекомендации, что предложить клиенту на основе покупок).
Я понимаю, что там формат может быть другим (у них под и-магазин заточено), но возможно, ваши данные можно реструктурировать под нужный формат и скормить их API?
Тут скаченный файл = товар,
"Корзина" (что вместе с чем куплено) = последовательные скачивания файлов в течение какого-то ограниченного периода времени одним и тем же пользователем

Так или иначе, это задача из области data mining, что-то вроде фасетной классификации.
Решения этой задачи в общем виде уже есть в разных библиотеках, обычно их уже и используют (популярностью питоновские пользуются) и задача сводится к правильной подготовке исходных данных (к приведению их к виду, который ждет библиотека классификации).
53. kuntashov 449 18.09.15 13:34 Сейчас в теме
+ (51) чукча писатель, а не читатель :) в (33) ildarovich суть то же самое и написал
62. Kuzya_brаtsk 311 18.09.15 15:59 Сейчас в теме
(1) support, Как я понял в конце каждой записи есть, автор самого файла, можно сделать топ например 5-ти авторов у которых скачивал пользователь. И по этим авторам выдать по 1-му последнему творению от каждого автора. А следующие 5 это будут просто лучшие аналоги творений других авторов. Как вам такой подход?
70. XelOla 17 19.09.15 15:36 Сейчас в теме
(1)
я, простите, все не читала
но я соглашаюсь с темой лебедевым на тему "Если я уже купил кроссовки, зачем вы мне снова мне рекомендуете их купить".
Не дословно, но как то так.
78. djvu 143 22.09.15 16:06 Сейчас в теме
1. Отбираем загрузки пользователя
2. Выкидываем их из реестра
3. Присваиваем вес "1" всем остальным загрузкам
4. Суммируем веса
5. Выбираем первые 10 загрузок с максимальным весом

Пример:

ВЫБРАТЬ ПЕРВЫЕ 10
	ВЗЗагрузкиДругихПользователейСВесом.ИД КАК ИД,
	ВЗЗагрузкиДругихПользователейСВесом.Вес КАК Вес
ИЗ
	(ВЫБРАТЬ
		ВТРеестрЗагрузок.ИД КАК ИД,
		СУММА(1) КАК Вес
	ИЗ
		(ВЫБРАТЬ РАЗЛИЧНЫЕ
			ВТРеестрЗагрузок.ИД КАК ИД,
			ВТРеестрЗагрузок.Пользователь КАК Пользователь
		ИЗ
			ВТРеестрЗагрузок КАК ВТРеестрЗагрузок
		ГДЕ
			ВТРеестрЗагрузок.Пользователь = &Пользователь) КАК ВЗЗагрузкиПользователя,
		ВТРеестрЗагрузок КАК ВТРеестрЗагрузок
	ГДЕ
		НЕ ВТРеестрЗагрузок.ИД В (ВЗЗагрузкиПользователя.ИД)
	
	СГРУППИРОВАТЬ ПО
		ВТРеестрЗагрузок.ИД) КАК ВЗЗагрузкиДругихПользователейСВесом

УПОРЯДОЧИТЬ ПО
	ВЗЗагрузкиДругихПользователейСВесом.Вес УБЫВ
Показать
83. mshapkin 54 21.11.18 07:22 Сейчас в теме
(1) sel ect count(id), id fr om t where id not in (select id fr om t wh ere user=currentuser) order by 1 desc limit 10
2. Гость 17.09.15 23:33
К черту подробности. Язык какой?
unknownDaemon; +1 Ответить
3. support 4449 17.09.15 23:54 Сейчас в теме
4. support 4449 17.09.15 23:55 Сейчас в теме
Для примера, вот кусок лога
6828996 17.09.2015 14:53:04 Закрытие ошибок партионного учета Анализ ошибок партионного учета или Закат солнца вручную Да Akvals
6828994 17.09.2015 14:51:56 ТТН Внешние печатные формы ТОРГ-12, Счет-Фактура, 1-Т и ТТН для УТ 11 Да tiger
6828993 17.09.2015 14:51:32 Архив с обработкой и xsd схеммой Redmine - библиотека для интеграции с 1с Да shtyk80
6828992 17.09.2015 14:51:26 1-Т Внешние печатные формы ТОРГ-12, Счет-Фактура, 1-Т и ТТН для УТ 11 Да tiger
6828991 17.09.2015 14:50:39 ОбработатьДанныеПервичныхДокументов.epf Заполнение регистра сведений "ДанныеПервичныхДокументов" Да Lizi603
6828990 17.09.2015 14:50:22 Внешний отчет Внешний отчет по наличию счетов-фактур выданных Да serg999
6828989 17.09.2015 14:49:55 ПочасовыеПродажиЧекККМ.erf Почасовой анализ продаж по чекам ККМ Да IBRAGIM551
6828988 17.09.2015 14:49:34 Выгрузка и загрузка данных XML с отбором Выгрузка и загрузка данных XML 8.3 с отбором Да Neco
6828987 17.09.2015 14:48:52 Просмотреть подписки на события для объектов метаданных Подписки на события объектов Метаданных Да serg999
6828986 17.09.2015 14:48:44 ВыгрузкаЗагрузкаJSON_1.2.1.epf (8.3+) Универсальная выгрузка/загрузка данных для отличающихся конфигураций (JSON, Такси+ОФ) Да sarh
6828985 17.09.2015 14:48:41 УНФ_СФ_ВЫДАННАЯ_2012_1137_ Внешняя печатная форма Счет-фактура для УНФ 1.4 Да Eurosoft
6828984 17.09.2015 14:48:24 Акт выполненных работ (оказанных услуг) Акт выполненных работ (оказанных услуг) для Управления небольшой фирмой, ред. 1.4 Да Eurosoft
6828983 17.09.2015 14:46:06 Сравнение остатков регистров учета ТМЦ Сравнение остатков регистров учета ТМЦ Да Akvals
6828982 17.09.2015 14:43:01 Обработка расхождений по партиям(УУ) Корректировка партий по управленческому учету в соответствии с остатками товаров на складах (УПП, возможно УТ) Да Akvals
6828981 17.09.2015 14:42:23 Различие партий и остатков по оптовым складам 1С8.1 УТ, УПП Различие партий товаров и остатков по складам Да Akvals
6828980 17.09.2015 14:42:02 Акт сверки взаиморасчетов по нескольким договорам.erf Акт сверки взаиморасчетов по нескольким договорам Да 18101986
6828979 17.09.2015 14:41:39 Загрузка товаров с Яндекс.Маркет Загрузка товаров с Яндекс.Маркет Да agro23
6828978 17.09.2015 14:41:33 ГрупповаяОбработкаЗаменаПоРеквизиту Групповая Обработка Справочников И Документов (v.3.4) - замена реквизита выражением, удаление объектов - новая версия Да Sadir
6828977 17.09.2015 14:41:22 Перенос данных из УТ 10.3 в УТ 11 Перенос данных из УТ 10.3 в УТ 11.1 Да selinserg
5. support 4449 17.09.15 23:55 Сейчас в теме
В таблице только ID записи, ID файла, ID юзера и Date в unix формате.
29. MiniMuk 10 18.09.15 11:21 Сейчас в теме
(6) support, исходя из этого по пунктам первое получаем что надо выбрать что скачал пользователя. вообще. Получить список обработок. Потом получить список пользователей которые качали те же обработки что и наш пользователь получим таблицу типа пользователь "соискатель" качаемая обработка. потом группируем таблицу по "соискателю" получаем для каждого пользователя количество похожих скачивания. Сортируем по этому количеству. Дальше можно извартится взять первые 10 претендетнов каждому назначить вес от 1 до 10. Выбираем обработки скаченные этими 10 с ранговой массой обработки соответвующей пользователю. Вычитаем из них уже скаченные. группируем обработки с суммированием по массе получаем приорите Вроде как то так.
7. Гость 18.09.15 00:07
Наверно файлы грузят поьзователи-программисты и бухгалтера по их текщей потребности. Точнее потребности предприятий в текщий момент. Там сотни предпочтений выраженных через одни руки которые ищут. Наверно история их загрузок не важна в динамике развития. Только текущие потребности. Могу ошибаться. Но может хватит анализа частоты ключевых слов в названии файла или в его описании.
krv2k; GerHard; iov; mms76; yuryshestakov; +5 Ответить
9. support 4449 18.09.15 08:12 Сейчас в теме
(7) Гость, а если пользователь бухгалтер и на одном предприятии, и в данный момент ищет по одной задаче
26. chavalah 1073 18.09.15 10:48 Сейчас в теме
я думаю так:

есть 2 варианта: отталкиваться от статистики, либо вообще не обращать внимания на историю и делать базу ключевых слов.
Второй вариант сложен, поэтому можно остановится на первом:

Поскольку, как правильно заметил (7) , ситуация может меняться от текущих потребностей, то иного простого способа, как статистика нет. Тогда так:
1. Получаем список тех, кто скачал аналогичный файл.
2. Отбираем все файлы, которые качали люди из списка п 1
3. Группируем количество по ID файла
4. Сортируем по количеству и отбираем top 10.
Все. можно в 1 запрос запихать, но проще разбить или сделать временную таблицу (тогда совсем просто)
27. vasiliy_b 284 18.09.15 10:56 Сейчас в теме
(26) chavalah, Если отбирать все файлы которые скачали пользователи, то проще выбирать просто топ 10, из общего списка. Все таки надо учитывать временной отрезок в котором скачивался тот или иной файл.
8. BackHand001 23 18.09.15 07:17 Сейчас в теме
Индексируй постоянно свою таблицу по Пользователь + Ключевые слова (фразы),
Создай еще одну таблицу по частоте использования Фраза + Пользователь,
Выбирай По Второй таблице,

Удачи.
10. support 4449 18.09.15 08:13 Сейчас в теме
(8) BackHand001, тогда проще просто показать по ключевым словам, кстати, откуда их взять?
13. t278 57 18.09.15 09:18 Сейчас в теме
(10) support, , тогда проще просто показать по ключевым словам, кстати, откуда их взять?
но ведь в публикации автор указывает ключевые слова.!?
11. Diversus 2313 18.09.15 09:03 Сейчас в теме
SEL ECT * FR OM table ORDER BY RAND() WHERE user_uid = 5 LIMIT 10;
Это если MySQL
AlecoZAV; DrAku1a; +2 Ответить
12. salexdv 2336 18.09.15 09:13 Сейчас в теме
По ID файла получаем ID публикации, получаем раздел (категорию) публикации и предлагаем пользователю ТОП-10 файлов из этой категории, которые он не скачивал. Предварительно надо только строить таблицу ID файла ID категории
GerHard; karapuzzzz; e.kogan; +3 Ответить
14. Nefertary 163 18.09.15 09:23 Сейчас в теме
Наверное, надо копать в сторону прикручивания словарной базы
http://www.solarix.ru/sql-dictionary-sdk.shtml
15. vasiliy_b 284 18.09.15 09:27 Сейчас в теме
А я бы сделал так берем Файл который скачивает пользователь, потом ищем пользователей которые скачали этот-же файл, следующее смотрим какие файлы эти пользователи скачивали в течении +- 12 часов топ 10 этих файлов можно и предложить текущему пользователю.
ACE$; krv2k; GerHard; karapuzzzz; NittenRenegade; crosby; angelcoz; bahbah; mcd2003; vasyak319; spleen; e.kogan; vladir; abakcom; Kuzya_brаtsk; KirillM1987; Zhilyakovdr; Sergey.Noskov; GoodZone; FeliceYa; SSidelnikov; Tangram; Патриот; mms76; www2000; julica; TuneSoft; +27 Ответить
16. Kashemir 352 18.09.15 09:29 Сейчас в теме
Можно попробовать увязать историю пользователя с историей загрузки других пользователей. Выбрать наиболее похожую историю и отбирать 10 ссылок из тех что еще не попадали в историю загрузок нашего пользователя. Как функции сравнения можно использовать DIFFERENCE() и SOUNDEX() (возможно не дружат с кириллицей).
17. isn 15 18.09.15 09:31 Сейчас в теме
У нас немного похожая ситуация. У нас есть таблица или несколько таблиц с исходными данными. Для комфортного обращения и получения данных мы создали на самом сервере скл несколько "вьюх" таблиц скл. вьюхи формируются на лету по определенным отборам и результате мы обращаемся за нужными данными к определенной вьюхе. тест показал что обращение к вьюхе и получение из неё данных более быстрее чем обращаться за этими данными к исходной таблице.
18. Гость 18.09.15 09:37
Допустим создать вспомогательную таблицу. В ней 1000 наиболее часто встречающихся слов ВО ВСЕХ публикациях. Потом каждую публикацию оценить по этой 1000 слов. Т.е. частота этого слова в определенной публикации по отношению к частоте этого слова во всех публикациях. Слова фильтрануть глазами. Чтоб не было не относящихся к ИТ сфере.
19. Nefertary 163 18.09.15 09:42 Сейчас в теме
(18) Гость,
Чем и хорош готовый словарь. Отсечь сразу все предлоги, например.
Разные формы одного слова не считать как несколько слов, а как одну.
20. sanek_kop 15 18.09.15 09:45 Сейчас в теме
Возможно не самый оптимальный запрос, но зато рабочий
SEL ECT TOP 10
	Tabl.fileID
FR OM
	Table Tabl (nolock)
	JOIN
	(SELECT TOP 10
		Tabl1.userid User
	FR OM
		Table Tabl1 (nolock)
	WH ERE
		Tabl.fileID = File
	ORDER BY
		Tabl.Date_Time
	) as Users
		ON Tabl.userid = User
GROUP BY 
	Tabl.fileID	
ORDER BY
	max(Tabl.Date_Time)
Показать
maksa2005; Craig; solutioncp24; +3 Ответить
21. Гость 18.09.15 09:46
Согласен. Однако если посчитать фактическую статистику то получится как бы сумма акцентов. Каждый когда пишет описание свой обработки чаще всего будет употреблять слова который важны были именно для него при создании обработки.
22. Fragster 1139 18.09.15 10:21 Сейчас в теме
а почему рейтинги файлов не учитываются? и срок скачивания? вообще тут надо систему коэффициентов ввести.
23. Fragster 1139 18.09.15 10:22 Сейчас в теме
30. primat 3670 18.09.15 11:22 Сейчас в теме
Приветствую!
Знаете, где отлично решена подобная задача? В соц. сети ВК раздел - "Рекомендуемая музыка".
Там человеку действительно то, что ему нравится, рекомендуют. Если регулярно слушать музыку, то это очень заметно.

Там задача поиска рекомендаций решена, на мой взгляд, следующим образом. Смотрят, что слушают и добавляют люди, с которыми у тебя есть совпадения.

Таким образом можно попробовать в контексте текущей задачи как бы быть на шаг впереди пользователя. Берем последовательность из его трех последних загрузок. Ищем такую же последовательность у других пользователей. Если находим, то рекомендуем текущему пользователю то, что другие скачивали на следующем шаге. С большой вероятностью это окажется то, что и ему понадобится.

Вероятно, для инфостарта лучше последовательность длиной 1 смотреть. Но для 2-3-5 последних загрузок пользователя. То есть каждую рассматриваем индивидуально. И для каждой смотрим, что скачивали на следующем шаге те, кто скачивал то, что сейчас скачал пользователь.

Как думаете, так может сработать?
const000; sapervodichka; +2 Ответить
32. Гость 18.09.15 11:28
Где то читал что пытались на теплоходе построить систему анализа движения льдов на километр вперед. Чтобы предугадать и плыть заранее менее трудным путем. Слишком сложно и не предсказуемо. При чем иногда бывает что потребности пользователя и поисковый запрос не совпадают. Поэтому возможно подойдет рандомная выборка.
67. support 4449 18.09.15 22:15 Сейчас в теме
(32) выкинуть бананы нельзя, их очень много. Примерно такую картину мы видим сейчас, с алгоритмом рекомендации банана:
При скачке любого файла, анализируя, кто качал, что они качали в топ 10, исключая, что уже качал.

С этим файлом также скачивают:

Подсистема "Инструменты разработчика" v3.41
Универсальный журнал документов для 1С 8.1, 8.2 и 8.3 (3.20.1.8)
Универсальная консоль отчетов
Обработка для тестирования внешних печатных форм для конфигураций 1С: Предприятия 8.2/8.3 с использованием БСП (Управляемое приложение) (версия 1.2.9)
Запросник
[8.2] Управляемая консоль запросов (только управляемые формы)
Установка автоматического архивир ования д ля 1С 8.1 и 8.2 (4.0.4.2)
Интерактивная оборотно-сальдовая ведомость 2.0
Пример генерации штрих-кода для документов, справочников и его расшифровка
Разукрашка - раскраска кода 1С:Предприятия и Delphi (5.8.1.2)

С небольшими вариациями повторяется.
33. ildarovich 7874 18.09.15 11:33 Сейчас в теме
Интересная задача.
Тем, что, придумав алгоритм, можно будет оценивать успешность его рекомендаций.
Например, для пользователей с четными номерами применять алгоритм А, нечетными - Б.
У кого попаданий больше - тот и лучше.
И очень простая оценка: % попаданий (загрузки в любом будущем из 10-ки, не обязательно сразу).
Так можно построить адаптивные, самообучаемые алгоритмы.
И есть большой набор данных для проверки.
На половине выбрки - обучаем, на второй - проверяем.
Вообще - это классическая задача для БигДата.
Каждый пользователь взял набор товаров (файлов). Один - его только набирает.- Что еще ему можно положить?

Кая я понял, стоит задача сделать что-то попроще.
Но без дополнительных структур данных, кажется, не обойтись.
Пока не понял как можно эффективно задействовать время.

Варианта пока два:
1. "Частота пар". Заводим таблицу, куда складываем частоту пар: (Id1, id2, frequency). Когда очередной пользователь скачивает файл, генерируем пары из очередного файла и всех ранее скачанных и инкрементируем соответствующую частоту.
Чтобы таблица имела предел размера, можно строить простой Хэш(id1, id2) и считать частоту его значений.
Для нахождения Топ10 нужно для каждого файла найти сумму частот в паре со всеми отобранными пользователем и по максимуму этой суммы отобрать файлы.
2. Геометрическая близость.
Всем пользователям присваиваются координаты (две, три или больше - тут нужно подумать). При скачивании файла пользователь перемещается в геометрический центр всех ранее скачанных файлов, а файл - в геометрический центр всех скачавших его пользователей.
Рекомендуются ближайшие нескачанные файлы. Периодически потребуется разреживать это пространство путем масштабирования, а то оно будет сжиматься к центру.

Как-то так.
Но тут нужно пробовать на реальных данных.

Ну а одним запросом к исходной таблице вряд ли целесообразно, так как много вычислений будут повторяться от выбора к выбору.
awk; artbear; e.kogan; i.c.h; AnryMc; mbreaker; +6 Ответить
61. mbreaker 1414 18.09.15 15:30 Сейчас в теме
(33) ildarovich, первый вариант более прост, как в реализации, так и в дальнейшем обслуживании. Плюс, на мой взгляд более объективен. Сам пока читал комментарии хотел предложить подобное.
Два дополнения только:
  • исключить из выборки уже скачанное
  • rand(10) из top(100)
82. cool.vlad4 2 06.10.15 03:00 Сейчас в теме
я как всегда опоздал)
(33) ildarovich, геометрическая близость по описанию похожа на кластеризацию, например на k-means

(1) имхо в теме уже прозвучали ответы. но обычной СУБД и запросами к ней, довольно хлопотно все это делать. есть уже готовые (правда порой монструозные) решения. например - http://www.slideshare.net/CasertaConcepts/analytics-week-recommendations-on-spark

34. Serg82 18.09.15 11:42 Сейчас в теме
(31. support) Предлагаю выдавать 2 варианта списка. 1 по понятиям банановой ловушки и 2й на основе вероятностного подхода
36. solutioncp24 136 18.09.15 12:10 Сейчас в теме
Вот самое простое что в голову пришло: (кстати фильтр по дате не указал намерено для краткости кода(без него никуда естественно) и прошу прощения за ошибки в синтаксисе: не было времени тестить)


Итак допустим tab-имя таблицы и idfile,id_user, datetime -поля , а file и user соответственно входящие данные
Вариант 1 по единственному файлу (что скачал пользователь )
sel ect top 10 idfile from 
(sel ect idfile,(COUNT(id_user))as raiting 
from(sel ect idfile,id_user from tab wehre id_user in (sel ect id_user from tab were idfile=file ) and id_user<>user )
 group by idfile  order by raiting) 


по нескольким файлам что скачивал пользователь

sel ect top 10 idfile fr om 
(select idfile,(COUNT(id_user))as raiting 
fr om(select idfile,id_user fr om tab wehre id_user in (select id_user fr om tab were idfile in (select idfile fr om tab were id_user=user )and id_user<>user ) )
group by idfile  order by raiting) 


З.Ы.
Если кроме анализируемого пользователя файл никто не скачивал то составляем топ по ключевым словам
Суть запроса такова: берем файлы что скачивал юзер втечение последних 30(напиример) дней затем вычисляем список пользователей которые тоже их скачивали, далее находим файлы скачаные втечениие последних 30 дней пользователями из найденого списка и строим рейтинг скачиваний. На этом все.
41. lustin 18.09.15 12:37 Сейчас в теме
(0) задача классическая из CRM - формата "рекомендованный товар". Я сейчас в цейтноте, напишу чуть подробней завтра.

НО - я бы делал не на SQL. Для задачи мы в свое время использовали вот такой подход http://habrahabr.ru/company/yandex/blog/223121/ - то есть это что-то из разряда BI инструмента. А уже в SQL клали расчётные данные.


44. frutty 123 18.09.15 12:43 Сейчас в теме
Может провести сначала опрос на сайте и выяснить с какой целью пользователи заходят на сайт, например я, скачиваю файлы для решения определённой задачи и мне больше бы подошли файлы, которые решают точно такую же задачу, или подобную.

Резюмирую: лучше расширить функционал тэгов.
47. emakei 18.09.15 12:56 Сейчас в теме
Для начала хорошо бы провести классификацию пользователей. Разбить файлы на домены по виду (обработки, документы, статьи и т.д.), областям и т.д. Хорошо бы индекс построить по названиям и описаниям файлов. Подумать как это все на классы разбить. Если пользователь что-то читает/качает/загружает - относить в определенные группы по видам файлов/тематике. До запроса еще далеко, мне кажется )))
П.С. Хотя можно просто слова проанализировать и точно также присвоить каждому поле определенное какие слова чаще встречаются (в полнотекстовом виде, конечно) при загрузке/просмотре/лайках и так подбирать обработки.
П.С.П.С. А лучше просто общий тренд определить (т.е. что пользователи качают просто чаще, то и показывать)
48. emakei 18.09.15 13:00 Сейчас в теме
(47) Ключевые слова: корреляция, регрессия, многофакторный анализ, BI, машинное обучение
49. dim0n_la 94 18.09.15 13:01 Сейчас в теме
Предлагаю внедрить выборку типа : "Выбравшие этот продукт также выбрали: .... "
Ничгео хитрого придумывать не надо. Потребитель вполне может ориентироваться на выбор таких же потербителей, которые искали то же что и он.
GoodZone; +1 Ответить
50. www2000 58 18.09.15 13:25 Сейчас в теме
В реккомендуемые показывать результаты поиска, из которых пользователь открыл скачиваемую обработку.

То есть
1. Создаем таблицу пользователь, запрос, ид обработки из результатов запроса.
2. После запроса заносим туда информацию.
3. Если ИД скачанной обработки найдено в таблице запросов пользователя, тогда берем результаты запроса и уже по какому-то криетрию отбираем оттуда 10 обработок. (случайные, ТОП 10 или др.)

Конечно в этом случае приведенная статистика может не понадобиться, а может быть дополнительным критерием выбора.
52. julica 102 18.09.15 13:33 Сейчас в теме
"Проблему банана" можно было бы решить с помощью методики TF/IDF. Допустим, слово "Яндекс.Маркет", и "загрузка" встречается в конкретном описании 1 раз, а слово "в" - 3 раза. Присваиваем первым двум метрику TF=1, а третьему 1/3. Это поможет снизить ранг стоп-слов. Далее умножим метрики на IDF = log2(N/n), где N - размер выборки, а n - сколько раз встречается слово. Если имеем базу из 10000 файлов, "Яндекс.Маркет" встречается 10 раз, слово "загрузка" - 1000 раз, а "в" - 8000 раз, имеем соответствующие IDF, равные 9.9, 3.3 и 0.3. Перемножаем TF и IDF, получаем 9.9, 3.3 и 0.1.
Далее уже ищем файлы, которые имеют похожие сочетания слов с высоким рейтингом.
54. Dementor 1020 18.09.15 13:37 Сейчас в теме
Я так понимаю, что задача без ключевых слов?
Тогда и думать нечего и нужно решать "в лоб".

Пользователь скачивает файл с кодом ХХХ. Первым подзапросом выбираем пользователей и время скачивания файла ХХХ. Вторым подзапросом получаем список всех файлов для фильтра из первого подзапроса в диапазоне +/- один час. Далее получаем ТОП самых частоскачиваемых и предлагаем пользователю. Готово!
55. УмКо 18.09.15 14:12 Сейчас в теме
На самом деле любую выборку из 10 ответов, т.к. условия задачи позволяют.
56. Идальго 228 18.09.15 14:35 Сейчас в теме
Всем привет! Я думаю, что на статистику опираться в любом случае нужно (т.е. накапливать различные частоты), т.к. вкусы и предпочтения людей не меняются быстро и имеют свойство отражать его потребности, склонности и даже характер. Кроме того, помимо поисковых запросов стоит учитывать деятельность пользователя на форумах и в комментариях к статьям(хотя это вроде одно и то же).
Кстати, ключевые слова вроде есть в статьях. Явные предпочтения пользователь показывает тыкая в звёздочку или скачивая файлики. Хм, может имеет смысл сделать взаимодействие с пользователями (хотя бы на первое время или тем, кто захочет, или за стартмани) - чтобы оценивать удачность рекомендаций или типа того (что-то вроде обучения нейросети).
С наскока задачу подобного класса вряд ли решить. Обязательно нужно почитать на эту тему прежде чем реализовывать. Мне кажется, что вам имеет смысл попробовать узнать, как подобные механизмы устроены в соцсетях, в гугле и т.п.
57. spezc 784 18.09.15 15:04 Сейчас в теме
Исходная таблица:
ID (файл) UserID(пользователь) Date(дата)

п.1. Из исходной таблицы, получаем список ID, где UserID = ТекущийПользователь.
п.2. Из исходной таблицы, получаем список UserID, где ID входит в п.1
п.3. Из исходной таблицы получаем таблицу (первые 10) ID, КоличествоРазличных(UserID) сортированную по КоличествоРазличных(UserID)
58. kite2 59 18.09.15 15:07 Сейчас в теме
Непонятна задача.

Надо пользователю выдать рекомендации на базе этой таблицы после того, как он скачал очередной файл.
Необходимо получить 10 id рекомендованных файлов.

10 id - это 10 рекомендованных файлов?
Какие критерии рекомендации? Надо сначала придумать критерии, по которым будем рекомендовать. Вообще это напоминает задачу для нейронной сети, но честно говоря входных данных маловато для каких-либо рекомендаций. Если только анализировать текст описания по id файла.
59. pvlunegov 157 18.09.15 15:13 Сейчас в теме
Аналогичные задачи решают специалисты Googl-a при выводе возможных поисковых строк человеку.
Где то читал о том, что чем больше информации накоплено по пользователю, тем лучше подбор вариантов поиска соответствует его предпочтениям.
При этом учитываются много видов данных:
Страна, регион, предпочтения, история поиска. и т.п.

Таким образом, чтобы максимально угодить человеку в предложениях имеет смысл учитывать:
1). Историю его скачиваний
2). Должность
3). Пол, возраст
4). Семейное положение
и другие параметры.

Что я имею ввиду? Строим большую таблицу статистик. Чем более обширная она будет, тем лучше будут варианты предложений пользователю.

Постепенно добавляем колонки в таблицу (см. предыдущее), добавляем статистику в разрезах этих данных.

Таким образом статистика скачиваний будет привязана к доп. разрезам.
При накоплении статистики можно добавлять в запрос доп. разрезы.

При первом старте запроса отбираем информацию по минимальному набору отборов, например, по последним 3 скачиваниям.

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

Алгоритм можно продолжать до бесконечности.

Такой метод называется (может я и ошибаюсь) OLAP-кубом, а метод уточнения информации - анализ данных http://habrahabr.ru/company/airbnb/blog/237081/.

Есть даже целая профессия. Специалисты в этой професии очень ценны, с очень большой ЗП.
Такие специалисты особо ценятся в крупных компаниях, типа Google, Yandex и т.п.

Уважаемый автор темы! Поищите диссертации на тему - анализ данных.

Думаю, там вы найдете нужные вам алгоритмы. В Такой статье думаю нету смысла целую науку обсуждать!
63. Leo_A 102 18.09.15 17:37 Сейчас в теме
На мой взгляд, одним списком не обделаться...
Думаю списка должно быть 2, а то и 3.
1. Список - ТОП 10 файлов, которые чаще всего скачивают со скачанным файлом (без учета тематики скачанного файла)
2. Список - ТОП 10 файлов, которые чаще всего скачивают со скачанным файлом (с учетом тематики скачанного файла)
3. Список - ТОП 10 файлов скачанных за последний период (день, неделю, месяц, год) типа как публикации на "БашОрге".

Если список сильно толстый, то можно ограничиться 5-ю файлами каждого раздела.
Что касается первых 2-х выборок, то эту задачу как уже выше писали, решают во многих областях, типа (С этим товаром чаще всего покупают..., С этой музыкой чаще всего слушают..., С этим видео чаще всего смотрят...) и готовых запросов и алгоритмов предостаточно.
Третий алгоритм решается еще проще, но он как раз будет держать в топе всегда одни и те же файлы. Для решения данной проблемы, в алгоритм можно задействовать рейтинг файлов, тогда действительно полезные файлы, которым "плюсуют" рейтинг будут подниматься в топ быстрее, но это же хорошо, пользователям того и нужно.
Ну про исключение из выборки ранее скачанных файлов думаю и так понятно.
PowerBoy; dolter; +2 Ответить
64. speshuric 1331 18.09.15 17:44 Сейчас в теме
если на 1С, то теги на файлы + http://v8.1c.ru/overview/PlAnaliz.htm (кластерный анализ или Поиск ассоциаций) или по тем же тегам строить метрику удалённости и опять же искать ближайшие
kuntashov; +1 Ответить
65. Вадимко 214 18.09.15 18:36 Сейчас в теме
Работа оплачивается?
66. Pasha1st 840 18.09.15 19:14 Сейчас в теме
Исходя из того что в условии почти ничего не сказано ни про критерии ни про все остальное, напишем тупой вариант - "файлы которые качают те кто скачал этот файл в течении последнего месяца" на условном SQL
Предположим что у нас таблица FILES с полями, параметры запроса :USERID и :FILEID
TABLE FILES (FileID,UserId,Dte)
Тогда запрос будет выглядеть примерно так
SEL ECT FileId,COUNT(*)
FR OM FILES AS f1
WHERE Dte>=now()-30*24*60*60 AND f1.UserId IN // Скачанное за последний месяц и пользователь...
( SELECT UserId FR OM FILES AS f3 WHERE f3.FileId=:FILEID AND f3.UserId<>:USERID //... в скачавших этот файл за последний месяц, кроме нас
AND Dte>=now()-30*24*60*60 ) //ограничиваем историю последним месяцем
AND FileId NOT IN (SELECT DISTINCT FileId FR OM FILES WH ERE UserId=:USERID) // Исключим файлы, которые уже скачал данный юзер
GROUP BY 1 ORDER BY 2

На выходе список FileID, с указанием сколько раз скачивался, отсортирован по количеству.
В "банановой ловушке" как таковой я ничего плохого не вижу - если все качают а мы еще нет - почему бы не посоветовать. Но выход (я сознательно не вносил в запрос LIMIT 10) можно просеять рандомом и перемешать, тогда и ловушка не будет влиять. Проще это сделать уже кодом, получившим выборку, или заменить первую строку на
SELECT DISTINCT FileId
а последнюю на
GROUP BY 1 ORDER BY Random() LIM IT 10
Говорить об оптимальности запроса можно будет только после уточнения СУБД и объемов данных.
68. DrAku1a 1721 19.09.15 09:17 Сейчас в теме
Алгоритм примерно такой:
1. Выбрать последних 100 скачавших
2. Для каждого из них выбрать по 10 скачиваний до/после по дате (может быть 5 до, 5 после или 10 до и 10 после)
3. Из полученного списка отобрать 10 наиболее часто встречающихся.
В идеале бы ещё давать оценку по интервалу дат от скачивания данного файла и скачиваний тех, которые собираемся рекомендовать...

Таким образом, при скачивании файла - мы будем рекомендовать не 10 наиболее часто встречающихся вообще, а 10, которые были скачаны совместно примерно в одно и то-же время.
69. Идальго 228 19.09.15 12:22 Сейчас в теме
Так то сперва нужно определиться, что рекомендуем пользователю. Это могут быть и наиболее скачиваемые и, совместно скачиваемые и, наиболее скачиваемые только бухгалтерами, или вообще не скачиваемые, а просматриваемые. и т.д (т.е. у нас пока не определены критерии). Например, если у пользователя нет стармани и он никогда ничего не качал, а только статьи читал, то зачем ему показывать наиболее скачиваемые? Разумнее ему показывать статьи и т.п.
Кароче, прежде всего нужно определиться с видами классификации пользователей и контента (определиться с механизмами для этого), а уже потом думать о критериях для рекомендации того, что этим пользователям стоит показывать.
71. V.Nikonov 120 20.09.15 22:34 Сейчас в теме
Меня как пользователя скачивающего файлы для решения возникшей задачи, в первую очередь интересуют альтернативные решения имеющиеся на ИС. И только во вторую очередь файлы соответствующие моим обобщенным интересам...
Следовательно разумно предлагать компиляцию двух запросов (6 не скаченных альтернатив + 4 ходовых общих)...
1) Вероятно следуем всем файлам приписывать категорию (комбинация классификационных признаков) для быстрого отбора имеющихся файлов той же категории. Присваиваем им рейтинговый коэффициент по совпадению слов текущей статьи и имени файла. Отбрасываем уже скачанные пользователем. Для полученного фильтра считаем частоту скачки. Свежие закачки должны весить больше, чем годичной давности... Получаем Топ6 с учетом рейтингового коэффициента.
2) Топ4 закачек пользователей с моей классификационной категорией за последний месяц.
klinval; kote; +2 Ответить
73. kote 536 21.09.15 10:42 Сейчас в теме
(71) V.Nikonov, да - логично. Но это, всё таки, немного другая рекомендация, привязанная не к пользователю, а к текущей публикации.. Т.е. постановка задачи в топике иная.
Т.е. тогда надо взять текущую публикацию, которую просматривает пользователь - и, как вариант, проанализировать, что скачивали другие пользователи после скачивания файлов из просматриваемой публикации..
74. kote 536 21.09.15 11:00 Сейчас в теме
(73) kote, нет, я ошибся.. постановка задачи привязана к текущей публикации - через уже скачанный файл.

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

Т.е. всё равно надо как-то анализировать ключевые слова / темы или что-то более "интеллектуальное" не связанное с историей..
72. kote 536 21.09.15 10:17 Сейчас в теме
На основе одной таблицы - как не выёживайся особо не нарекомендуешь.. результаты будут получаться убогими, ИМХО.
Можно попробовать инструмен платформы "поиск ассоциативных правил".. В интернете есть публикации по предсказанию покупок на основании чека пользователя.. тут чеком будет последние скачанные файлы.

Но интереснее было бы давать более-менее индивидуально - по группам интересов. .

Для этого:

1) "Кластеризируем" пользователей по группам интересов на основе совпадения списка файлов, которые они закачивали.. возьмём, например, последние 10 файлов - это то, чем человек интересовался последнее время..
2.1) Для каждой группы составим частотный "словарь" ключевых слов в названиях публикации
2.2) Так же можно использовать группу и классификатор типа каждой публикации, откуда взят скачанный файл (авторы же указывают же - что это за публикация, что за платформа, конфигурация и т.п.) - и использовать эту инфу для кластеризации и предсказания..

4) На основе этих данных можно "предсказать", что за интересует этого пользователя - и выдать список рекомендуемых файлов, исключив те, что он уже скачал (с учётом версии)..

Технически - все можно сделать силами платформы 1С, если оттуда не убрали следующие вещи (делал что-то подобное на 8.1 платформе, анализировал простую статистику и кластеризировал данные пациентов по разным признакам для одной чужой научной работы - чисто "по приколу" - но не могу найти источник или статью, которая помогла мне ):

Для освоения всего этого есть отдельный курс у 1С - там много интересных инструментов встроенных в платформу 1С рассмотрено, подходящих для реализации разных подходов к этой задаче:
http://www.1c.ru/news/info.jsp?id=11609
75. dima_home 239 22.09.15 07:54 Сейчас в теме
Мне кажется вы все слишком усложняет.
Запоминаем:
СкаченныйID = файл, который скачал пользователь
ТекущийПользователь = сам пользователь, для кого ищем подборку топ 10.

Для получения предложений после скачивания можно воспользоваться "опытом других пользователей":

1. выбираем список других пользователей тоже скачавших этот файл
ВЫБРАТЬ РАЗЛИЧНЫЕ Пользователь
ГДЕ ID=СкаченныйID И Пользователь <>ТекущийПользователь

2. смотрим какие файлы скачали эти пользователи
ВЫБРАТЬ IDФайла, Дата-время
ГДЕ Пользователь В ТаблицеПользователей_Из_Пункта1

По идее Перед сворачиванием Таблицы по полю IDФайл нужно рассчитать "вес" файла от даты скачивания... чем свежее были скачивания тем выше вес и чем чаще файл скачивался, тем тоже выше вес... коэффициент для частоты скачиваний берется из расчета что важнее: свежие скачивания или частота?.
Заменяем верхний запрос на что то вроде:
ВЫБРАТЬ IDФайла, ВСЕГОДНЕЙСУЩЕСТВУЕТБАЗА - (ТЕКУЩАЯДАТА - Дата-время) КАК ВесПоДате, 1*коэффициент КАК ВесПоКоличеству, ВесПоДате+ВесПоКоличеству КАК ОБщийВес
ГДЕ Пользователь В ТаблицеПользователей_Из_Пункта1
ВЫГРУЗИТЬ
И
СВЕРНУТЬ ("IDФайла,"ОБщийВес ")

3. Далее сортируете и берете топ 10
Надеюсь понятно описал








76. dima_home 239 22.09.15 08:09 Сейчас в теме
запрос во втором пункте можно упростить
ВЫБРАТЬ IDФайла, СУММА(1*коэффициент - (ТЕКУЩАЯДАТА - Дата-время) ) ОБщийВес
ГДЕ Пользователь В ТаблицеПользователей_Из_Пункта1
ГРУППИРОВАТЬ ПО IDФайла
СОРТИРОВАТЬ ПО ОБщийВес
ВЫБРАТЬ ТОП 10
77. dima_home 239 22.09.15 09:19 Сейчас в теме
Умозаключение по поводу поиска аналогичных программ.

Поскольку в задачи стоит что топ список надо показать !ПОСЛЕ! того как человек загрузил себе файл, то понимая, что он уже произвел покупку, нес смысла ему предлагать аналогичный (по тексту, и по смыслу или скаченный в тоже время), так как он уже проделал отбор и выбор конечного результата... нужно предлагать в стиле "СОВЕСТНО С ЭТИМ ОБЫЧНО ПОКУПАЮТ ЕЩЕ И ЭТО"... "ИЛИ СОВЕРШЕННО ДРУГИЕ ПОПУЛЯРНЫЕ СКАЧИВАНИЯ" для того чтобы пробудить другую потребность, так как имеющаяся потребность уже реализована (закрыта).
79. tank68 17 22.09.15 18:06 Сейчас в теме
Помойму самое верное это найти те файлы которые качали вместе с этим файлом, как было выше сказано зачастую люди качают файлы из-за того что они столкнулись с той или иной проблемой при работе в программе и начинают её решать и было бы не плохо показать что качали, пользователи возможно столкнувшиеся с аналогичной проблемой
корум; Mordens; +2 Ответить
86. support 4449 21.11.18 09:01 Сейчас в теме
(79) Получится «если я купил кроссовки, то зачем мне рекомендовать ещё кроссовки». Возможно рекомендации надо перемешать из двух выборок:

- что такое же по этой теме, но не скачивал
- что было интересно по другим темам, для пользователя со схожими интересами
80. kras_71 72 22.09.15 18:42 Сейчас в теме
А простите, в чем смысл делать анализ файла после закачки? Если перед закачкой дать какие-то рекомендации или на ссылки локальные уже скачанные, это понятно, а потом то смысл какой?
85. support 4449 21.11.18 08:58 Сейчас в теме
(80) Чтобы предложить, что ещё интересного почитать или скачать.
81. vpaoli 26 28.09.15 13:02 Сейчас в теме
Это не четко поставленная задача. Что значит "выдать рекомендации на базе этой таблицы" ? Какая конечная цель у пользователя, который скачивает эти файлы ?
Можно выдать вот такую рекомендацию после очередного скачивания - "Выключи компьютер и иди обедай". Это самая лучшая рекомендация, потому что в задаче нет критерия чем она хуже или лучше любой другой.
krv2k; Идальго; +2 Ответить
84. support 4449 21.11.18 08:56 Сейчас в теме
Прошло три года, а воз и ныне там. До последнего времени работал «банановый алгоритм». Рекомендуем топ за последние полгода.
Может какие сервисы рекомендательных движков посоветуете?
Дополнительно к условию задачи есть теги, категории и другие классификаторы каждого файла, но субъективные. Автор или модератор могли ошибиться или не хватило классификатора.
Есть полнотекстовый поиск по публикациям.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот