Усреднение рекомендаций по любимым трекам #81
Replies: 3 comments
-
Спасибо! Очень полезная функция с широким применением. Только вот при подстановке ключа loudness что-то не так срабатывает. Плейлист всегда пустой. |
Beta Was this translation helpful? Give feedback.
-
Incredibly useful to extract songs that you may like from large playlists. filterByDeviation_(tracks, savedTracks, 20, 'tempo,energy,valence') but I suppose this will vary wildly according to the genre of music you might like. Thanks again, Chilmidic. |
Beta Was this translation helpful? Give feedback.
-
Альтернативный вариант использования фильтра. Вместо усреднения шаблонных треков, эталоном для поиска становится каждый в отдельности. То есть берем от каждого трека его мета данные (energy, valence, danceability и пр) и смотрим на претендентов. Если по всем данным есть совпадение с некоторой погрешностью, одобряем трек. При низкой погрешности и большом количестве одновременно сравниваемых мета данных - нужен большой объем входных треков. Иначе выходной результат будет близок к нулю из-за строгости отбора. Объем может обеспечить mineTracks, craftTracks или replaceWithSimilar. Побочным эффектом будет большое количество запросов. Поэтому ставить функцию на триггер не рекомендую. Скорее вручную пройтись по интересующим объемам треков. Таким образом, ядром алгоритма будет следующий код. Где let recomTracks = []
templateTracks.forEach(template => {
filterByDeviation_(poolTracks, [template], 5, 'tempo,energy,valence,danceability,acousticness')
Combiner.push(recomTracks, poolTracks)
poolTracks = Filter.getLastOutRange()
}) Например, за эталон берем все лайки, крафтим из них рекомендации и фильтруем по мета данным. function createRelevantPlaylist() {
let templateTracks = Cache.read('SavedTracks.json')
let poolTracks = Source.craftTracks(templateTracks)
let relevantTracks = []
templateTracks.forEach(template => {
filterByDeviation_(poolTracks, [template], 5, 'tempo,energy,valence,danceability,acousticness')
Combiner.push(relevantTracks, poolTracks)
poolTracks = Filter.getLastOutRange()
})
Filter.removeTracks(relevantTracks, templateTracks)
Playlist.saveWithReplace({
name: 'Релевантно лайкам',
tracks: relevantTracks
})
Admin.printInfo('Количество запросов', CustomUrlFetchApp.getCountRequest())
} Или майним треки из поиска в большом объеме let poolTracks = Source.mineTracks({
keyword: ['indie', 'alternative'],
inRow: true,
itemCount: 50,
requestCount: 25,
}) |
Beta Was this translation helpful? Give feedback.
-
Описание
Классический пример сбора треков из рекомендованных миксов довольно обширный и разнообразный. Например, шаблон
Незнакомый сет
. Если включить сюда миксы жанров, исполнителей и прочее из разделаДля тебя
, то получается по меньшей мере 300 треков, которые не успеешь прослушать или будешь пропускать большими группами.Идея усреднения рекомендаций заключается в следующем:
tempo
,energy
,valence
и прочие.min
иmax
)То есть опираясь на среднее по любимым трекам, с некоторым отклонением, отбрасываем большую часть рекомендованных треков. И оставляем только те, которые наиболее близки к среднему.
Код
Две функции: первая собирает плейлист, вторая реализует фильтр усреднения (шаги 3-5). Скопируйте обе функции к себе и подставьте свои
id
плейлистов-источников.У фильтра
filterByDeviation_
следующие аргументы:tracks
- треки, которые попадут в плейлистtemplateTracks
- треки, чьи средние значения нужно рассчитать (в примере это любимые треки)percentDeviation
- процент отклонения от среднего.keys
- определяет какие ключи учитывать при отборе. Чем больше ключей и меньше процент, тем меньше треков на выходе. Вероятно, лучше всего сочетать какой-либо ключ с темпомtempo
.Пример вызова фильтра: среднее по любимым с отклонением в 10% по ключам темпа и энергичности.
Далее сама функция создания плейлиста, которая использует фильтр
Beta Was this translation helpful? Give feedback.
All reactions