lastkey <- "xxxxxxxxxxxxxxxxxxxxxxxxxx" # get your key from http://www.last.fm/api/account/create
user_name <- "LeMUr1978KCrq"
# install package from:
# https://cran.r-project.org/src/contrib/Archive/RLastFM/RLastFM_0.1-5.tar.gz
library(RLastFM)
library(dplyr)
library(rvest)
# weź 200 najnowszych scrobbli
# im więcej tym lepsze rekomendacje
# im więcej tym dłużej to trwa...
# 1000 to max
lastfm <- as.data.frame(user.getRecentTracks(user_name, limit = 200)) %>%
select(Artist=artist, Song=track)
lastfm$Artist <- as.character(lastfm$Artist)
lastfm$Song <- as.character(lastfm$Song)
# najpopularniejsze piosenki (najczęściej słuchane)
# n - ile razy piosenka była słuchana?
popular_songs <- lastfm %>%
filter(Artist!="[unknown]") %>%
group_by(Artist, Song) %>%
summarise(n=n()) %>%
ungroup() %>%
arrange(desc(n)) %>%
mutate(ArtSong=paste(Artist, Song, sep=" - "))
| Kombajn Do Zbierania Kur Po Wioskach - Waniliowe niebo |
3 |
| Deep Purple - Black Night |
2 |
| Deep Purple - Speed King |
2 |
| Kombajn Do Zbierania Kur Po Wioskach - Don’t drive so fast |
2 |
| Kombajn Do Zbierania Kur Po Wioskach - Połączenia |
2 |
| Led Zeppelin - What Is and What Should Never Be |
2 |
| Led Zeppelin - Whole Lotta Love |
2 |
| Leonard Cohen - You Want It Darker |
2 |
| Marek Grechuta - Dni, których nie znamy |
2 |
| Marek Grechuta - Hop szklanke piwa |
2 |
# liczba unikalnych piosenek
nrow(popular_songs)
## [1] 183
# bierzemy tylko 5% najczęściej słuchanych
# przy dużej bibliotece to i tak będzie dużo!
popular_songs <- filter(popular_songs, n>=quantile(n, probs = 0.95))
# liczba unikalnych piosenek - po redukcji do 5%
n_popular_songs <- nrow(popular_songs)
print(n_popular_songs)
## [1] 16
# procent scrobli po redukcji, na których oparte będą rekomendacje
print(100 * sum(popular_songs$n) / nrow(lastfm))
## [1] 16.5
similar_songs_df <- data.frame()
for(i in 1:n_popular_songs) {
similar_songs <- track.getSimilar(track=popular_songs[i, 2], artist=popular_songs[i,1])
if(length(similar_songs$artist) != 0)
similar_songs_df <- rbind(similar_songs_df,
data.frame(Song=as.character(popular_songs[i, 4]),
Artist=similar_songs$artist,
Track=similar_songs$track,
Match=similar_songs$match))
}
# liczba piosenek wybranych jako podobne
nrow(similar_songs_df)
## [1] 1298
# oznacz te, które nie były scroblowane
# tolower() żeby nie było problemu z wielkością liter
# np. "The Doors - Light my fire" vs. "The doors - Light My Fire"
similar_songs_df$ArtTrack <- paste(similar_songs_df$Artist, similar_songs_df$Track, sep=" - ")
similar_songs_df$Unknown <- !(tolower(similar_songs_df$ArtTrack) %in% tolower(popular_songs$ArtSong))
# podaj najczęściej polecane i policz prawdopodobieństwo spodobania się
# prawdopodobieństwo wg LastFM * ilość poleceń danego utworu / maksymalna ilość poleceń utworu
polecane_songs <- similar_songs_df %>%
filter(Unknown==TRUE) %>%
group_by(ArtTrack) %>%
summarise(n=n(), mean_match=mean(Match)) %>%
ungroup() %>%
mutate(p=100*mean_match*n/max(n)) %>%
arrange(desc(p))
# liczba unikalnych polecanych
nrow(polecane_songs)
## [1] 975
# tylko 5% najbardziej polecanych - żeby było szybciej :)
polecane_songs_5 <- polecane_songs %>%
filter(p>=quantile(p, probs = 0.95)) %>%
select(ArtTrack, p)
n_polecane_songs_5 <- nrow(polecane_songs_5)
print(n_polecane_songs_5)
## [1] 49
| Kombajn Do Zbierania Kur Po Wioskach - Prezent |
38 |
| Deep Purple - Bloodsucker |
20 |
| Deep Purple - Strange Kind of Woman |
20 |
| Kombajn Do Zbierania Kur Po Wioskach - Białe kwity |
20 |
| Kombajn Do Zbierania Kur Po Wioskach - Niemiecki krasnal |
20 |
| Led Zeppelin - Heartbreaker |
20 |
# najbardziej polecana bierze się z podobieństwa do słuchanych piosenek:
similar_songs_df %>%
filter(ArtTrack==as.character(polecane_songs_5[1,1])) %>%
select(Song, Match) %>%
arrange(desc(Match))
| Kombajn Do Zbierania Kur Po Wioskach - Waniliowe niebo |
0.96 |
| Kombajn Do Zbierania Kur Po Wioskach - Don’t drive so fast |
0.94 |
# dodaj linki do klipów na YouTube - tylko pierwszy wynik wyszukiwania!
polecane_songs_5$YT_link <- "https://www.youtube.com/"
for(i in 1:n_polecane_songs_5) {
yt_search_str <- gsub(" ", "%20", as.character(polecane_songs_5[i,1]))
yt_search_str <- gsub("'", "%27",yt_search_str)
yt_search_str <- gsub("&", "%26",yt_search_str)
link_url <- read_html(paste0("https://www.youtube.com/results?search_query=", yt_search_str, "&sp=EgIQAQ%253D%253D")) %>%
html_node("#results") %>%
html_node("div.yt-lockup") %>%
html_node("h3.yt-lockup-title") %>%
html_node("a") %>%
html_attr("href")
polecane_songs_5[i, 3] <- paste0("http://youtube.com", link_url)
}
# tabela 50 najbardziej polecanych piosenek