|
|
|
import json |
|
import pickle as pk |
|
import random |
|
import threading |
|
from datetime import datetime |
|
|
|
import numpy as np |
|
from gensim.models import KeyedVectors |
|
from sentence_transformers import SentenceTransformer |
|
|
|
from display import display_words |
|
from pistas import curiosity, hint |
|
from seguimiento import calculate_moving_average, calculate_tendency_slope |
|
|
|
|
|
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] |
|
|
|
|
|
|
|
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 |
|
|
|
while win == False: |
|
word = input(Config.New_word).lower() |
|
if word == "give_up": |
|
break |
|
if word in words: |
|
repeated = words.index(word) |
|
|
|
else: |
|
repeated = -1 |
|
words.append(word) |
|
|
|
thread.join() |
|
|
|
|
|
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) |
|
|
|
|
|
print(feedback) |
|
if score > scores[len(scores) - 2] and win == False: |
|
print(Config.Feedback_6) |
|
elif score < scores[len(scores) - 2] and win == False: |
|
print(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) |
|
print("\n") |
|
print(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"]), |
|
) |
|
print(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 == False: |
|
print(Config.Feedback_9 + secret) |
|
print(Config.Feedback_10) |
|
|
|
curiosity = curiosity( |
|
secret, |
|
DictWrapper(Config_full["SPA"]["Hint"]) |
|
if lang == 0 |
|
else DictWrapper(Config_full["ENG"]["Hint"]), |
|
) |
|
print(curiosity) |
|
|
|
with open("ranking.txt", "r") as original_file: |
|
file_content = original_file.readlines() |
|
|
|
|
|
new_file_name = secret + "_" + str(datetime.now()) |
|
|
|
with open("data/" + new_file_name, "w") as new_file: |
|
new_file.writelines(file_content[2:]) |
|
|
|
thread.join() |
|
exit() |
|
|