Javierss commited on
Commit
f60623c
1 Parent(s): 158bf9c

Add word check and change ln to log10

Browse files
__pycache__/app.cpython-311.pyc CHANGED
Binary files a/__pycache__/app.cpython-311.pyc and b/__pycache__/app.cpython-311.pyc differ
 
__pycache__/game.cpython-311.pyc CHANGED
Binary files a/__pycache__/game.cpython-311.pyc and b/__pycache__/game.cpython-311.pyc differ
 
app.py CHANGED
@@ -1,61 +1,61 @@
1
- """
2
- This module defines a Gradio-based web application for the Semantrix game. The application allows users to play the game in either Spanish or English, using different embedding models for word similarity.
3
-
4
- Modules:
5
- gradio: Used for creating the web interface.
6
- json: Used for loading configuration files.
7
- game: Contains the Semantrix class for game logic.
8
-
9
- File Paths:
10
- config_file_path: Path to the configuration file.
11
- logo_path: Path to the logo image.
12
- logo_win_path: Path to the winning logo image.
13
-
14
- Functions:
15
- convert_to_markdown_centered(text):
16
- Converts text to a centered markdown format for displaying game history and last attempt.
17
-
18
- reset(difficulty, lang, model):
19
- Resets the game state based on the selected difficulty, language, and model.
20
-
21
- change(state, inp):
22
- Changes the game state by incrementing the state variable.
23
-
24
- update(state, radio, inp, hint):
25
- Updates the game state and UI components based on the current state and user inputs.
26
-
27
- Gradio Components:
28
- demo: The main Gradio Blocks component that contains the entire UI layout.
29
- header: A Markdown component for displaying the game header.
30
- state: A State component for tracking the current game state.
31
- difficulty: A State component for tracking the difficulty level.
32
- hint: A State component for tracking if a hint is provided.
33
- img: An Image component for displaying the game logo.
34
- ranking: A Markdown component for displaying the ranking.
35
- out: A Textbox component for displaying game messages.
36
- hint_out: A Textbox component for displaying hints.
37
- radio: A Radio component for user selections.
38
- inp: A Textbox component for user input.
39
- but: A Button component for several actions.
40
- give_up: A Button component for giving up.
41
- reload: A Button component for reloading the game.
42
- model: A Dropdown component for selecting the embedding model.
43
- lang: A Dropdown component for selecting the language.
44
-
45
- Events:
46
- inp.submit: Triggers the change function on input submission.
47
- but.click: Triggers the change function on button click.
48
- give_up.click: Triggers the change function on give up button click.
49
- radio.input: Triggers the change function on radio input.
50
- reload.click: Triggers the reset function on reload button click.
51
- demo.load: Triggers the reset function on demo load.
52
- lang[0].select: Triggers the reset function on language selection.
53
- model[0].select: Triggers the reset function on model selection.
54
- state.change: Triggers the update function on state change.
55
-
56
- Main:
57
- Launches the Gradio application if the script is run as the main module.
58
- """
59
 
60
  import gradio as gr
61
  import json
@@ -411,7 +411,7 @@ with gr.Blocks() as demo:
411
  visible=True,
412
  ),
413
  gr.Textbox(curiosity, visible=True, label=Menu["Curiosity"]),
414
- gr.Button(visible=True),
415
  gr.Markdown(visible=False),
416
  ]
417
  )
 
