# coding: utf-8 # # Emoji Distance # a notebook dealing witch emoji distance measures. Uses an external csv with labeled data to compare arbitriary emojis related to sentiment # Autor = Carsten Draschner # Version = 0.1 # ## Used Ressources # https://www.clarin.si/repository/xmlui/handle/11356/1048 # https://github.com/words/emoji-emotion # In[1]: import pandas as pd import math import numpy as np N=3 # In[53]: #read in csv as panda file df = pd.read_csv("/Users/Carsten/GitRepos/NLP-LAB/Project/Tools/Emoji_Sentiment_Data_v1.0.csv", delimiter=";") #df.head() # In[54]: #calculates vector distance between 2 3-dim sentiment representations of emojis def sentiment_vector_dist(v1,v2): #pos_v1 = v1[0] #neg_v1 = v1[1] #neu_v1 = v1[2] #pos_v2 = v2[0] #neg_v2 = v2[1] #neu_v2 = v2[2] #tmp_dist = float(np.abs(pos_v1-pos_v2))+float(np.abs(neg_v1-neg_v2))+float(np.abs(neu_v1-neu_v2)) #calculates vector distance between 2 3-dim sentiment representations of emojis consisting of positive neutral and negative probabilistic occuring tmp_dist = np.linalg.norm(np.array(v1)-np.array(v2)) return tmp_dist # In[55]: #calculates vector representation in a 3dim 0 to 1space of dimension: positive,negative,neutral def emoji_to_sentiment_vector(e): tmp = df[df["Emoji"]==e] #calculate by espacial labeled occurences devided by sum of overall occurences pos = tmp["Positive"].values[0]/tmp["Occurrences"].values[0] neg = tmp["Negative"].values[0]/tmp["Occurrences"].values[0] neu = tmp["Neutral"].values[0]/tmp["Occurrences"].values[0] #return as np array return np.array([pos,neg,neu]) # In[56]: #function to call for evaluating two emojis in its sentimental distance def emoji_distance(e1,e2): sent_v1 = emoji_to_sentiment_vector(e1) sent_v2 = emoji_to_sentiment_vector(e2) d = sentiment_vector_dist(sent_v1,sent_v2) return d # In[57]: def sentiment_vector_to_emoji(v1): #if(len(v1) == 3): #set initial values to compare with best_emoji = "😐" min_distance = 10000 #compare only with filtred emoticons df_filtered = df[df["Unicode block"]=="Emoticons"] all_smilies = list(df_filtered["Emoji"]) for e in all_smilies: v2 = emoji_to_sentiment_vector(e) d = sentiment_vector_dist(v1,v2) if(d < min_distance): min_distance = d best_emoji = e #print(str(v1),str(v2),str(min_distance),str(type(v1)),str(type(v2)),e) #print("for sentiment vector: "+str(v1)+" the emoji is : "+str(best_emoji)+" with distance of "+str(min_distance)+"!") return best_emoji #else: #print("WRONG SENTIMENT VECTOR") # In[58]: def show_demo(): df_filtered = df[df["Unicode block"]=="Emoticons"] all_smilies = list(df_filtered["Emoji"]) d_m = np.zeros(shape=(len(all_smilies),len(all_smilies))) for c1 in range(len(all_smilies)): for c2 in range(len(all_smilies)): e1 = all_smilies[c1] e2 = all_smilies[c2] d = emoji_distance(e1,e2) d_m[c1,c2] = d for c in range(len(d_m[0])): emoji = all_smilies[c] row = d_m[c] row_sorted = np.argsort(row) #closest 5 r = row_sorted[0:10] #print() closest = "" for i in r: closest+=all_smilies[i] print(emoji+": "+closest) # In[60]: #show_demo() # In[61]: #test bipolar matching entiment vector vs. emoji #df_filtered = df[df["Unicode block"]=="Emoticons"] #all_smilies = list(df_filtered["Emoji"]) #for e in all_smilies: # v2 = emoji_to_sentiment_vector(e) # sentiment_vector_to_emoji(v2)