Spaces:
Sleeping
Sleeping
import gradio as gr | |
from sentence_transformers import SentenceTransformer | |
from sklearn.metrics.pairwise import cosine_similarity | |
import numpy as np | |
import requests | |
from PIL import Image | |
from io import BytesIO | |
# Load model | |
model = SentenceTransformer('all-mpnet-base-v2') | |
# Load emoji dictionaries | |
def kitchen_txt_to_dict(filepath): | |
emoji_dict = {} | |
with open(filepath, 'r', encoding='utf-8') as f: | |
for line in f: | |
parts = line.strip().split(' ', 1) | |
if len(parts) == 2: | |
emoji, desc = parts | |
emoji_dict[emoji] = desc | |
return emoji_dict | |
file_path_emotion = 'google-emoji-kitchen-emotion.txt' | |
file_path_item = 'google-emoji-kitchen-item.txt' | |
emotion_dict = kitchen_txt_to_dict(file_path_emotion) | |
event_dict = kitchen_txt_to_dict('google-emoji-kitchen-item.txt') | |
# Precompute embeddings | |
emotion_embeddings = {emoji: model.encode(desc) for emoji, desc in emotion_dict.items()} | |
event_embeddings = {emoji: model.encode(desc) for emoji, desc in event_dict.items()} | |
# Helper functions | |
def find_top_emojis(embedding, emoji_embeddings, top_n=1): | |
similarities = [ | |
(emoji, cosine_similarity([embedding], [e_embed])[0][0]) | |
for emoji, e_embed in emoji_embeddings.items() | |
] | |
similarities.sort(key=lambda x: x[1], reverse=True) | |
return [emoji for emoji, _ in similarities[:top_n]] | |
def get_emoji_kitchen_url(emoji1, emoji2, size=256): | |
return f"https://emojik.vercel.app/s/{emoji1}_{emoji2}?size={size}" | |
def fetch_image(url): | |
try: | |
response = requests.get(url) | |
if response.status_code == 200 and "image" in response.headers.get("Content-Type", ""): | |
return Image.open(BytesIO(response.content)) | |
else: | |
return None | |
except: | |
return None | |
# Main function for Gradio | |
def sentence_to_emojis(sentence): | |
embedding = model.encode(sentence) | |
top_emotion = find_top_emojis(embedding, emotion_embeddings, top_n=1)[0] | |
top_event = find_top_emojis(embedding, event_embeddings, top_n=1)[0] | |
mashup_url = get_emoji_kitchen_url(top_emotion, top_event) | |
mashup_image = fetch_image(mashup_url) | |
return top_emotion, top_event, mashup_image | |
# Gradio interface | |
demo = gr.Interface( | |
fn=sentence_to_emojis, | |
inputs=gr.Textbox(lines=2, placeholder="Type a sentence..."), | |
outputs=[ | |
gr.Text(label="Top Emotion Emoji"), | |
gr.Text(label="Top Event Emoji"), | |
gr.Image(label=" Kitchen Emoji") | |
], | |
title="Sentence → Emoji Mashup", | |
description="Get the top emotion and event emoji from your sentence, and view the mashup!" | |
) | |
demo.launch(share=True) |