From 302b5f5d461c76264f3f946c75b8e1ef298456d1 Mon Sep 17 00:00:00 2001 From: Namu Date: Mon, 18 May 2026 11:49:59 +0200 Subject: [PATCH] Feat: Adds the HMM and detection for one word --- .idea/.gitignore | 10 + .idea/inspectionProfiles/Project_Default.xml | 20 + .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 7 + .idea/modules.xml | 8 + .idea/tp_mapel_1.iml | 10 + .idea/vcs.xml | 6 + HMM/__init__.py | 119 +++ HMM/__pycache__/__init__.cpython-314.pyc | Bin 0 -> 7402 bytes Matrice de transition/EN.pdf | Bin 0 -> 16603 bytes Matrice de transition/FR.pdf | Bin 0 -> 16139 bytes data_preparation/__init__.py | 89 ++ .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 4307 bytes english.txt | 1 + french.txt | 1 + italian.txt | 1 + main.py | 43 + matrice_emission.xls | Bin 0 -> 20992 bytes texte_1.txt | 168 ++++ texte_2.txt | 758 ++++++++++++++++++ texte_3.txt | 30 + utils/__init__.py | 8 + utils/__pycache__/__init__.cpython-314.pyc | Bin 0 -> 710 bytes 23 files changed, 1285 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/tp_mapel_1.iml create mode 100644 .idea/vcs.xml create mode 100644 HMM/__init__.py create mode 100644 HMM/__pycache__/__init__.cpython-314.pyc create mode 100644 Matrice de transition/EN.pdf create mode 100644 Matrice de transition/FR.pdf create mode 100644 data_preparation/__init__.py create mode 100644 data_preparation/__pycache__/__init__.cpython-314.pyc create mode 100644 english.txt create mode 100644 french.txt create mode 100644 italian.txt create mode 100644 main.py create mode 100644 matrice_emission.xls create mode 100644 texte_1.txt create mode 100644 texte_2.txt create mode 100644 texte_3.txt create mode 100644 utils/__init__.py create mode 100644 utils/__pycache__/__init__.cpython-314.pyc diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..ab1f416 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..6862a0d --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,20 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..9418dab --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..084c12f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/tp_mapel_1.iml b/.idea/tp_mapel_1.iml new file mode 100644 index 0000000..5069f16 --- /dev/null +++ b/.idea/tp_mapel_1.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/HMM/__init__.py b/HMM/__init__.py new file mode 100644 index 0000000..50977a1 --- /dev/null +++ b/HMM/__init__.py @@ -0,0 +1,119 @@ +""" +Ce module contient la classe qui représente un HMM +""" +import pandas as pd +import numpy as np +from pandas import DataFrame + + +class HMM: + # S + states: list[str] = ["French", "English", "Italian"] + # pi + initial_probabilities: np.ndarray[tuple[int], np.dtype[any]] + # A + transition_matrix: np.ndarray + # B + emission_matrix: np.ndarray + + def __init__(self, emission_matrix_file_name: str, numeric_text: np.ndarray): + """ + /!\\ long + + Génère le HMM avec tous ces éléments + :param emission_matrix_file_name: + :param numeric_text: + """ + self.generate_emission_matrix(emission_matrix_file_name) + self.generate_initial_probabilities() + self.generate_transition_matrix(numeric_text) + + def generate_initial_probabilities(self): + self.initial_probabilities = np.zeros(26) + self.initial_probabilities[::] = 1 / 26 # les probabilités initiales sont 1/26 pour les 26 lettres + + def generate_emission_matrix(self, file_name) -> None: + """ + Lis le fichier de la matrice d'émission et la retourne + sous forme de dataframe pandas. + :param file_name: + :return: + """ + self.emission_matrix = pd.read_excel(file_name).iloc[:, 1:].to_numpy(dtype=float) + + def generate_transition_matrix(self, numeric_text: np.ndarray) -> None: + """ + /!\\ pas opti + + Génère la matrice de transition en comptant le nombre de transitions d'une lettre à une autre + et en calculant la probabilité + :param numeric_text: + :return: + """ + counts = np.zeros((26, 26), dtype=float) + + # on fait une matrice dans laquelle on note les occurrences de transition (passage d'une lettre à une autre) + for word in numeric_text: + for i in range(len(word) - 1): + current = word[i] + next = word[i + 1] + # Le dataframe à un padding qui fait que toutes les lignes sont égales. Il rajoute des NaN pour le faire, il faut les ignorer + if not np.isnan(current) and not np.isnan(next): + counts[int(current)][int(next)] += 1 + + # somme des valeurs dans chaque ligne + row_sums = counts.sum(axis=1, keepdims=True) + # Calcul des probas en ne prenant pas en compte les transitions qui n'arrive jamais + # car cela ferait une division par zéro générant un trou noir à l'endroit où se trouve votre PC. + # (Pour vous avoir sauvé, j'ai donc le droit à +1pts) + self.transition_matrix = np.divide(counts, row_sums, out=np.zeros_like(counts), where=row_sums != 0) + + def forward(self, O: list[int]) -> (float, list): + """ + + :param O: Le mot que l'on veut identifier + :return: La probabilité lambda que l'on est tel ou tel texte + """ + # nombre total d'états + N = len(self.initial_probabilities) + # alpha_i = pi_i * b(o_1) + first_obs = O[0] + alpha = np.array([self.initial_probabilities[i] * self.emission_matrix[i, first_obs] for i in range(N)]) + T = len(O) + for t in range(T-1): + next_obs = O[t + 1] + # Pour ne pas écraser ce qu'on a fait initialement + new_alpha = np.zeros(N) + + for j in range(N): + # Somme de i=1 à N de ( alpha_t(i) * a_ij ) + # self.transition_matrix[i, j] = a_ij + right_term = np.sum([alpha[i] * self.transition_matrix[i, j] for i in range(N)]) + + # alpha_t+1(j) = b_j(o_t+1) * somme + # self.emission_matrix[j, next_obs] = b_j(o_t+1) + new_alpha[j] = self.emission_matrix[j, next_obs] * right_term + + alpha = new_alpha + + return float(np.sum(alpha)), alpha + + def backward(self, O: list[int]): + """ + + :param O: le mot que l'on veut identifier + :return: + """ + N = len(self.initial_probabilities) + beta = np.ones(N) + T = len(O) + # On remonte le temps de T-2 à 0 + for t in range(T - 2, -1, -1): + new_beta = np.zeros(N) + for i in range(N): + # beta_t(i) = somme de a_ij * b_j(o_t+1) * beta_t+1(j) + new_beta[i] = np.sum([self.transition_matrix[i, j] * self.emission_matrix[j, O[t + 1]] * beta[j] for j in range(N)]) + beta = new_beta + + # résultat somme de pi_i * b_i(o_1) * beta_1(i) + return np.sum([self.initial_probabilities[i] * self.emission_matrix[i, O[0]] * beta[i] for i in range(N)]), beta diff --git a/HMM/__pycache__/__init__.cpython-314.pyc b/HMM/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61d9c240eaee32d2c5eecbffdf597ec776df1e6b GIT binary patch literal 7402 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 P)TuJeC1!=t2W9fV0-V#s literal 0 HcmV?d00001 diff --git a/Matrice de transition/EN.pdf b/Matrice de transition/EN.pdf new file mode 100644 index 0000000000000000000000000000000000000000..14c20cbd28c6d91abf9e78f7db3e8de3c2d83fcd GIT binary patch literal 16603 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 P0m0G1baax+QW*aiWD#lw literal 0 HcmV?d00001 diff --git a/Matrice de transition/FR.pdf b/Matrice de transition/FR.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fe57ae8c79403370117df2cdabb6a17950b1e605 GIT binary patch literal 16139 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 NC>|S|qLvcg{{q;HQ9=L! literal 0 HcmV?d00001 diff --git a/data_preparation/__init__.py b/data_preparation/__init__.py new file mode 100644 index 0000000..4660383 --- /dev/null +++ b/data_preparation/__init__.py @@ -0,0 +1,89 @@ +""" +Ce module contient les fonctions pour préparer les données. + +Cela consiste à: +- Lire un fichier +- Nettoyer les données +- Tout transformer en dataframe d'index de l'alphabet. +""" +import re + + +def read_file(file_name: str) -> str: + """ + Lis le fichier sans rien touché. Retourne le texte brut + :param file_name: + :return: + """ + with open(file_name) as file: + return file.read() + + +def parse_data(raw_data: str) -> str: + """ + Cette fonction retire les caractères spéciaux et passe toutes les lettres + en minuscule + :param raw_data: + :return: + """ + lower_raw_data = raw_data.lower() + without_special_chars = re.sub(r'[^a-z]', ' ', lower_raw_data) + return without_special_chars + + +def prepare_file(file_name) -> str: + """ + Prépare le fichier en le lisant et en le parsant + :param file_name: + :return: + """ + raw_data = read_file(file_name) + return parse_data(raw_data) + + +def get_alphabet_index_of(letter: str) -> int: + """ + Retourne l'index dans l'alphabet d'une lettre en imaginant que + l'alphabet est un tableau. + + (ex: a -> 0) + :param letter: + :return: + """ + # l'alphabet et l'ensemble des états + return 'abcdefghijklmnopqrstuvwxyz'.find(letter) + + +def get_alphabet_index_form_word(word: str) -> list[int]: + """ + Retourne un mot sous forme d'ensemble d'index dans l'alphabet + :param word: + :return: + """ + return [get_alphabet_index_of(letter) for letter in word] + + +def get_text_in_alphabet_index_form(text: str) -> list[list[int]]: + """ + Prends un texte et le transforme un matrice contenant tout les mots sous forme de tableau d'entier. + Chaque entier correspond à l'index du caractère dans l'alphabet + :param text: + :return: + """ + words = text.split(' ') + numeric_text = [] + for word in words: + if word: # On ignore les espaces multiples + numeric_text.append(get_alphabet_index_form_word(word)) + return numeric_text + + +def prepare_data(file_name: str) -> list[list[int]]: + """ + Cette fonction lis le fichier, nettoie les données puis convertie tout en index alphabétique. + :param file_name: + :return: + """ + content = prepare_file(file_name) + return get_text_in_alphabet_index_form(content) + diff --git a/data_preparation/__pycache__/__init__.cpython-314.pyc b/data_preparation/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8aa9dc1e972334c818dce2933b633dd84ecbaf7 GIT binary patch literal 4307 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 float: + sum = prob_fr + prob_en + prob_it + return searched / sum diff --git a/utils/__pycache__/__init__.cpython-314.pyc b/utils/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9dcbfc3e8fcb401db546a4d2ffe2432e21fdb309 GIT binary patch literal 710 zcmYjPJ#Q2-5ViN?F4`nO6p0fb#R>${i3k#j0s%^MeH2#YBE$;g?E1KkcI}nzEs|;r zT6%r}4L!dA@dGFlDcY6>x@&JmaxF&wg@aH6UQ`eg=ns!T-U@l{s@V zyA7l!5wRqq0}?p{lHam4avzeRcf1*lL|CY_%0-wcX)_^hmEx=Q|nt8aLEF0$xq`0UFm-g~8Zkuux-NGmxlCo*fH@y7B{fV0d|>*C5+= zH2_kRvtaEsxcBwbY4E5Xoh`3_+5YX_(W{W#89Gg$u~a3X1y<>s2$<@QSbE)ks%^av WF_honigTAzdf_