лучший способ хранить подобную музыку - PullRequest
3 голосов
/ 25 июня 2011

У меня миллионы песен, каждая песня имеет свой уникальный идентификатор песни. В соответствии с каждым идентификатором песни у меня есть некоторые атрибуты, такие как название песни, имя исполнителя, название альбома, год и т. Д.

Теперь я реализовал механизм определения отношения сходства между двумя песнями. Это дает мне значение от 0 до 100.

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

Следовательно, если я создаю БД с тремя атрибутами,

song1, song2, similarity

У меня будет n * n записей, где n - количество песен.

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

SELECT song2 WHERE song1 = x AND similarity > 80 ORDER BY similarity DESC;

Пожалуйста, предложите что-нибудь, чтобы сохранить такую ​​информацию.

Спасибо.

Ответы [ 3 ]

1 голос
/ 25 июня 2011

Кажется, требуется масса вычислительных мощностей для поддержания и доступа к информации о подобии.Например, если у вас уже обработано 2000 песен, и вам все еще нужно выполнить анализ сходства 2000 раз для следующей новой песни.Это может иметь проблему с масштабируемостью, и схема данных может замедлить работу базы данных за короткий промежуток времени.

Я рекомендую вам найти какой-нибудь шаблон и пометить каждую песню.Например, вы можете проанализировать песни на наличие паттернов "блюз", "рок", "90-е" и присвоить им теги.Если вы хотите найти похожую песню на основе одной песни, вы можете просто запросить все теги, которые есть у данных песен.ех."New age", "Slow" и "techno"

1 голос
/ 25 июня 2011

Думаю, вам лучше сравнить сходство с «прототипной» песней или классификацией. Разработайте механизм снятия отпечатков пальцев, который включает в себя информационные метаданные о песне и любой аудио механизм, который вы используете для оценки сходства. Разместите каждую песню в одной (или нескольких) категориях и оцените песню в этой категории - насколько близко она соответствует прототипу для категории с использованием отпечатка пальца. Обратите внимание, что у вас могут быть сотни или тысячи категорий, то есть они не являются типичными категориями, о которых вы думаете, когда думаете о музыке.

Как только вы это сделаете, вы сможете поддерживать индексы по категориям, а при поиске похожих песен вы придумываете вес, основанный на категории и мерах сходства внутри категории - скажем, придавая больший вес категории, в которой находится песня. ближе всего к прототипу. Умножьте вес на квадрат разницы между песней-кандидатом и текущей песней с прототипом для категории. Суммируйте веса для трех верхних категорий, причем более низкие значения будут более похожими.

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

1 голос
/ 25 июня 2011

То, что вы предлагаете, будет работать, однако вы можете уменьшить количество строк, сохранив каждую пару только один раз.Затем измените запрос, чтобы выбрать идентификатор песни в song1 или song2.

Что-то вроде:

SELECT if(song1=?,song2,song1) as similar WHERE (song1 = ? or song2 =?) AND similarity > 80 ORDER BY similarity DESC;
...