1
+ # """
2
+ # This module defines a Gradio-based web application for the Semantrix game. The application allows users to play the game in either Spanish or English, using different embedding models for word similarity.
3
+
4
+ # Modules:
5
+ # gradio: Used for creating the web interface.
6
+ # json: Used for loading configuration files.
7
+ # game: Contains the Semantrix class for game logic.
8
+
9
+ # File Paths:
10
+ # config_file_path: Path to the configuration file.
11
+ # logo_path: Path to the logo image.
12
+ # logo_win_path: Path to the winning logo image.
13
+
14
+ # Functions:
15
+ # convert_to_markdown_centered(text):
16
+ # Converts text to a centered markdown format for displaying game history and last attempt.
17
+
18
+ # reset(difficulty, lang, model):
19
+ # Resets the game state based on the selected difficulty, language, and model.
20
+
21
+ # change(state, inp):
22
+ # Changes the game state by incrementing the state variable.
23
+
24
+ # update(state, radio, inp, hint):
25
+ # Updates the game state and UI components based on the current state and user inputs.
26
+
27
+ # Gradio Components:
28
+ # demo: The main Gradio Blocks component that contains the entire UI layout.
29
+ # header: A Markdown component for displaying the game header.
30
+ # state: A State component for tracking the current game state.
31
+ # difficulty: A State component for tracking the difficulty level.
32
+ # hint: A State component for tracking if a hint is provided.
33
+ # img: An Image component for displaying the game logo.
34
+ # ranking: A Markdown component for displaying the ranking.
35
+ # out: A Textbox component for displaying game messages.
36
+ # hint_out: A Textbox component for displaying hints.
37
+ # radio: A Radio component for user selections.
38
+ # inp: A Textbox component for user input.
39
+ # but: A Button component for several actions.
40
+ # give_up: A Button component for giving up.
41
+ # reload: A Button component for reloading the game.
42
+ # model: A Dropdown component for selecting the embedding model.
43
+ # lang: A Dropdown component for selecting the language.
44
+
45
+ # Events:
46
+ # inp.submit: Triggers the change function on input submission.
47
+ # but.click: Triggers the change function on button click.
48
+ # give_up.click: Triggers the change function on give up button click.
49
+ # radio.input: Triggers the change function on radio input.
50
+ # reload.click: Triggers the reset function on reload button click.
51
+ # demo.load: Triggers the reset function on demo load.
52
+ # lang[0].select: Triggers the reset function on language selection.
53
+ # model[0].select: Triggers the reset function on model selection.
54
+ # state.change: Triggers the update function on state change.
55
+
56
+ # Main:
57
+ # Launches the Gradio application if the script is run as the main module.
58
+ # """
59
 
60
  import gradio as gr
61
  import json
 
411
  visible=True,
412
  ),
413
  gr.Textbox(curiosity, visible=True, label=Menu["Curiosity"]),
414
+ gr.Button(Menu["Play_again"], visible=True),
415
  gr.Markdown(visible=False),
416
  ]
417
  )
data/ranking.txt CHANGED
@@ -1,10 +1 @@
1
- ['#8', 'medium', 6.94]
2
- ---------------------------
3
- ['#1', 'amigo', 8.3]
4
- ['#2', 'loco', 7.64]
5
- ['#7', 'fantasma', 7.41]
6
- ['#8', 'medium', 6.94]
7
- ['#4', 'hermano', 6.81]
8
- ['#5', 'duelo', 5.76]
9
- ['#3', 'familia', 4.88]
10
- ['#6', 'divorcio', 1.67]
 
1
+ ---------------------------
 
 
 
 
 
 
 
 
 
game.py CHANGED
@@ -1,40 +1,40 @@
1
- """
2
- Semantrix Game Module
3
-
4
- This module defines the Semantrix class, which implements a word guessing game using word embeddings. The game can be configured to use either a Word2Vec model or a SentenceTransformer model for word embeddings. The game supports multiple languages and difficulty levels.
5
-
6
- Classes:
7
- Semantrix: A class that implements the Semantrix word guessing game.
8
- Semantrix.DictWrapper: A helper class to wrap configuration dictionaries.
9
-
10
- Functions:
11
- __init__(self, lang=0, model_type="SentenceTransformer"): Initializes the Semantrix game with the specified language and model type.
12
- prepare_game(self, difficulty): Prepares the game with the selected difficulty level.
13
- gen_rank(self, repeated): Generates the ranking file based on the scores.
14
- play_game(self, word): Plays the game with the selected word and returns feedback.
15
- curiosity(self): Generates a curiosity hint about the secret word once the game is over.
16
-
17
- Attributes:
18
- model (KeyedVectors): The word embeddings model.
19
- config_file_path (str): Path to the configuration file.
20
- secret_file_path (str): Path to the secret words file.
21
- data_path (str): Path to the data directory.
22
- Config_full (dict): Full configuration data.
23
- secret (dict): Secret words data.
24
- lang (int): Language of the game (0 for Spanish, 1 for English).
25
- model_type (str): Type of the model ("word2vec" or "SentenceTransformer").
26
- Config (DictWrapper): Configuration data for the selected language.
27
- secret_dict (dict): Secret words for the selected language.
28
- secret_list (list): List of secret words for the selected difficulty.
29
- words (list): List of words guessed by the player.
30
- scores (list): List of scores for the guessed words.
31
- win (bool): Indicates if the player has won the game.
32
- n (int): Number of hints given.
33
- recent_hint (int): Counter for recent hints.
34
- f_dev_avg (float): Moving average of the tendency slope.
35
- last_hint (int): Index of the last hint given.
36
- difficulty (int): Difficulty level of the game.
37
- """
38
 
