Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Analyseur de mots
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

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


Julese50 Hors ligne Gourou Points: 315 Défis: 16 Message

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.
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 28/08/2019 15:44 | #


Merci monsieur le "Gourou"
Julese50 Hors ligne Gourou Points: 315 Défis: 16 Message

Citer : Posté le 28/08/2019 15:44 | #


C'est madame
Lephenixnoir Hors ligne Administrateur Points: 24575 Défis: 170 Message

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.

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

line[:] effectue une copie.

Sinon tu peux simplement écrire :

def table_init(size_x, size_y) :
    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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Dark storm En ligne Labélisateur Points: 11641 Défis: 176 Message

Citer : Posté le 28/08/2019 16:01 | #


Pourquoi ne pas utiliser un objet Counter (de la bibliothèque collections) ?

from collections import Counter

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

from collections import Counter

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()

Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 28/08/2019 16:20 | #


Wow, merci mais ce n'est pas de mon niveau python
La version de Julese50 fonctionne.

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 200 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd