/webmining

Primary LanguagePython

Progetto WebMining

Il file distance_minhash.py transforma i testi di tutte le canzoni in vettori hash con shingles di una parola, calcola per ogni vettore generato la distanza con i vettori di ogni altra canzone e salva il risultato nel json minhash_dist.json. Lo script di cui sopra, prende come input la lista di tutte le canzoni (che non mandiamo per motivi di spazio), ne estrae gli hash e li confronta a due a due (evitando di ripeterne i confronti di testi gia' fatti). Oltre a salvare il dizionario generato, stampa i migliori suggerimenti delle canzoni, e confronta la stima di Jaccard effettuata con minHash, con l'attuale valore di Jaccard. Tale approssimazione è molto vicina al valore reale. Alleghiamo parte dell'output generato (distances_minhash.out).

$ python3 distances_minhash.py
Shingling songs...

Shingling 4519 docs took 477.60 sec.

Average shingles per doc: 897.46

Generating random hash functions...

Generating MinHash signatures for all documents...

Generating MinHash signatures took 16.23sec

Comparing all signatures...

Comparing MinHash signatures took 445.66sec

List of Document Pairs with J(d1,d2) more than 0.5
Values shown are the estimated Jaccard similarity and the actual
Jaccard similarity.

		                                                                            Est. J	Act. J
Cristiano_De_André#Tutti_quanti_hanno_bisogno --> Cristina_Donà#Nel_Mio_Giardino	0.59	0.54
Cristiano_De_André#Tutti_quanti_hanno_bisogno --> Daniele_Groff#Every_Day	0.59	0.52
Cristiano_De_André#Tutti_quanti_hanno_bisogno --> Daniele_Groff#Vivere_Per_Sempre	0.57	0.58
Cristiano_De_André#Tutti_quanti_hanno_bisogno --> Daniele_Silvestri#A_Me_Ricordi_Il_Mare	0.66	0.60
Cristiano_De_André#Tutti_quanti_hanno_bisogno --> Daniele_Silvestri#Amarsi_Cantando	0.58	0.56
Cristina_Donà#Nel_Mio_Giardino --> Daniele_Groff#Every_Day	0.79	0.70
Cristina_Donà#Nel_Mio_Giardino --> Daniele_Groff#Vivere_Per_Sempre	0.73	0.70
Cristina_Donà#Nel_Mio_Giardino --> Daniele_Silvestri#A_Me_Ricordi_Il_Mare	0.74	0.64
Cristina_Donà#Nel_Mio_Giardino --> Daniele_Silvestri#Amarsi_Cantando	0.67	0.64
Cristina_Donà#Nel_Mio_Giardino --> Daniele_Silvestri#Dove_sei	0.79	0.67
Daniele_Groff#Every_Day --> Daniele_Groff#Vivere_Per_Sempre	0.72	0.67
Daniele_Groff#Every_Day --> Daniele_Silvestri#A_Me_Ricordi_Il_Mare	0.81	0.77
Daniele_Groff#Every_Day --> Daniele_Silvestri#Amarsi_Cantando	0.77	0.70
Daniele_Groff#Every_Day --> Daniele_Silvestri#Dove_sei	0.86	0.76
Daniele_Groff#Every_Day --> Daniele_Silvestri#Gino_E_L'Alfetta	0.77	0.73
Daniele_Groff#Vivere_Per_Sempre --> Daniele_Silvestri#A_Me_Ricordi_Il_Mare	0.75	0.67
Daniele_Groff#Vivere_Per_Sempre --> Daniele_Silvestri#Amarsi_Cantando	0.59	0.58
Daniele_Groff#Vivere_Per_Sempre --> Daniele_Silvestri#Dove_sei	0.72	0.63
Daniele_Groff#Vivere_Per_Sempre --> Daniele_Silvestri#Gino_E_L'Alfetta	0.78	0.73
Daniele_Groff#Vivere_Per_Sempre --> Daniele_Silvestri#Idiota	0.72	0.65
Daniele_Silvestri#A_Me_Ricordi_Il_Mare --> Daniele_Silvestri#Amarsi_Cantando	0.77	0.74
Daniele_Silvestri#A_Me_Ricordi_Il_Mare --> Daniele_Silvestri#Dove_sei	0.83	0.74
Daniele_Silvestri#A_Me_Ricordi_Il_Mare --> Daniele_Silvestri#Gino_E_L'Alfetta	0.84	0.77
Daniele_Silvestri#A_Me_Ricordi_Il_Mare --> Daniele_Silvestri#Idiota	0.88	0.80
Marta_sui_tubi#Lauto_Ritratto --> Massimo_Ranieri#Se_bruciasse_la_città	0.62	0.53
Marta_sui_tubi#Lauto_Ritratto --> Mau_Mau#An_Viagi	0.63	0.60
Marta_sui_tubi#Lauto_Ritratto --> Giorgia#E_Poi/R	0.66	0.62
Marta_sui_tubi#Lauto_Ritratto --> Giorgia#Father	0.62	0.61
Marta_sui_tubi#Lauto_Ritratto --> Giorgia#In_vacanza_con_me	0.59	0.59
Massimo_Ranieri#Se_bruciasse_la_città --> Mau_Mau#An_Viagi	0.78	0.70
Massimo_Ranieri#Se_bruciasse_la_città --> Giorgia#E_Poi/R	0.75	0.69
Massimo_Ranieri#Se_bruciasse_la_città --> Giorgia#Father	0.74	0.67

Il json generato (che si trova nello zip allegato) verra' utilizzato dallo script recommendation.py . Il sistema di raccomandazioni chiede di inserire il titolo di una canzone. L'utente puo' inserire il titolo completo di una canzone o parte di essa oppure puo' inserire il nome di un'artista o parte di esso. Il sistema provera' a indovinare qual è la canzone che l'utente chiede e ne chiedera' conferma. Dopodicchè restituira' le 5 migliori raccomandazioni, sulla base della distanza calcolata. Per uscire dal programma basta inserire come input il carattere x Se non vengono in mente canzoni da passare come input, è possibile inserire come input il carattere h o la stringa help, così facendo il sistema prendera' 5 canzoni random dal dataset e le stampera' a video. In allegato mettiamo pure un esempio di output dall'esecuzione. Lo script è eseguibile con python recommendation.py

> $ python3 recommendation.py
#############
Welcome! This is the system that take as input a song and it will suggest a list of {} songs similar to it calculated with a estimated Jaccard Similarity (MinHash)
These are example songs which you can choose from
	Wilson Pickett - Un'avventura
	Moltheni - Nutriente
	Paola e Chiara - A modo mio
	Sally Oldfield - I sing for you
	I Gens - La stagione di un fiore
	Bruno Rosettani & Trio Aurora - Zucchero e pepe
	Mau Mau - An Viagi
	Marina Rei - Pazza Di Te
	Mario Castelnuovo - Nina
	Ivano Fossati - Lindbergh
Write 'x' to stop the program
If you want help, you might write 'h' or 'help' to show a list of songs you might look for
#############
Please enter the author or the title of a song (or part of it): a modo mio
Maybe you meant A Modo Mio by Negrita? [Y/n]
n
Maybe you meant A modo mio by Paola e Chiara? [Y/n]
n
Maybe you meant A modo mio by Gianni Nazzaro? [Y/n]
n
Sorry, I didn't quite catch the song you're referring too, please try again
Please enter the author or the title of a song (or part of it): a modo mio
Maybe you meant A Modo Mio by Negrita? [Y/n]

Good choice
You chose A Modo Mio by Negrita


Here the list of suggested songs:
 La pianta tè by Ivano Fossati 	0.921875
 Straordinariamente by Adriano Celentano 	0.8671875
 Cerco un gesto naturale by Giorgio Gaber 	0.8671875
 Se le cose stanno così by Sergio Endrigo 	0.859375
 Karma Parente by Marco Parente 	0.859375

Please enter the author or the title of a song (or part of it): La pianta te
Maybe you meant La pianta tè by Ivano Fossati? [Y/n]
yes
Good choice
You chose La pianta tè by Ivano Fossati


Here the list of suggested songs:
 A Modo Mio by Negrita 	0.921875
 Il mare immenso by Giusy Ferreri 	0.90625
 Offeso by Niccolò Fabi 	0.890625
 Per Le Mie Mani by Luca Dirisio 	0.8828125
 L'Uomo Che Amava Le Donne by Nina Zilli 	0.8828125

Please enter the author or the title of a song (or part of it): h
These are example songs which you can choose from
	Natalino Otto - Mogliettina
	Leila Selli - Sola in due
	Ligabue - Balliamo sul mondo
	Giorgio Gaber - Mai, mai, mai, Valentina
	Aurelio Fierro - Lì per lì
	Ricchi e Poveri - Dolce frutto
	Sergio Endrigo - Ci Vuole Un Fiore
	Laura Pausini - La solitudine
	Negrita - Paradisi Per Illusi
	Rossana Casale & Grazia Di Michele - Gli amori diversi
Please enter the author or the title of a song (or part of it): Gli Amori
Maybe you meant Gli amori by Toto Cutugno? [Y/n]
n
Maybe you meant Gli amori diversi by Rossana Casale & Grazia Di Michele? [Y/n]
y
Good choice
You chose Gli amori diversi by Rossana Casale & Grazia Di Michele


Here the list of suggested songs:
 Lì per lì by Aurelio Fierro 	0.9453125
 Re di cuori by Caterina Caselli 	0.9375
 Nina by Mario Castelnuovo 	0.9375
 Re di cuori by Nino Ferrer 	0.9375
 Un piccolo amore by Alina 	0.9296875

Please enter the author or the title of a song (or part of it): Nina
Maybe you meant L'Inferno by Nina Zilli? [Y/n]
y
Good choice
You chose L'Inferno by Nina Zilli


Here the list of suggested songs:
 Abbiamo vinto un'altra guerra by Motta 	0.890625
 No amore by Sacha Distel 	0.875
 Frisco by Paolo Conte 	0.875
 No amore by Giusy Romeo 	0.875
 Maledetta primavera by Loretta Goggi 	0.875

Please enter the author or the title of a song (or part of it): x
Thank you!

N.B.: Gli script sono stati sviluppati e testati con Python3.6

Il JSON per semplicita' contiene, per ogni canzone, le 20 canzoni con "estimated Jaccard similarity" piu' alto.