nlp-lab/Project/Tools/Emoji_Distance.py

147 lines
3.7 KiB
Python
Raw Normal View History

2018-06-10 15:14:41 +02:00
# 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)