39
  import json
40
  import random
@@ -55,9 +55,6 @@ warnings.filterwarnings(action="ignore", category=UserWarning, module="gensim")
55
  # Define the class Semantrix
56
  class Semantrix:
57
 
58
- # Create empty KeyedVectors model with predefined size where the embeddings will be stored
59
- model = KeyedVectors(768)
60
-
61
  # Define the paths for the configuration files and the data
62
  config_file_path = "config/lang.json"
63
  secret_file_path = "config/secret.json"
@@ -85,33 +82,23 @@ class Semantrix:
85
  # Set the model type
86
  self.model_type = model_type
87
 
88
- # Load word2vec model if needed
89
- if self.model_type == "word2vec":
90
- if self.lang == 1:
91
- self.model = KeyedVectors.load(
92
- "config/w2v_models/eng_w2v_model", mmap="r"
93
- )
94
- self.Config = self.DictWrapper(self.Config_full["ENG"]["Game"])
95
- self.secret_dict = self.secret["ENG"]
96
- else:
97
- self.model = KeyedVectors.load(
98
- "config/w2v_models/esp_w2v_model", mmap="r"
99
- )
100
- self.Config = self.DictWrapper(self.Config_full["SPA"]["Game"])
101
- self.secret_dict = self.secret["SPA"]
102
- else:
103
- self.model_st = SentenceTransformer(
104
- "sentence-transformers/paraphrase-multilingual-mpnet-base-v2"
105
- )
106
-
107
- # Set the configuration variables depending on the language
108
  if self.lang == 1:
 
109
  self.Config = self.DictWrapper(self.Config_full["ENG"]["Game"])
110
  self.secret_dict = self.secret["ENG"]
111
  else:
 
112
  self.Config = self.DictWrapper(self.Config_full["SPA"]["Game"])
113
  self.secret_dict = self.secret["SPA"]
114
 
 
 
 
 
 
 
 
 
115
  # Create the ranking file
116
  with open(self.data_path + "ranking.txt", "w+") as file:
117
  file.write("---------------------------")
@@ -137,12 +124,11 @@ class Semantrix:
137
  self.scores = [10]
138
 
139
  # Store the embedding of the secret word in the embeddings dictionary
140
- if self.secret not in self.model.key_to_index.keys():
141
-
142
  # Add the secret word to the KeyedVectors model if the model type is SentenceTransformer
143
  # If the model type is word2vec, the secret word is already in the model
144
- if self.model_type == "SentenceTransformer":
145
- self.model.add_vector(
146
  self.secret,
147
  self.model_st.encode(self.secret, convert_to_tensor=True).tolist(),
148
  )
@@ -206,31 +192,40 @@ class Semantrix:
206
 
207
  # Check if the word is in the model already
208
  if word not in self.model.key_to_index.keys():
209
- # Add the word to the KeyedVectors model if the model type is SentenceTransformer
210
- if self.model_type == "SentenceTransformer":
211
- self.model.add_vector(
212
- word, self.model_st.encode(word, convert_to_tensor=True).tolist()
213
- )
214
- else:
215
- # If the word is not in the model when using word2vec, remove it from the words list and provide feedback
216
- self.words.pop(len(self.words) - 1)
217
- feedback = (
218
- "I don't know that word. Try again."
219
- if self.lang == 1
220
- else "No conozco esa palabra. Inténtalo de nuevo."
221
- )
222
- feedback += (
223
- "[rank]" + open(self.data_path + "ranking.txt", "r").read()
224
- if len(self.words) > 1
225
- else "\n\n"
226
- )
227
- return feedback
 
 
 
228
 
229
  # Calculate the score of the word, apply logarithmic scaling, interpolate the score to a range from 0 to 10, and round it to two decimal places
 
 
 
 
 
 
