Spaces:
Sleeping
Sleeping
# %% | |
import json | |
import pickle as pk | |
import random | |
import threading | |
from datetime import datetime | |
import gradio as gr | |
import numpy as np | |
from display import display_words | |
from gensim.models import KeyedVectors | |
from pistas import curiosity, hint | |
from seguimiento import calculate_moving_average, calculate_tendency_slope | |
from sentence_transformers import SentenceTransformer | |
model = KeyedVectors(768) | |
model_st = SentenceTransformer( | |
"sentence-transformers/paraphrase-multilingual-mpnet-base-v2" | |
) | |
embeddings_dict = {} | |
config_file_path = "config/lang.json" | |
secret_file_path = "config/secret.json" | |
class DictWrapper: | |
def __init__(self, data_dict): | |
self.__dict__.update(data_dict) | |
with open(config_file_path, "r") as file: | |
Config_full = json.load(file) | |
with open(secret_file_path, "r") as file: | |
secret = json.load(file) | |
lang = 0 | |
if lang == 0: | |
Config = DictWrapper(Config_full["SPA"]["Game"]) | |
secret_dict = secret["SPA"] | |
elif lang == 1: | |
Config = DictWrapper(Config_full["ENG"]["Game"]) | |
secret_dict = secret["ENG"] | |
else: | |
Config = DictWrapper(Config_full["SPA"]["Game"]) | |
secret_dict = secret["SPA"] | |
with open("ranking.txt", "w+") as file: | |
file.write("---------------------------") | |
pca = pk.load(open("pca_mpnet.pkl", "rb")) | |
print(Config.Difficulty_presentation_Full) | |
difficulty = int(input(Config.Difficulty + ": ")) | |
secret_list = secret_dict["basic"] if difficulty <= 2 else secret_dict["advanced"] | |
secret = secret_list.pop(random.randint(0, len(secret_list) - 1)) | |
secret = secret.lower() | |
words = [Config.secret_word] | |
scores = [10] | |
if secret not in embeddings_dict.keys(): | |
embeddings_dict[secret] = model_st.encode(secret, convert_to_tensor=True) | |
model.add_vector(secret, embeddings_dict[secret].tolist()) | |
word_vect = [embeddings_dict[secret].tolist()] | |
thread = threading.Thread( | |
target=display_words, args=(words, pca.transform(word_vect), scores, -1) | |
) | |
thread.start() | |
def preproc_vectors(words, word_vect, scores, repeated): | |
ascending_indices = np.argsort(scores) | |
descending_indices = list(ascending_indices[::-1]) | |
ranking_data = [] | |
k = len(words) - 1 | |
if repeated != -1: | |
k = repeated | |
ranking_data.append(["#" + str(k), words[k], scores[k]]) | |
ranking_data.append("---------------------------") | |
for i in descending_indices: | |
if i == 0: | |
continue | |
ranking_data.append(["#" + str(i), words[i], scores[i]]) | |
with open("ranking.txt", "w+") as file: | |
for item in ranking_data: | |
file.write("%s\n" % item) | |
if len(words) > 11: | |
if k in descending_indices[:11]: | |
descending_indices = descending_indices[:11] | |
else: | |
descending_indices = descending_indices[:11] | |
descending_indices.append(k) | |
words_display = [words[i] for i in descending_indices] | |
displayvect_display = pca.transform([word_vect[i] for i in descending_indices]) | |
scores_display = [scores[i] for i in descending_indices] | |
bold = descending_indices.index(k) | |
else: | |
words_display = words | |
displayvect_display = pca.transform(word_vect) | |
scores_display = scores | |
bold = k | |
return ( | |
words_display, | |
displayvect_display, | |
scores_display, | |
bold, | |
) | |
win = False | |
n = 0 | |
recent_hint = 0 | |
f_dev_avg = 0 | |
last_hint = -1 | |
if difficulty == 1: | |
n = 3 | |
def play_game(word): | |
global win, n, recent_hint, f_dev_avg, last_hint, words, word_vect, scores, thread | |
word = word.lower() | |
if word == "give_up": | |
return "Game Over" | |
if word in words: | |
repeated = words.index(word) | |
else: | |
repeated = -1 | |
words.append(word) | |
thread.join() | |
if word not in embeddings_dict.keys(): | |
embedding = model_st.encode(word, convert_to_tensor=True) | |
embeddings_dict[word] = embedding | |
model.add_vector(word, embedding.tolist()) | |
if repeated == -1: | |
word_vect.append(embeddings_dict[word].tolist()) | |
score = round(model.similarity(secret, word) * 10, 2) | |
if repeated == -1: | |
scores.append(score) | |
if score <= 2.5: | |
feedback = Config.Feedback_0 + str(score) | |
elif score > 2.5 and score <= 4.0: | |
feedback = Config.Feedback_1 + str(score) | |
elif score > 4.0 and score <= 6.0: | |
feedback = Config.Feedback_2 + str(score) | |
elif score > 6.0 and score <= 7.5: | |
feedback = Config.Feedback_3 + str(score) | |
elif score > 7.5 and score <= 8.0: | |
feedback = Config.Feedback_4 + str(score) | |
elif score > 8.0 and score < 10.0: | |
feedback = Config.Feedback_5 + str(score) | |
else: | |
win = True | |
feedback = Config.Feedback_8 | |
words[0] = secret | |
words.pop(len(words) - 1) | |
word_vect.pop(len(word_vect) - 1) | |
scores.pop(len(scores) - 1) | |
if score > scores[len(scores) - 2] and win == False: | |
feedback += "\n" + Config.Feedback_6 | |
elif score < scores[len(scores) - 2] and win == False: | |
feedback += "\n" + Config.Feedback_7 | |
if difficulty != 4: | |
mov_avg = calculate_moving_average(scores[1:], 5) | |
if len(mov_avg) > 1 and win == False: | |
f_dev = calculate_tendency_slope(mov_avg) | |
f_dev_avg = calculate_moving_average(f_dev, 3) | |
if f_dev_avg[len(f_dev_avg) - 1] < 0 and recent_hint == 0: | |
i = random.randint(0, len(Config.hint_intro) - 1) | |
feedback += "\n\n" + Config.hint_intro[i] | |
hint_text, n, last_hint = hint( | |
secret, | |
n, | |
model_st, | |
last_hint, | |
lang, | |
( | |
DictWrapper(Config_full["SPA"]["Hint"]) | |
if lang == 0 | |
else DictWrapper(Config_full["ENG"]["Hint"]) | |
), | |
) | |
feedback += "\n" + hint_text | |
recent_hint = 3 | |
if recent_hint != 0: | |
recent_hint -= 1 | |
( | |
words_display, | |
displayvect_display, | |
scores_display, | |
bold_display, | |
) = preproc_vectors(words, word_vect, scores, repeated) | |
if win: | |
bold_display = 0 | |
thread = threading.Thread( | |
target=display_words, | |
args=(words_display, displayvect_display, scores_display, bold_display), | |
) | |
thread.start() | |
if win: | |
feedback += "\nCongratulations! You guessed the secret word." | |
return feedback | |
def gradio_interface(): | |
return gr.Interface( | |
fn=play_game, | |
inputs="text", | |
outputs="text", | |
title="Secret Word Game", | |
description="Guess the secret word!", | |
examples=[ | |
["apple"], | |
["banana"], | |
["cherry"], | |
], | |
) | |
if __name__ == "__main__": | |
gradio_interface().launch() | |