Song-Lyrics-Generator / compute_score.py
nevoit's picture
Upload 24 files
f5586d9
"""
This file computes the scores of the generated sentences
"""
import numpy as np
from numpy import dot
from numpy.linalg import norm
from textblob import TextBlob
def calculate_cosine_similarity_n_gram(all_generated_lyrics, all_original_lyrics, n, word2vec):
"""
This function computes the similarity between 'n' words that are adjacent to each other.
:param all_generated_lyrics: list of all generated lyrics
:param all_original_lyrics: list of all original lyrics
:param n: size of grams
:param word2vec: a dictionary between word and index
:return: mean similarity between the all_generated_lyrics and all_original_lyrics
"""
cos_sim_list = []
for song_original_lyrics, song_generated_lyrics in zip(all_original_lyrics, all_generated_lyrics):
if len(song_original_lyrics) != len(song_generated_lyrics):
raise Exception('The vectors are not equal')
cos_sim_song_list = []
for i in range(len(song_original_lyrics) - n + 1):
starting_index = i
ending_index = i + n
n_gram_original = song_original_lyrics[starting_index:ending_index]
n_gram_generated = song_generated_lyrics[starting_index:ending_index]
original_vector = np.mean([word2vec[word] for word in n_gram_original], axis=0)
generated_vector = np.mean([word2vec[word] for word in n_gram_generated], axis=0)
cos_sim = dot(original_vector, generated_vector) / (norm(original_vector) * norm(generated_vector))
cos_sim_song_list.append(cos_sim)
cos_sim_song = np.mean(cos_sim_song_list)
cos_sim_list.append(cos_sim_song)
return np.mean(cos_sim_list)
def calculate_cosine_similarity(all_generated_lyrics, all_original_lyrics, word2vec):
# The similarity between the generated lyrics and the original lyrics.
cos_sim_list = []
for song_original_lyrics, song_generated_lyrics in zip(all_original_lyrics, all_generated_lyrics):
original_vector = np.mean([word2vec[word] for word in song_original_lyrics], axis=0)
generated_vector = np.mean([word2vec[word] for word in song_generated_lyrics], axis=0)
cos_sim = dot(original_vector, generated_vector) / (norm(original_vector) * norm(generated_vector))
cos_sim_list.append(cos_sim)
return np.mean(cos_sim_list)
def get_polarity_diff(all_generated_lyrics, all_original_lyrics):
# The polarity score is a float within the range [-1.0, 1.0].
pol_diff_list = []
for song_original_lyrics, song_generated_lyrics in zip(all_original_lyrics, all_generated_lyrics):
generated_lyrics = ' '.join(song_original_lyrics)
generated_blob = TextBlob(generated_lyrics)
original_lyrics = ' '.join(song_generated_lyrics)
original_blob = TextBlob(original_lyrics)
pol_diff = abs(generated_blob.sentiment.polarity - original_blob.sentiment.polarity)
pol_diff_list.append(pol_diff)
return np.mean(pol_diff_list)
def get_subjectivity_diff(all_generated_lyrics, all_original_lyrics):
# The subjectivity is a float within the range [0.0, 1.0] where 0.0 is very objective and 1.0 is very subjective.
pol_diff_list = []
for song_original_lyrics, song_generated_lyrics in zip(all_original_lyrics, all_generated_lyrics):
generated_lyrics = ' '.join(song_original_lyrics)
generated_blob = TextBlob(generated_lyrics)
original_lyrics = ' '.join(song_generated_lyrics)
original_blob = TextBlob(original_lyrics)
pol_diff = abs(generated_blob.sentiment.subjectivity - original_blob.sentiment.subjectivity)
pol_diff_list.append(pol_diff)
return np.mean(pol_diff_list)
print("Loaded Successfully")