230
  score = round(
231
  np.interp(
232
- np.log(self.model.similarity(self.secret, word) * 10),
233
- [0, np.log(10)],
234
  [0, 10],
235
  ),
236
  2,
 
1
+ # """
2
+ # Semantrix Game Module
3
+
4
+ # This module defines the Semantrix class, which implements a word guessing game using word embeddings. The game can be configured to use either a Word2Vec model or a SentenceTransformer model for word embeddings. The game supports multiple languages and difficulty levels.
5
+
6
+ # Classes:
7
+ # Semantrix: A class that implements the Semantrix word guessing game.
8
+ # Semantrix.DictWrapper: A helper class to wrap configuration dictionaries.
9
+
10
+ # Functions:
11
+ # __init__(self, lang=0, model_type="SentenceTransformer"): Initializes the Semantrix game with the specified language and model type.
12
+ # prepare_game(self, difficulty): Prepares the game with the selected difficulty level.
13
+ # gen_rank(self, repeated): Generates the ranking file based on the scores.
14
+ # play_game(self, word): Plays the game with the selected word and returns feedback.
15
+ # curiosity(self): Generates a curiosity hint about the secret word once the game is over.
16
+
17
+ # Attributes:
18
+ # model (KeyedVectors): The word embeddings model.
19
+ # config_file_path (str): Path to the configuration file.
20
+ # secret_file_path (str): Path to the secret words file.
21
+ # data_path (str): Path to the data directory.
22
+ # Config_full (dict): Full configuration data.
23
+ # secret (dict): Secret words data.
24
+ # lang (int): Language of the game (0 for Spanish, 1 for English).
25
+ # model_type (str): Type of the model ("word2vec" or "SentenceTransformer").
26
+ # Config (DictWrapper): Configuration data for the selected language.
27
+ # secret_dict (dict): Secret words for the selected language.
28
+ # secret_list (list): List of secret words for the selected difficulty.
29
+ # words (list): List of words guessed by the player.
30
+ # scores (list): List of scores for the guessed words.
31
+ # win (bool): Indicates if the player has won the game.
32
+ # n (int): Number of hints given.
33
+ # recent_hint (int): Counter for recent hints.
34
+ # f_dev_avg (float): Moving average of the tendency slope.
35
+ # last_hint (int): Index of the last hint given.
36
+ # difficulty (int): Difficulty level of the game.
37
+ # """
38
 
39
  import json
40
  import random
 
55
  # Define the class Semantrix
56
  class Semantrix:
57
 
 
 
 
58
  # Define the paths for the configuration files and the data
59
  config_file_path = "config/lang.json"
60
  secret_file_path = "config/secret.json"
 
82
  # Set the model type
83
  self.model_type = model_type
84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  if self.lang == 1:
86
+ self.model = KeyedVectors.load("config/w2v_models/eng_w2v_model", mmap="r")
87
  self.Config = self.DictWrapper(self.Config_full["ENG"]["Game"])
88
  self.secret_dict = self.secret["ENG"]
89
  else:
90
+ self.model = KeyedVectors.load("config/w2v_models/esp_w2v_model", mmap="r")
91
  self.Config = self.DictWrapper(self.Config_full["SPA"]["Game"])
92
  self.secret_dict = self.secret["SPA"]
93
 
94
+ # Create empty KeyedVectors model with predefined size where the embeddings will be stored if Sentence Transformer used
95
+ if self.model_type == "SentenceTransformer":
96
+ self.model_trans = KeyedVectors(768)
97
+
98
+ self.model_st = SentenceTransformer(
99
+ "sentence-transformers/paraphrase-multilingual-mpnet-base-v2"
100
+ )
101
+
102
  # Create the ranking file
103
  with open(self.data_path + "ranking.txt", "w+") as file:
104
  file.write("---------------------------")
 
124
  self.scores = [10]
125
 
126
  # Store the embedding of the secret word in the embeddings dictionary
127
+ if self.model_type == "SentenceTransformer":
 
128
  # Add the secret word to the KeyedVectors model if the model type is SentenceTransformer
129
  # If the model type is word2vec, the secret word is already in the model
130
+ if self.secret not in self.model_trans.key_to_index.keys():
131
+ self.model_trans.add_vector(
132
  self.secret,
133
  self.model_st.encode(self.secret, convert_to_tensor=True).tolist(),
134
  )
 
192
 
193
  # Check if the word is in the model already
194
  if word not in self.model.key_to_index.keys():
195
+ # If the word is not in the model, remove it from the words list and provide feedback
196
+ self.words.pop(len(self.words) - 1)
197
+ feedback = (
198
+ "I don't know that word. Try again."
199
+ if self.lang == 1
200
+ else "No conozco esa palabra. Inténtalo de nuevo."
201
+ )
202
+ feedback += (
203
+ "[rank]" + open(self.data_path + "ranking.txt", "r").read()
204
+ if len(self.words) > 1
205
+ else "\n\n"
206
+ )
207
+ return feedback
208
+
209
+ # Add the word to the KeyedVectors model if the model type is SentenceTransformer and the word is not already in the model
210
+ if (
211
+ self.model_type == "SentenceTransformer"
212
+ and word not in self.model_trans.key_to_index.keys()
213
+ ):
214
+ self.model_trans.add_vector(
215
+ word, self.model_st.encode(word, convert_to_tensor=True).tolist()
216
+ )
217
 
218
  # Calculate the score of the word, apply logarithmic scaling, interpolate the score to a range from 0 to 10, and round it to two decimal places
219
+ if self.model_type == "word2vec":
220
+ similarity = self.model.similarity(self.secret, word)
221
+ else:
222
+ similarity = self.model_trans.similarity(self.secret, word)
223
+
224
+ log_similarity = np.log10((similarity if similarity > 0 else 0) * 10)
225
  score = round(
226
  np.interp(
227
+ log_similarity,
228
+ [0, np.log10(10)],
229
  [0, 10],
230
  ),
231
  2,
hints.py CHANGED
@@ -1,36 +1,36 @@
1
- """
2
- This module provides functions to generate dynamic hints and curiosities about a secret word using llms.
3
 
4
- Functions:
5
- hint(secret, n, model, last_hint, lang, Config):
6
- Generates a dynamic hint based on the secret word and the number of hints given.
7
- Parameters:
8
- secret (str): The secret word.
9
- n (int): The number of hints already given.
10
- model: The sentence transformer model used for encoding.
11
- last_hint (int): The index of the last hint given.
12
- lang (int): The language code (0 for Spanish, 1 for English).
13
- Config: Configuration object containing hint templates.
14
- Returns:
15
- tuple: A tuple containing the generated hint (str), the updated number of hints (int), and the index of the last hint given (int).
16
 
17
- curiosity(secret, Config):
18
- Generates a curiosity about the secret word.
19
- Parameters:
20
- secret (str): The secret word.
21
- Config: Configuration object containing the curiosity template.
22
- Returns:
23
- str: The generated curiosity.
24
 
25
- ireplace(old, new, text):
26
- Replaces all occurrences of a substring in a string, case-insensitively.
27
- Parameters:
28
- old (str): The substring to be replaced.
29
- new (str): The substring to replace with.
30
- text (str): The original string.
31
- Returns:
32
- str: The modified string with all occurrences of the old substring replaced by the new substring.
33
- """
34
 
35
  import random
36
  import openai
 
1
+ # """
2
+ # This module provides functions to generate dynamic hints and curiosities about a secret word using llms.
3
 
4
+ # Functions:
5
+ # hint(secret, n, model, last_hint, lang, Config):
6
+ # Generates a dynamic hint based on the secret word and the number of hints given.
7
+ # Parameters:
8
+ # secret (str): The secret word.
9
+ # n (int): The number of hints already given.
10
+ # model: The sentence transformer model used for encoding.
11
+ # last_hint (int): The index of the last hint given.
12
+ # lang (int): The language code (0 for Spanish, 1 for English).
13
+ # Config: Configuration object containing hint templates.
14
+ # Returns:
15
+ # tuple: A tuple containing the generated hint (str), the updated number of hints (int), and the index of the last hint given (int).
16
 
17
+ # curiosity(secret, Config):
18
+ # Generates a curiosity about the secret word.
19
+ # Parameters:
20
+ # secret (str): The secret word.
21
+ # Config: Configuration object containing the curiosity template.
22
+ # Returns:
23
+ # str: The generated curiosity.
24
 
25
+ # ireplace(old, new, text):
26
+ # Replaces all occurrences of a substring in a string, case-insensitively.
27
+ # Parameters:
28
+ # old (str): The substring to be replaced.
29
+ # new (str): The substring to replace with.
30
+ # text (str): The original string.
31
+ # Returns:
32
+ # str: The modified string with all occurrences of the old substring replaced by the new substring.
33
+ # """
34
 
35
  import random
36
  import openai