#0
by Dorzh
Итак, исходные данные. Есть таблица загрузок всех файлов за несколько лет: ID файла, дата-время, пользователь. Надо пользователю выдать рекомендации на базе этой таблицы после того, как он скачал очередной файл. Необходимо получить 10 id рекомендованных файлов. Как составить оптимальный запрос или серию запросов? Заодно посмотрим, остались тут программисты или нет.
#2
by donoteat
" ID файла, дата-время, пользователь. " и что это за бодяга ? как на основе этого гов...на составить какую-то рекомендацию ?
#3
by Злопчинский
Смотреть в сторону "что чаще всего покупают вместе с таким товаром" "Пользователи которые качали такой файл как и вы качали также файлы" Ну и статус юзверя наверно важен Незачем булгахтерк предлагать инструменты разработчика
#4
by donoteat
выбрать всех пользователей с условием по id этого файла посмотреть у кого больше закачек и выбрать временной диапазон внутри которого происходили закачки, после уже выбрать рекомендованные файлы не обязательно в таком случае, что наберется все 10 но зато популярные получите.
#5
by Dorzh
Статус не важен, важно статистика, что скачивали. Это примерно как Apple Music тебе предлагают послушать музыку на базе того, что ты уже послушал.
#7
by RomanYS
для каждой пары файлов посчитать скачавших пользователей, для каждого пользователя подобрать "самые парные" файлы
#9
by donoteat
"для каждой пары файлов посчитать скачавших пользователей, для каждого пользователя подобрать "самые парные" файлы" и что будет ? долго искать придется... dorzh давай в студию кусок своего лога или таблица, что у тебя там... только дай побольше что бы можно было как-то замерить скорость обработки...
#10
by Dorzh
здесь очень много допущений. какой диапазон? сколько файлов? id date user какой запрос то? пускай в синтаксисе SQL и в 1С хотя бы
#12
by donoteat
дай данные, проверим. у меня где-то под рукой sqllite. Запрос на ней попробую запилить т.к. синтаксис приближен к общепринятому.
#14
by Dorzh
Для примера, вот кусок лога 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
#15
by Garykom
мне нравится, настоящий ба...бизнесмен бесплатно хочет чтобы проблему решили... да еще и сами навязывали... а методы то какие ;) "Заодно посмотрим, остались тут программисты или нет."
#16
by Garykom
сразу вижу 2 метода: 1-й на основании анализа наименований файлов 2-й на основе скачиваний других пользователей
#18
by Dorzh
Наименования надо JOIN вытаскивать. В таблице только ID записи, ID файла, ID юзера и Date в unix формате.
#20
by Jump
На базе этой таблицы составить рекомендацию сложно. Разве что анализировать имя файла, но релевантность будет низкая. Чтобы выдавать нормальные рекомендации, надо в первую очередь анализировать самого пользователя - что он качал, что он читал, и систематизировать эту информацию. Т.е например пользователь такой_то интересуется тэгами - администрирование, 7,7, бухгалтерией. Потом нужно систематизировать все файлы - к чему они относятся, и рекомендовать пользователю только те файлы что предположительно лежат в сфере его интересов. Плюс надо учитывать время - информация постоянно меняется и теряет актуальность.
#21
by Garykom
пройтись однажды по названиям файлов и с ID файла что то замутить хеширование какое к примеру
#22
by Garykom
но начать можно с простейшего "с этим файлом скачивают еще обычно..." т.е. сделать пересечения групп скачанных одним пользователем файлов далее рейтинг и будет еще табличка где для каждого ID файла будут N (глубина вложенности) ID других файлов сопоставлены
#23
by Dorzh
теги есть в публикациях, есть рубрикаторы, есть куча дополнителных классификаторов, на базе них мы строим рекомендации внутри публикации. Но это редакторы вручную разносили. Они могут ошибиться, тегов не хватает, мир более разнообразен.Наименования не полные, некорректные. Все это надо отбросить. Нужен анализ чисто по поведению пользователя. Грубо у нас есть масса не структурных элементов, но среди них пользователь нашел то, что ему нужно, иначе бы он не скачал. На базе этой информации надо дать рекомендации новому пользователю.
#26
by Garykom
+ но все равно это нужно заранее/периодически делать на лету полный анализ не успеть сделать: 1. Пользователь скачал файл с ID1 2. Ищем всех пользователей которые скачали этот же файл 3. Смотрим все файлы которые они скачали, каждому файлу в индекс и +1 если пользователь его скачал 4. Сортируем индекс по убыванию 5. Берем нужное число файлов первых
#33
by Фокусник
"Заодно посмотрим, остались тут программисты или нет." В штате ООО "Инфостарт" поищите ;)
#35
by Dorzh
будем искать где только возможно, в любом случае от более точных рекомендаций все будут в выигрыше
#36
by Garykom
попробовать корреляционный анализ сделать точками зависимость каждого файла от другого причем числовые ID файлов заюзать и далее для каждого файла будут "ближайшие соседи"
#37
by donoteat
много букв в общем я хз как там топ выбрать есть короче сделал так данные свои вбил так что вот. Дрянь конечно полная получилась ... insert можно не смотреть... сразу вниз до запросов. DROP TABLE ShitFromDorzh; CREATE TABLE ShitFromDorzh (id INTEGER PRIMARY KEY, item_id TEXT, downloadDate DATETIME, userName TEXT); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828996', DATETIME('2015-09-17 14:44:41'), "vasya"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('1324321312313232131', DATETIME('2015-09-17 14:44:42'), "dsasya"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828994', DATETIME('2015-09-17 14:44:43'), "vadhfghasya"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828993', DATETIME('2015-09-17 14:44:44'), "vasydsa"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('1324321312313232131', DATETIME('2015-09-17 14:44:45'), "vasydads"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828991', DATETIME('2015-09-17 14:44:46'), "vasyaddd"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828990', DATETIME('2015-09-17 14:44:47'), "vasyddssa"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828989', DATETIME('2015-09-17 14:44:48'), "vasyddsw2sda"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828988', DATETIME('2015-09-17 14:44:49'), "vashgfhya1"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('1324321312313232131', DATETIME('2015-09-17 14:47:11'), "vahgfsya2"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828986', DATETIME('2015-09-17 14:47:12'), "vasya3"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828985', DATETIME('2015-09-17 14:47:12'), "vasya4"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828984', DATETIME('2015-09-17 14:47:14'), "vasya5"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828983', DATETIME('2015-09-17 14:47:15'), "vasyhga6"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828982', DATETIME('2015-09-17 14:47:44'), "vasya2"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828981', DATETIME('2015-09-17 14:47:47'), "vasya2"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828980', DATETIME('now'), "vasya2"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828979', DATETIME('now'), "vasyadd2"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828978', DATETIME('now'), "vaddsya2"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828977', DATETIME('now'), "vasya11"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('1324321312313232131', DATETIME('now'), "vasya2"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828975', DATETIME('now'), "vasya7"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828974', DATETIME('now'), "va11sydda2"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828973', DATETIME('now'), "vasya2"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('1324321312313232131', DATETIME('now'), "vasya6"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828971', DATETIME('now'), "vasya2"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828921', DATETIME('now'), "vas33ya2"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6828911', DATETIME('now'), "vasya26"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('68289281', DATETIME('now'), "vasya5"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('1324321312313232131', DATETIME('now'), "vasya2"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('68282981', DATETIME('now'), "vasya1"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('1324321312313232131', DATETIME('now'), "vasya2"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('68222118981', DATETIME('now'), "vasysda2"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('68221118981', DATETIME('now'), "vasyhga2"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('6822228981', DATETIME('now'), "vafsya3"); INSERT INTO ShitFromDorzh (item_id, downloadDate, userName) VALUES ('68289225481', DATETIME('now'), "vasya3"); SELECT * FROM ShitFromDorzh; SELECT item_id FROM ( SELECT * FROM ( SELECT userName FROM ShitFromDorzh WHERE item_id = '1324321312313232131' AND downloadDate <= datetime('now') AND downloadDate >= datetime('now', '-12 months')) as lastData JOIN ShitFromDorzh AS Shit ON Shit.userName = lastData.userName) WHERE item_id != '1324321312313232131' GROUP BY item_id;
#40
by itlikbez
В данном случае самым оптимальным будет ГСЧ, с небольшой настройкой распределения по времени (так, чтобы более свежее предлагалось с большей вероятностью).
#43
by Лодырь
Тогда, имхо, достаточно стандартная задача (не для 1Сников). Для ума тут особо нечего. Просто нужен хороший полноценный проект по созданию рекомендательной системы.
#46
by Dorzh
Но теги могут быть ошибочные, неполные, на совести автора и редактора. Они не дают правильной картины.
#47
by Лодырь
Никто не спорит, но это лучше чем семантический анализ названия разработки. Для функции похожести теги явно выглядят преимущественно.
#48
by Dorzh
Название разработки тоже может быть неполное. Только из текста разработки и комментариев пользователь понимает, что это то, что ему нужно. И принимает решение о загрузке файла. Публикации, которые он смотрел и не скачал наоборот надо вычесть, так как он понял, что они ему не подходят для решения его задачи. В идеале мы должны ему предложить файл предугадав его желания. Теги могут помочь с определением платформы, конфигурации. В принципе, при каждой загрузке мы можем складывать в его профиль данные о платформе и конфигурации, и потом уже накладывать фильтр на выборку, даже если мы пренебрегаем проблемой "холодного старта".
#49
by Лодырь
Холодный старт решается введением 2 рекомендателей: 1. специально для этого пользователя, с учетом его предпочтений. 2. исходя из общей популярности решений (например количество скачиваний или лайков с увеличением веса свежих публикаций) В таком случае, при отсутствии рекомендаций от 1го рекомендателя, мы просто получим список рекомендаций от 2го. При наличии же личных рекомендаций, можно смешать рекомендации 1го с топовыми рекомендациями 2го. Возвращаясь, к тому что надо вычитать публикации которые не скачались и добавлять которые качались. Ну это вы исходите из странной предпосылки, что человек получив 1 раз инструмент для решения его задачи, будет качать другой инструмент для этой же задачи Зачем? он ее уже решил. Тут вообще есть некий парадокс, потому что качать инструменты для решения хорошо известной задачи пользователь врядли будет, скорее ему потребуется чтото новое. А вот смотреть статьи по любимой тематике - будет.
#51
by Лефмихалыч
я бы почитал мануал про АнализДанных, а потом применил бы все начинатанное, чтобы велосипедов не изобретать.
#52
by Лодырь
мануала маловато будет ) даже вот такого курса будет достаточно лишь для того чтобы начать ориентироваться в предмете
#53
by rs_trade
я вот тоже что то не понял на основе чего рекомендацию давать. должны быть еще колонки с данными для анализа.
#55
by Лефмихалыч
я больше, чем уверен, что большая книга "профразработка" мало того, что дает достаточно информации для того, чтобы разобраться в сабже, но и задача там такая же прямо на страницах взята и решена.
#60
by Лефмихалыч
как раз вот эта парадигма, в отличие от этой , на софт-то и не распространяется, как по мне.
#61
by Лефмихалыч
хотя можно проверить же. Написать пукающую обработку и выложить на главной. Почему пукающую? Потому, что такой точно ни на инфостарте, ни на втором сайте с обработками еще нет.
#62
by Domovoi
Главное сделайте появление этой фигни только после установки галочки в профиле и чтоб по умолчанию этого не было:)
#64
by Ненавижу 1С
во, по мотивам изобрел тоже самое: Рекомендуемый клиенту товар, который он ранее не покупал. Корзина покупателя – ассортимент товара, который покупал клиент. Коэффициент схожести клиентов – количество товарных позиций, присутствующих в обеих корзинах двух покупателей. Показатель приоритетности товара для клиента – сумма коэффициентов схожести этого и всех остальных клиентов, покупавших этот товар. Рекомендуемый клиенту товар – товары с наибольшим показателем приоритетности, которые ранее клиент не покупал.
#66
by ЧеловекДуши
Индексы и только индексы спасу "отца демократии"... А вообще странный подход, накидать в кучу Хлам, и потом думать, как его теперь смотреть :) ... Обычно думал, что придумывают структуру данных, для оптимального просмотра и собирания статистики. Готовят промежуточные данные для быстрой статистики.
#68
by ЧеловекДуши
Для этого нужны класификаторы товара. Код, номер да хоть что-то, но то что может понять машина, а не человек :)
#73
by Злопчинский
Наконецто саппорт обратил внимание на то что надо всю эту кучу мусора файлового разгрести хоть както
#74
by Dorzh
уже разгребли 30тыс публикаций, 4 редактора работали и сортировали весь год. Но редакторы это люди, им свойственно ошибаться. Здесь же мы хотим построить анализ без человеческого фактора, а на базе поведения пользователя. Это совершенно другой подход. Потому что публикация 'обмен из УТ в ТИС через xml', относится к обмену, к УТ, к ТиС и к XML. Что искал пользователь? Надо анализировать. Что ему предложить?
#75
by Принт
Ммммм. Посмотреть что качают другие, скачавшие этот файл, убрать уже скачанное данным юзером, отсортировать по частоте. Домешать самые частоскачиваемые, если нет 10-ти.
#76
by Dorzh
выкинуть бананы нельзя, их очень много. Примерно такую картину мы видим сейчас, с алгоритмом рекомендации банана: При скачке любого файла, анализируя, кто качал, что они качали в топ 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) С небольшими вариациями повторяется.
#77
by Garykom
Если хочется то эта задача нерешаема в принципе. Потому что пользователь сначала одно хотел, потом другое, затем скачал вообще 3-ю случайную вещь. Нужно как то разделять что и зачем ищем. Нечто вроде того что яндекс, гугл и прочие поисковики используют. Чтобы понять что хочет (но не может сказать/объяснить словами нормально) пользователь. Просто смотря переходы и время проведенное на ссылке. Т.е. да нужно минусовать файлы на описания (с картинками) которых перешли но не стали качать. Разделять по времени скачивания (то что пользователь качал год/месяц назад это наверно не тоже самое). Вообщем классическая задача для нейронных сетей и прочих нечетких алгоритмов. Еще можно все таки использовать на основе вектор-признаков
#78
by Garykom
+ Да и если использовать последний метод то "с этим обычно заодно качают" будет лишь одним из признаков, не самым важным. Не лучше ли сделать на ресурсе удобный функционал для работы консультантов? С которыми можно пообщаться онлайн и они зададут уточняющие вопросы и на основе посоветуют. Нечто вроде специализированного по каталогу ИС
#81
by Принт
>Т.е. да нужно минусовать файлы на описания (с картинками) которых перешли но не стали качать. Разделять по времени скачивания (то что пользователь качал год/месяц назад это наверно не тоже самое). Почему эти файлы хуже тех, которые даже не глянули?
#83
by Garykom
ищу выгрузку из УТ11 в БП3... чем мне поможет выгрузка из УТ10.2 в БП2 ? которую пользователь(ли) тоже скачивали только давно
#88
by Сияющий в темноте
Не хре у пользователей стадный инстинкт вырабатывать я понимаю что вам выгодно чтобы больше качали НХЛ при вашем решении пользователи будут качать ненужную фигню причём тем больше чем больше ещё скачают нужно делать четкие рамки тематики и предлагать аналогичные по тематике решения чтобы если пользователь что то ищет он находил все подходящее максимально удобно и не забываем что люди решают несколько задач одновременно получится что всем будут предлагаться файлы которые кто то скачивал но никак не относящиеся к данной задаче
#91
by vhl
Подфорумом ошибся. Надо было в JOB и ценник назначать, а так на халяву прокатиться не получится.
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
- Бух.4.64. Разминка для ума
- ПолуОФФ: Разминка для мозга. Оптимальный алгоритм на 1С
- УПП: Не создает начальный образ Чего делать, ума не приложу!
- Оперативный учет. Разминка для ума.
- Откуда берется список файлов ?
- разминка для мозгов ;)
- Как добавить в список ещё один список?
- Получить список файлов
- Маленькая разминка для мозга
- Список сохраняемых файлов
- Дин. список с произвольным запросом и список значений в качестве его параметра
- Очистить список открытых файлов
В этой группе 1С
- Носитель для 2-х мерного кода с высокой стойкостью к обветшанию.
- Проблема с заполнением двухмерного массива.
- Платформа 8.3. Как отследить что может запускать функцию?
- Вопрос по СП
- СКД: Нач остаток
- работа БП 2.0 на 8.3?
- Скд расшифровка
- Комментарий в запросе
- СКД. Как сделать, чтобы группировка работала только для оборотов?
- Ошибка в запросе
- v7: Язык запросов
- Как не дать изменить реквизит объекта
- работа с отсортированной таблицей
- Неочевидная проблема с использованием W8
- Настройка цен в УТ
- Обмен между 2-мя ИБ
- Требования накладная НДС 19.03 68.02
- Ошибка при подключении к другой базе через COM
- логика резервирования товаров в Ут
- Можно ли оптимизировать такой запрос