Analyseur de mots
Posté le 28/08/2019 15:39
Bonjour a tous,
Aujourd'hui je n'avais pas prévu de rencontrer ce problème et maintenant qu'il est ici, il me gène vraiment.
Pour faire simple mon programme prends en entrée une liste de mots d'une langue (ici le francais), lis chaque mot et dans un tableau de 26*26 (26 lettres de l'alphabet verticalement et horizontalement) cases et inscrit les probabilités de chaque paire de lettres dedans.
Pour le moment j'ai réussit a lire le fichier .txt, a prendre chaque mot séparément et a les lire. Le programme fais des siennes venu le moment d'inscrire les probabilité dans le tableau. En effet il me remplit une colone alors qu'il doit ne mettre qu'une seule fois la valeur..
Pour plus de clarté voici le code actuel:
Code
Cliquer pour enrouler
import os
language_file = ""
base = "abcdefghijklmnopqrstuvwxyz"
#fonctions du programme
def table_init(size_x, size_y):
table = []
line = []
for i in range(size_x):
line.append(0)
for j in range(size_y):
table.append(line)
return table
def print_table(table):
for i in range(len(table)):
print(table[i])
#Boucle de secu saisie nom du fichier
while not os.path.exists(language_file):
language_file = input("Nom fichier dico:")
#ouvre /lis /decoupe le fichier
fichier = open(language_file, 'r')
fichier_lu = fichier.read()
fichier_lu_decoupe = fichier_lu.split('\n')
#cree le tableau
tableau = table_init(26, 26)
#boucle d'apprentisage
for i in range(len(fichier_lu_decoupe)):
word = fichier_lu_decoupe[i]
for j in range(len(word)-1):
if word[j] in base and word[j+1] in base:
lettre1 = base.index(word[j])
lettre2 = base.index(word[j+1])
tableau[lettre1][lettre2] += 1
else:
pass
print(fichier_lu_decoupe)
print(lettre1, ',', lettre2)
print_table(tableau)
Voici le rendu a l'écran:
Fichier joint
Citer : Posté le 28/08/2019 15:43 | #
Le problème réside dans le fait que dans table_init, quand tu fais table.append(line), tu ne fais pas une copie de line mais tu met littéralement une référence vers line. Le résultat est que modifier une ligne modifie toutes les lignes, puisque c'est la même.
Pour corriger ça, tu devrait remplacer table.append(line) par table.append(line[:]) pour faire une réelle copie, ou plus simplement table.append([0] * size_x) pour rendre le code plus simple.
Citer : Posté le 28/08/2019 15:44 | #
Merci monsieur le "Gourou"
-Planétarium 2
Citer : Posté le 28/08/2019 15:44 | #
C'est madame
Citer : Posté le 28/08/2019 15:45 | #
Tu n'as pas un tableau à deux dimensions, tu n'as qu'une seule ligne. Chaque entrée de table est en fait la même ligne.
table = []
line = []
for i in range(size_x):
line.append(0)
for j in range(size_y):
table.append(line[:])
return table
line[:] effectue une copie.
Sinon tu peux simplement écrire :
return [[0 for i in range(size_x)] for j in range(size_y)]
Edit : Pris un peu de court, je suppose qu'au moins j'aurai donné une version en compréhension.
Citer : Posté le 28/08/2019 16:01 | #
Pourquoi ne pas utiliser un objet Counter (de la bibliothèque collections) ?
counter = Counter()
filename = input("File> ")
try:
with open(filename) as file:
words = file.read().splitlines()
except FileNotFoundError:
print("File not found")
exit()
for word in words:
for pair in [word[i:i+2].lower() for i in range(len(word)-1)]:
counter[pair] += 1
print(counter)
Ajouté le 28/08/2019 à 16:13 :
J'ai un poil modifié le code pour afficher la matrice et non le compteur brut.
De plus tu peux demander à avoir les pourcentages au lieu des valeurs brutes
counter = Counter()
filename = "/usr/share/dict/french"
try:
with open(filename) as file:
words = file.read().splitlines()
except FileNotFoundError:
print("File not found")
exit()
for word in words:
for pair in [word[i:i+2].lower() for i in range(len(word)-1)]:
counter[pair] += 1
# Si tu veux les pourcentages au lieu des valeurs brutes
# total = sum(counter.values())
# for key in counter:
# counter[key] /= total
alphabet = "abcdefghijklmnopqrstuvwxyz"
for l1 in alphabet:
for l2 in alphabet:
print(counter[l1+l2], end=" ")
print()
Citer : Posté le 28/08/2019 16:20 | #
Wow, merci mais ce n'est pas de mon niveau python
La version de Julese50 fonctionne.
-Planétarium 2