Это прототип системы музыкальных рекомендаций, разработанный как часть проекта "Vibe". Система использует графовую модель для представления связей между треками и предпочтениями пользователя, чтобы генерировать персонализированные рекомендации.
Система построена на Spring Boot и использует in-memory графовую библиотеку JGraphT.
TrackGraph: Граф, где вершины — это треки (Track). При старте приложения граф автоматически заполняется данными изspotify_1000_tracks...json. Рёбра представляют собой связи между треками, построенные на основе общих исполнителей (вес +1.0) и общих жанров (вес +0.5).UserPreference: Хранилище ID лайкнутых и дизлайкнутых треков.RecommendationService: Ядро системы. Генерирует рекомендации, используя обход графа в ширину (BFS) от топ-10 лайкнутых треков.LikeService: Обрабатывает лайки/дизлайки/прослушивания, динамически обновляя веса рёбер вTrackGraph.RecommendationController: REST-контроллер, предоставляющий API для взаимодействия с системой.
Увеличивает вес рёбер, связанных с этим треком, на +1.0.
- URL:
/api/recommendations/like - Method:
POST - Body:
{"trackId": "ID трека из JSON"}
Уменьшает вес рёбер, связанных с этим треком, на -1.0.
- URL:
/api/recommendations/dislike - Method:
POST - Body:
{"trackId": "ID трека из JSON"}
Увеличивает вес рёбер, связанных с этим треком, на +0.5.
- URL:
/api/recommendations/listen - Method:
POST - Body:
{"trackId": "ID трека из JSON"}
Возвращает список из 10 рекомендованных треков.
- URL:
/api/recommendations - Method:
GET - Success Response (200 OK):
{ "tracks": [ { "id": "3NW1YMA8kfNVTzGJCGBS8m", "name": "Both Sides Now", "artists": ["Joni Mitchell"], "genres": ["folk", "folk rock"], "album": "Clouds", "popularity": 63 } ] }
- Убедитесь, что файл
spotify_1000_tracks_20250618_153243.jsonнаходится в папкеsrc/main/resources. - Сборка проекта:
./gradlew build
- Запуск приложения:
java -jar build/libs/vibe-0.0.1-SNAPSHOT.jar
Для тестирования вам понадобятся trackId из файла spotify_1000_tracks...json.
-
Найдите в JSON-файле несколько треков одного исполнителя. Например, у
Joni Mitchellесть треки с ID3NW1YMA8kfNVTzGJCGBS8mи0SFT0he3qL4y1Yxdp2gA4c. -
Лайкнем эти треки, чтобы сформировать предпочтение.
curl -X POST -H "Content-Type: application/json" -d '{"trackId": "3NW1YMA8kfNVTzGJCGBS8m"}' http://localhost:8080/api/recommendations/like curl -X POST -H "Content-Type: application/json" -d '{"trackId": "0SFT0he3qL4y1Yxdp2gA4c"}' http://localhost:8080/api/recommendations/like
-
Запросим рекомендации. В ответе мы должны увидеть другие треки
Joni Mitchellили треки в жанреfolk, так как система "поняла" наш вкус.curl http://localhost:8080/api/recommendations
-
Поставим дизлайк одному из рекомендованных треков (возьмите ID из ответа на предыдущий запрос).
curl -X POST -H "Content-Type: application/json" -d '{"trackId": "ID_ТРЕКА_ИЗ_РЕКОМЕНДАЦИЙ"}' http://localhost:8080/api/recommendations/dislike
-
Снова запросим рекомендации. Теперь дизлайкнутый трек должен исчезнуть из списка.
curl http://localhost:8080/api/recommendations
- Добавление данных: Просто замените или отредактируйте JSON-файл в
src/main/resources. - Изменение логики: Основной алгоритм находится в
RecommendationService. Логика построения графа — вRecommendationConfig. - Настройка весов: Значения весов для лайков/дизлайков/прослушиваний можно изменить в
LikeService. - Переход на БД: Для production-использования
TrackGraphможно заменить на реализацию, работающую с графовой СУБД (например, Neo4j).