Алгоритм выбора предметов с поднятой головой - PullRequest
1 голос
/ 27 июля 2010

У меня есть Pandora-подобное программное обеспечение, где пользователь может пролистать песню или пролистать песню вниз.Программное обеспечение, называемое Chavah , является Silverlight + C #, но это не зависит от языка и платформы.

Моему программному обеспечению необходимо выбрать песню на основе предпочтений пользователя,Мне нужен хороший алгоритм для этого.

Я хочу, чтобы мое программное обеспечение выбрало песню для воспроизведения, учитывая следующие требования:

  1. Предпочтительные песни должны быть одобреныи играл регулярно.

  2. Песни без голосов (ни вверх, ни вниз) все равно должны воспроизводиться;В конце концов, у пользователя может быть только 2 песни с большим пальцем вверх.

  3. Песни с большим пальцем должны проигрываться редко.

  4. Каким бы ни был алгоритм,песни не должны повторяться часто.

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

У меня есть некоторый код, который захватывает все песни, понравившиеся песни и не нравитсяпесни:

var allSongs = ...
var likedSongs = allSongs.Where(s => s.LikedByUser(...));
var dislikedSongs = allSongs.Where(s => s.DislikedByUser(...));

Какие-нибудь простые идеи для выбора хорошей песни для пользователя?

Ответы [ 4 ]

2 голосов
/ 27 июля 2010

Вы можете весить песни;скажем, каждая песня имеет вначале 1,0 балл, 0,5 - большой палец вниз и 1,5 - большой палец вверх.Затем вы выбираете случайный элемент из набора всех баллов, вероятность которого, тем не менее, определяется его весом.Быстрый и грязный подход, о котором я бы подумал, заключался бы в суммировании по всем весам.Выберите случайное число меньше этой суммы.Перебирайте все песни, пока CurrentWeight + SongWeight> RandomNumber (иначе CurrentWeight + = SongWeight)

Конечно, вы можете сделать это произвольно более сложным, введя совместную фильтрацию:)

Представьте себе пять песен.Первые два подняты вверх, следующий - вниз, два нейтральных.

{1: 1.5, 2: 1.5, 3: 0.5, 4: 1, 5: 1}

Сумма этого5,5.Теперь мы выбираем случайное число <5,5 и видим: это 2,43789 </p>

Теперь давайте найдем песню, которой принадлежит это случайное число.

Начнем с CurrentWeight = 0. Вес первой песни = 1,5.CurrentWeight + 1.5 <2.43789 -> мы продолжаем, но увеличиваем CurrentWeight на вес этой песни.

Итак, CurrentWeight = 1,5 сейчас.Вес следующей песни: снова 1,5.Но теперь CurrentWeight + 1.5 == 3> 2.43789.Это означает, что мы выбрали вторую песню!

То, что вы здесь делаете, это в основном выбирает случайное место в строке, но увеличивает «территорию» в этой строке, которая выберет песню, если песня будет пролистана вверх.

Создает ли это много повторений или нет, в основном зависит от того, насколько сильно вы увеличиваете / уменьшаете вес песен.

1 голос
/ 27 июля 2010

Может быть, что-то вроде этого:

1) Создайте три потока (или списки воспроизведения) композиций, упорядоченных в случайном порядке, таких как фрагмент кода, но сделайте их взаимоисключающими: Liked, Not Liked, Not Rated. В зависимости от размера этих групп у каждой из них будет продолжительность, прежде чем они будут повторяться.

2) Создайте функцию, которая объединяет потоки в один поток, соблюдая при этом определенные правила. Основным правилом было бы желаемое сочетание потоков, скажем, 60% понравилось, 38% не оценено, 2% не понравилось, или что-то еще. Вам придется отклоняться от желаемого микса только тогда, когда длительность потока Liked слишком мала, чтобы следовать правилу «минимального времени между повторениями песни».

3) Возможно, вы также хотите периодически пересчитывать все потоки. Сложная часть здесь может заключаться в том, чтобы избежать повторений, вызванных пересчетом. Возможно, ваша случайная сортировка в (1) также может учитывать какой-то вес или смещение, присущее недавно проигранным песням.

1 голос
/ 27 июля 2010

Вы также можете создать систему рейтинга для группы / певца и жанра, и на основе каждого «большого пальца» вы можете добавить 1 (или любое другое значение по вашему выбору) как для группы / исполнителя, так и для жанра. Затем, когда пришло время выбрать следующую песню для воспроизведения, вы можете взвесить решение, основываясь на интересе указанного пользователя к группе / певцу и / или жанру. И наоборот для «заглушенных» песен.

1 голос
/ 27 июля 2010

Я предполагаю, что Pandora использует систему тегов для классификации своих песен.Таким образом, вы разрабатываете профиль музыкальных вкусов пользователя, выбирая самую высокую частоту тегов «поднят».К сожалению для вас, они черпают из обширной базы данных помеченную музыку, чтобы предложить своим пользователям, что, вероятно, сложнее разработать, чем алгоритм их выбора.

...