{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"from IPython.display import clear_output, Markdown, Math\n",
"import ipywidgets as widgets\n",
"import os\n",
"import unicodedata as uni\n",
"import numpy as np\n",
"from nltk.stem import PorterStemmer\n",
"from nltk.tokenize import sent_tokenize, word_tokenize\n",
"from nltk.corpus import wordnet\n",
"import math\n",
"import pprint\n",
"\n",
"pp=pprint.PrettyPrinter(indent=4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Naive Approach"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* read in table"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Unnamed: 0 | \n",
" code | \n",
" character | \n",
" description | \n",
" description_de | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0 | \n",
" 126980 | \n",
" ๐ | \n",
" MAHJONG TILE RED DRAGON | \n",
" MAHJONG FLIESE ROT DRACHE | \n",
"
\n",
" \n",
" 1 | \n",
" 1 | \n",
" 129525 | \n",
" ๐งต | \n",
" SPOOL OF THREAD | \n",
" Spool Gewinde | \n",
"
\n",
" \n",
" 2 | \n",
" 2 | \n",
" 129526 | \n",
" ๐งถ | \n",
" BALL OF YARN | \n",
" BALL OF YARN | \n",
"
\n",
" \n",
" 3 | \n",
" 3 | \n",
" 127183 | \n",
" ๐ | \n",
" PLAYING CARD BLACK JOKER | \n",
" SPIELKARTE BLACK JOKER | \n",
"
\n",
" \n",
" 4 | \n",
" 4 | \n",
" 129296 | \n",
" ๐ค | \n",
" ZIPPER-MOUTH FACE | \n",
" ZIPPER-MUND Gesicht | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Unnamed: 0 code character description \\\n",
"0 0 126980 ๐ MAHJONG TILE RED DRAGON \n",
"1 1 129525 ๐งต SPOOL OF THREAD \n",
"2 2 129526 ๐งถ BALL OF YARN \n",
"3 3 127183 ๐ PLAYING CARD BLACK JOKER \n",
"4 4 129296 ๐ค ZIPPER-MOUTH FACE \n",
"\n",
" description_de \n",
"0 MAHJONG FLIESE ROT DRACHE \n",
"1 Spool Gewinde \n",
"2 BALL OF YARN \n",
"3 SPIELKARTE BLACK JOKER \n",
"4 ZIPPER-MUND Gesicht "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"table = pd.read_csv('../Tools/emoji_descriptions.csv')\n",
"table.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* todo: read in a lot of messages"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"messages = [\"Hello, this is a testing message\", \"this is a very sunny day today, i am very happy\"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* using a Stemmer to get the main 'Part' of each word"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"ps = PorterStemmer()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"stemmed_messages = []\n",
"for m in messages:\n",
" words = word_tokenize(m)\n",
" sm = []\n",
" for w in words:\n",
" sm.append(ps.stem(w))\n",
" stemmed_messages.append(sm)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[['hello', ',', 'thi', 'is', 'a', 'test', 'messag'],\n",
" ['thi',\n",
" 'is',\n",
" 'a',\n",
" 'veri',\n",
" 'sunni',\n",
" 'day',\n",
" 'today',\n",
" ',',\n",
" 'i',\n",
" 'am',\n",
" 'veri',\n",
" 'happi']]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stemmed_messages"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1027, 5)"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"table.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* compare words to emoji descriptions"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"def evaluate_sentence(sentence, description_key = 'description', lang = 'eng'):\n",
" \n",
" tokenized_sentence = word_tokenize(sentence)\n",
" n = len(tokenized_sentence)\n",
" l = table.shape[0]\n",
" matrix_list = []\n",
" \n",
" for index, row in table.iterrows():\n",
" emoji_tokens = word_tokenize(row[description_key])\n",
" m = len(emoji_tokens)\n",
"\n",
" mat = np.zeros(shape=(m,n))\n",
" for i in range(len(emoji_tokens)):\n",
" for j in range(len(tokenized_sentence)):\n",
" syn1 = wordnet.synsets(emoji_tokens[i],lang=lang)\n",
" if len(syn1) == 0:\n",
" continue\n",
" w1 = syn1[0]\n",
" #print(j, tokenized_sentence)\n",
" syn2 = wordnet.synsets(tokenized_sentence[j], lang=lang)\n",
" if len(syn2) == 0:\n",
" continue\n",
" w2 = syn2[0]\n",
" val = w1.wup_similarity(w2)\n",
" if val is None:\n",
" continue\n",
" mat[i,j] = val\n",
" #print(row['character'], mat)\n",
" matrix_list.append(mat)\n",
" \n",
" return matrix_list\n",
" \n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* building a lookup table:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"lookup = {}\n",
"emoji_set = []\n",
"for index, row in table.iterrows():\n",
" lookup[index] = row['character']\n",
" emoji_set.append(row['character'])\n",
"\n",
"emoji_set = set(emoji_set)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* sorting"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"def predict(sentence, description_key='description', lang = 'eng', n=10, t=0.9):\n",
"\n",
" result = evaluate_sentence(sentence, description_key, lang)\n",
" \n",
" summed = np.argsort([-np.sum(x) for x in result])[0:n]\n",
" max_val = np.argsort([-np.max(x) for x in result])[0:n]\n",
" avg = np.argsort([-np.mean(x) for x in result])[0:n]\n",
" threshold = np.argsort([-len(np.where(x>t)[0]) / (x.shape[0] * x.shape[1]) for x in result])[0:n]\n",
" \n",
" # build a result table\n",
" table_array = [[lookup[summed[i]], str(table.iloc[summed[i]][description_key]), \n",
" lookup[max_val[i]], str(table.iloc[max_val[i]][description_key]),\n",
" lookup[avg[i]], str(table.iloc[avg[i]][description_key]),\n",
" lookup[threshold[i]], str(table.iloc[threshold[i]][description_key])] for i in range(n) ]\n",
" \n",
" \n",
" table_frame = pd.DataFrame(table_array, columns=['summed', 'summed_description','max_val', 'max_val_description','avg', 'avg_description','threshold', 'threshold_description'])\n",
" \n",
" display(table_frame)\n"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" summed | \n",
" summed_description | \n",
" max_val | \n",
" max_val_description | \n",
" avg | \n",
" avg_description | \n",
" threshold | \n",
" threshold_description | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" ๐คญ | \n",
" SMILING FACE WITH SMILING EYES AND HAND COVERI... | \n",
" ๐ค | \n",
" I LOVE YOU HAND SIGN | \n",
" ๐ | \n",
" BOUQUET | \n",
" ๐ | \n",
" TRAIN | \n",
"
\n",
" \n",
" 1 | \n",
" ๐ | \n",
" ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW... | \n",
" ๐ฎ | \n",
" REGIONAL INDICATOR SYMBOL LETTER I | \n",
" ๐ณ | \n",
" COOKING | \n",
" ๐ธ | \n",
" CHILDREN CROSSING | \n",
"
\n",
" \n",
" 2 | \n",
" ๐ฎ | \n",
" PUT LITTER IN ITS PLACE SYMBOL | \n",
" ๐ | \n",
" TRAIN | \n",
" ๐ | \n",
" TRAIN | \n",
" ๐ | \n",
" HIGH-SPEED TRAIN | \n",
"
\n",
" \n",
" 3 | \n",
" ๐คช | \n",
" GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE | \n",
" ๐
| \n",
" HIGH-SPEED TRAIN WITH BULLET NOSE | \n",
" ๐ฅ | \n",
" MOVIE CAMERA | \n",
" ๐ฎ | \n",
" REGIONAL INDICATOR SYMBOL LETTER I | \n",
"
\n",
" \n",
" 4 | \n",
" ๐ฅฐ | \n",
" SMILING FACE WITH SMILING EYES AND THREE HEARTS | \n",
" ๐ | \n",
" HIGH-SPEED TRAIN | \n",
" ๐ญ | \n",
" PERFORMING ARTS | \n",
" ๐ค | \n",
" I LOVE YOU HAND SIGN | \n",
"
\n",
" \n",
" 5 | \n",
" ๐ | \n",
" PERSON RAISING BOTH HANDS IN CELEBRATION | \n",
" ๐ธ | \n",
" CHILDREN CROSSING | \n",
" ๐น | \n",
" MUSICAL KEYBOARD | \n",
" ๐
| \n",
" HIGH-SPEED TRAIN WITH BULLET NOSE | \n",
"
\n",
" \n",
" 6 | \n",
" ๐ | \n",
" RAISED HAND WITH PART BETWEEN MIDDLE AND RING ... | \n",
" ๐ธ | \n",
" FLYING SAUCER | \n",
" ๐งพ | \n",
" RECEIPT | \n",
" ๐น | \n",
" SMALL BLUE DIAMOND | \n",
"
\n",
" \n",
" 7 | \n",
" ๐ | \n",
" CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE... | \n",
" ๐ฅพ | \n",
" HIKING BOOT | \n",
" ๐ | \n",
" KISS | \n",
" ๐ | \n",
" FAX MACHINE | \n",
"
\n",
" \n",
" 8 | \n",
" ๐ | \n",
" SMILING FACE WITH OPEN MOUTH AND SMILING EYES | \n",
" ๐ฅ | \n",
" FLYING DISC | \n",
" ๐ฅ | \n",
" FIRE | \n",
" ๐ก | \n",
" SATELLITE ANTENNA | \n",
"
\n",
" \n",
" 9 | \n",
" ๐ | \n",
" WHITE RIGHT POINTING BACKHAND INDEX | \n",
" ๐ | \n",
" BUS STOP | \n",
" ๐ผ | \n",
" MUSICAL SCORE | \n",
" ๐ข | \n",
" PUBLIC ADDRESS LOUDSPEAKER | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" summed summed_description max_val \\\n",
"0 ๐คญ SMILING FACE WITH SMILING EYES AND HAND COVERI... ๐ค \n",
"1 ๐ ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW... ๐ฎ \n",
"2 ๐ฎ PUT LITTER IN ITS PLACE SYMBOL ๐ \n",
"3 ๐คช GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE ๐
\n",
"4 ๐ฅฐ SMILING FACE WITH SMILING EYES AND THREE HEARTS ๐ \n",
"5 ๐ PERSON RAISING BOTH HANDS IN CELEBRATION ๐ธ \n",
"6 ๐ RAISED HAND WITH PART BETWEEN MIDDLE AND RING ... ๐ธ \n",
"7 ๐ CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE... ๐ฅพ \n",
"8 ๐ SMILING FACE WITH OPEN MOUTH AND SMILING EYES ๐ฅ \n",
"9 ๐ WHITE RIGHT POINTING BACKHAND INDEX ๐ \n",
"\n",
" max_val_description avg avg_description threshold \\\n",
"0 I LOVE YOU HAND SIGN ๐ BOUQUET ๐ \n",
"1 REGIONAL INDICATOR SYMBOL LETTER I ๐ณ COOKING ๐ธ \n",
"2 TRAIN ๐ TRAIN ๐ \n",
"3 HIGH-SPEED TRAIN WITH BULLET NOSE ๐ฅ MOVIE CAMERA ๐ฎ \n",
"4 HIGH-SPEED TRAIN ๐ญ PERFORMING ARTS ๐ค \n",
"5 CHILDREN CROSSING ๐น MUSICAL KEYBOARD ๐
\n",
"6 FLYING SAUCER ๐งพ RECEIPT ๐น \n",
"7 HIKING BOOT ๐ KISS ๐ \n",
"8 FLYING DISC ๐ฅ FIRE ๐ก \n",
"9 BUS STOP ๐ผ MUSICAL SCORE ๐ข \n",
"\n",
" threshold_description \n",
"0 TRAIN \n",
"1 CHILDREN CROSSING \n",
"2 HIGH-SPEED TRAIN \n",
"3 REGIONAL INDICATOR SYMBOL LETTER I \n",
"4 I LOVE YOU HAND SIGN \n",
"5 HIGH-SPEED TRAIN WITH BULLET NOSE \n",
"6 SMALL BLUE DIAMOND \n",
"7 FAX MACHINE \n",
"8 SATELLITE ANTENNA \n",
"9 PUBLIC ADDRESS LOUDSPEAKER "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"predict(\"I like to travel by train\", description_key='description' , lang='eng')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}