IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

liste et comparaison


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut liste et comparaison
    bonjour tous le monde

    voici mon problème, j'ai un vecteur qui contient une chaîne de caractères (un mot par case) que j'appel tablo, et un autre tableau qui contient plusieurs lignes (enfaîte ces une règles de grammaire par ligne) que j'appel tab2.
    Je voudrai pouvoir comparer chaque case du vecteur avec chaque première case de chaque ligne de mon tableau de règles si cela correspond continuer le comparaison avec le reste de la règles jusqu’à la fin de la ligne puis afficher la chaîne de caractères qui correspond a la règle de grammaires dans un autre tableau que j'appel tabli.

    je sais pas si c'est clair mais voici le code que j'ai fais mais il ne marche pas.
    aider moi a trouver le soucis

    merci d'avance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Form7_Load(byVal sender As System.Object, byVal e As System.EventArgs) Handles MyBase.Load
            i = 0
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim tablo As New List(Of String)
        Dim tabli As New List(Of String)
        Dim tab2 As New List(Of String)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    Private Sub Button5_Click(byVal sender As System.Object, byVal e As System.EventArgs) Handles Button5.Click
     
            Dim fichier As StreamReader = New StreamReader("C:\Users\samia\Desktop\Regles.txt", Encoding.UTF8)
            Dim cont1 As String = fichier.ReadLine
    Dim j As Integer = 0
            Dim x As Integer
    While Not (cont1 Is Nothing)
                Dim tab() As String = cont1.Split(" ")
     
                For v = 0 To UBound(tab)
                    tab2.Add(tab(v))
                Next
     
                Dim k As Integer = i
                Dim l As Integer = j
                Dim bool As Boolean = compare(tablo(k), tab2(l))
     
    For x = 1 To tab2.Count AndAlso bool = True
                    tabli.AdD(tablo(k ))
                    k = k + 1
                    l = l + 1
                    bool = compare(tablo(k ), tab2(l))
                Next
     
    Dim tb() As String = tabli.ToArray
                For g = 0 To UBound(tb)
                    RichTextBox3.AppendText(tb(g))
                Next
                cont1 = fichier.ReadLine
            End While
     
            i = i + 1
     
            fichier.Close()
     
        End Sub

  2. #2
    Membre actif Avatar de 2h15Crew
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 79
    Par défaut
    Tu devrais mettre des noms plus explicites pour tes variables et tableaux, c'est pas facile de s'y retrouver là...

  3. #3
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut comparaisons et listes de chaines
    bonjour maya 22
    si j'ai bien compris le traitement que tu veux faire , voici avec les corrections des noms de variables plus explicites comme l'as dit crew (sans quoi toi meme tu ne pourras comprendre ton code dans une semaine).

    est ce bien ca le traitement ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    ' Liste  tablo chaîne de caractères (un mot par case), 
    ' Liste  tab2  plusieurs lignes ( une règle de grammaire par ligne) . 
    ' comparer chaque case du vecteur tablo avec chaque première case de chaque ligne regles grammaires
    ' si  correspondance trouvee  continuer le comparaison avec le reste de la  
    ' règle 'jusqu 'à fin  ligne 
    ' Afficher les mots (Chaîne) de caractères qui correspond à règle de
     ' grammaires dans Liste tabli. 
    ' Nota Bene1 :Les variables listes ont ete renommees pour plus de clarte
    ' Nota Bene2 :La variable liste regleGrammaires doit etre RAZ pour a chaque
    ' lecture de ligne pour eviter des tests de comparaisons inutiles.
    ' Si tu veux garder le resultat des analyses de plusieurs lignes,
    ' il faut avoir une 2eme liste identique pour cumuler.
     
    Imports System.IO
    Imports System.Text
     
    Public Class Form3
        Dim motCles As New List(Of String)   'Tablo
        Dim regleGrammaires As New List(Of String)  'Tab2
        Dim MotCleRegleResultat As New List(Of String)   'Tabli
        Dim cheminApp As String = Directory.GetCurrentDirectory & "\"
        Private Sub Form3_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            btnAnalyseRegles.Enabled = False
        End Sub
     
        Private Sub btnAnalyseRegles_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnalyseRegles.Click
            'Dim fichier As StreamReader = New StreamReader("C:\Users\samia\Desktop\Regles.txt", Encoding.UTF8)
            Dim fichier As StreamReader = New StreamReader(cheminApp & "Regles.txt", Encoding.UTF8)
            Dim ligneLue As String = fichier.ReadLine
            'memorise le numero de ligne lue pour affichage
            Dim numLigneLue As Integer = 1
     
            'traite chaque ligne lue
            While ligneLue IsNot Nothing
                Dim strTable() As String = ligneLue.Split(" ")
                'Affiche ligne lue
                RtfBoxAfficheLigneLue.AppendText(ligneLue)
                RtfBoxAfficheLigneLue.AppendText(vbCrLf)
     
                'Ajoute à  regleGrammaires
                For I As Integer = 0 To UBound(strTable)
                    regleGrammaires.Add(strTable(I))
                Next
     
                'Tester occurence en position zero de la ligne 
                Dim OccurenceTrouve As Boolean = False
                For I As Integer = 0 To motCles.Count - 1
                    If regleGrammaires.Contains(motCles(I)) Then
                        'premiere occurence en position zero
                        If regleGrammaires.IndexOf(motCles(I)) = 0 Then
                            'Affiche intitule ligne en cours
                            RtfBoxAnalyse.AppendText("Ligne N° :" & numLigneLue.ToString & vbCrLf)
                            'met flag à true
                            OccurenceTrouve = True
                        End If
                    End If
                Next
     
                'Si  flag à true( occurence pos zero trouvee)
                'chercher chaque mot regleGrammaires si dans motCles
                If OccurenceTrouve Then
                    For I As Integer = 0 To regleGrammaires.Count - 1
                        For J As Integer = 0 To motCles.Count - 1
                            If regleGrammaires(I) = motCles(J) Then
                                'ajoute à MotCleRegleResultat
                                MotCleRegleResultat.Add(regleGrammaires(I))
                                'ajoute à RtfBoxAnalyse
                                RtfBoxAnalyse.AppendText(regleGrammaires(I))
                            End If
                        Next 'mot cle suvant
                    Next 'mot ligne suvant
                End If
     
                ligneLue = fichier.ReadLine
                numLigneLue = numLigneLue + 1
                'RAZ liste regleGrammaires
                regleGrammaires.Clear()
                RtfBoxAnalyse.AppendText(vbCrLf)
            End While
     
            fichier.Close()
     
        End Sub
     
        Private Sub btnLoadMotCle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoadMotCle.Click
            Dim fichier As StreamReader = New StreamReader(cheminApp & "MotCles.txt", Encoding.UTF8)
            Dim ligneLue As String = fichier.ReadLine
            While Not (ligneLue Is Nothing)
                Dim strTable() As String = ligneLue.Split(" ")
                For I As Integer = 0 To UBound(strTable)
                    motCles.Add(strTable(I))
                Next
                ligneLue = fichier.ReadLine
            End While
            fichier.Close()
            For Each elemStr As String In motCles
                RtfBoxMotCles.AppendText(elemStr & vbCrLf)
            Next
            btnAnalyseRegles.Enabled = True
        End Sub
     
     
     
     
    End Class
    PJ: 2 fichiers textes Regles.txt et MotCles.txt

    Bon code.....

  4. #4
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut
    Bonjour
    Merci beaucoup MABROUKI pour votre réponse, mais ce n'est pas le traitement que je veux effectuer; je vous explique cela:

    disons que j'ai mon exemple:

    le/PREP ciel/NOUN est/VERB bleu/ADJ ,/PUNC il/PREP fait/VERB beau/ADJ

    et mes règles

    PUNC ABBREV ABBREV PUNC
    PUNC ABBREV PUNC
    PUNC ABBREV ABBREV ABBREV PUNC
    PUNC NUM PUNC
    PUNC DET+NOUN_PROP PUNC
    NOUN_PROP ADJ
    PREP NOUN VERB ADJ PUNC PREP VERB ADJ

    je prend le/PREP je compare PREP (donc ce qu'il y a après le /) avec la première règle (je commence avec le premier élément c-à-d PUNC) si ça concorde je continue à comparer élément par élément sinon je saute a la règle suivante, dans mon cas la dernière règle est bonne, donc j'arrive a comparer jusqu'à la fin de la règle, puis j'enregistre ma chaîne dans un tableau.

    merci énormément pour votre aide.

  5. #5
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut expression et liste
    Bonjour maya22
    Suite à ton 2eme envoi,il s'agit donc d'analyser le flux d'entree ,de recuperer les "lexemes" de ta grammaire et de faire le "matching" avec chaquer regle de grammaire donnee.
    on a un flux d'entree(une phrase):
    - le/PREP ciel/NOUN est/VERB bleu/ADJ ,/PUNC il/PREP fait/VERB beau/ADJ
    on recupere un flux de sortie apres analyse lexcale:
    - PREPNOUNVERBADJPUNCPREPVERBADJ .
    ce flux est compare ensuite à chacune des regles.
    La regle qui coincide (et les autres regles) est elle-meme reduite à une forme "canonique" expurgee des separateurs blancs comme ceci:
    PREPNOUNVERBADJPUNCPREPVERBADJ

    Ensuite un test "match string" est fait entre la phrase "canonique" entree et la regle "canonique".Si test positif la phrase "matche" sinon phrase malformee.

    la reduction "canonique" est faite par une petite analyse lexicale.
    Pour la conformite des phrases aux regles le "matching" est fait avec une "expression lambda" de vb.net .
    2 petits classes ont ete rajoutees RegleGram(regle de grammaire) et Phrase(phrase en "forme" canonique apres analyse lexicale).
    le code.....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
     
    mports System.IO
    Imports System.Text
    'cet imports est necessaire.Faire une reference à System.Linq 
    Imports System.Linq.Expressions
     
    Public Class frmNouveau
        'Cree un expression lamba pour analyse syntaxique
        Private regleExpress As Expression(Of Func(Of RegleGram, Boolean))
        '1 liste pour les regles
        Private Regles As New List(Of RegleGram) 'liste des regles lues
        '2 listes pour les phrases
        Private lignesPhrase As New List(Of String()) 'liste des phrases lues
        Private phrases As New List(Of Phrase) 'liste des phrases "expression" apres analyse lexicale
     
        Private phraseRegleResultat As New List(Of String) 'Tabli
        Private cheminApp As String = Directory.GetCurrentDirectory & "\"
        Private Sub Form3_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            btnAnalyseRegles.Enabled = False
        End Sub
     
        Private Sub btnAnalyseRegles_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnalyseRegles.Click
            'Dim fichier As StreamReader = New StreamReader("C:\Users\samia\Desktop\Regles.txt", Encoding.UTF8)
            Dim fichier As StreamReader = New StreamReader(cheminApp & "ReglesBis.txt", Encoding.UTF8)
            Dim ligneLue As String = fichier.ReadLine
     
            'Objet regle grammaire
            Dim objRegle As RegleGram
     
            'lecture de toutes les lignes(traite chaque ligne lue et remplit liste regles)
            RtfBoxRegles.WordWrap = False
            RtfBoxRegles.ScrollBars = RichTextBoxScrollBars.ForcedBoth
            RtfBoxRegles.AppendText(vbCrLf & "Regles Lues  :" & vbCrLf & vbCrLf)
     
            While ligneLue IsNot Nothing
                Dim strTable() As String = ligneLue.Split(" ")
                'Affiche ligne lue
                RtfBoxRegles.AppendText(ligneLue)
                RtfBoxRegles.AppendText(vbCrLf)
     
                'Ajoute aux lexemes de la nouvelle regle  
                objRegle = New RegleGram
                For I As Integer = 0 To UBound(strTable)
                    objRegle.strRegle = objRegle.strRegle & strTable(I)
                Next
                'Ajoute à  liste  regles
                Regles.Add(objRegle)
                ligneLue = fichier.ReadLine
            End While
            'Ferme fichier
            fichier.Close()
     
            'Affiche les regles dans Classe RegGram
            RtfBoxRegles.AppendText(vbCrLf & "Regles dans Classe RegGram  :" & vbCrLf & vbCrLf)
            For I As Integer = 0 To Regles.Count - 1
                RtfBoxRegles.AppendText(Regles(I).strRegle)
                RtfBoxRegles.AppendText(vbCrLf)
            Next
     
     
            RtfBoxAnalyse.WordWrap = False
            RtfBoxAnalyse.ScrollBars = RichTextBoxScrollBars.ForcedBoth
            'Analyse Syntaxique de  chaque phrase
     
            For Each objPhrase In phrases
                'wrappe la phrase dans un objet grammaire de test
                Dim objTest As RegleGram = New RegleGram
                objTest.strRegle = objPhrase.strPhrase
     
                For Each objRegle In Regles
                    'Cree une expression lamba(phrase est une variable lambda ou "whatever you want")
                    regleExpress = Function(phrase) phrase.strRegle = objRegle.strRegle
     
                    'Compile la regle, wrappe dans un  delegate predicat
                    Dim predicat As Func(Of RegleGram, Boolean) = regleExpress.Compile()
     
                    'verifie phrase et renvoie un boolean
                    Dim isMatch As Boolean = predicat(objTest)
     
                    If isMatch Then  'phrase est conforme à une  des regles
                        'Ajoute à phraseRegleResultat
                        phraseRegleResultat.Add(objPhrase.strPhrase)
                        'Affiche  dans RtfBoxAnalyse
                        RtfBoxAnalyse.AppendText("Numero Phrase : " & phrases.IndexOf(objPhrase) + 1 & vbCrLf)
                        RtfBoxAnalyse.AppendText(objPhrase.strPhrase)
                        RtfBoxAnalyse.AppendText(vbCrLf)
                    End If
                Next
            Next
        End Sub
        'Charge le fichier phrase ,cree liste phrases 
        'Appelle Analyse Lexicale
        Private Sub btnLoadPhrase_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoadPhrase.Click
            Dim fichier As StreamReader = New StreamReader(cheminApp & "Phrases.txt", Encoding.UTF8)
            Dim ligneLue As String = fichier.ReadLine
            While Not (ligneLue Is Nothing)
                'On splitte les espaces
                Dim strTable() As String = ligneLue.Split(" ")
                'ajoute à lignePhrases
                lignesPhrase.Add(strTable)
                ligneLue = fichier.ReadLine
            End While
            fichier.Close()
            '
            'Affiche lignes lues
            RtfBoxPhrase.WordWrap = False
            RtfBoxPhrase.ScrollBars = RichTextBoxScrollBars.ForcedBoth
            RtfBoxPhrase.AppendText(vbCrLf & "Phrases avant Analyse Lexicale :" & vbCrLf)
            For Each tabStr As String() In lignesPhrase
                For I As Integer = 0 To tabStr.Count - 1
                    RtfBoxPhrase.AppendText(tabStr(I))
                Next
                RtfBoxPhrase.AppendText(vbCrLf)
            Next
            '
            'Appelle Analyse Lexicale
            Call AnaLexicale()
            '
            'Active btnAnalyseRegles
            btnAnalyseRegles.Enabled = True
     
        End Sub
        '
        'Analyse lexicale => reduction de la phrase à la forme canonique
        'fait appel à verifieSep & extractLexeme
        '
        Private Sub AnaLexicale()
            Dim objPhrase As Phrase
            For Each tabStr As String() In lignesPhrase
                objPhrase = New Phrase
                For I As Integer = 0 To tabStr.Count - 1
                    If verifieSep(tabStr(I)) > 1 Then ' lexeme valide il est extrait de la ligne
                        objPhrase.strPhrase = objPhrase.strPhrase & extractLexeme(tabStr(I))
                    End If
                Next
                'si la phrase contient des lexemes ajout
                If objPhrase.strPhrase <> "" Then
                    phrases.Add(objPhrase)
                End If
            Next
            '
            'Affiche phrases sous forme "canonique"
            RtfBoxPhrase.AppendText(vbCrLf & "Phrases apres Analyse Lexicale :" & vbCrLf)
            For Each elemPhrase As Phrase In phrases
                RtfBoxPhrase.AppendText(elemPhrase.strPhrase)
                RtfBoxPhrase.AppendText(vbCrLf)
            Next
        End Sub
        '
        'Verifie position du separateur "/" 
        'Position =0 -inexistant ou position =1 -mauvaise position => lexeme invalide 
        'Position >1      => valide
        '
        Private Function verifieSep(ByVal x_lexeme As String) As Integer
            Return Strings.InStr(1, x_lexeme, "/", CompareMethod.Text)
     
        End Function
        '
        'Extrait un lexeme verifie 
        '
        Private Function extractLexeme(ByVal objLexeme As String) As String
            Dim posSeparateur As Integer = Strings.InStr(1, objLexeme, "/", CompareMethod.Text)
            Dim strLexemeValide As String = Strings.Right(objLexeme, Len(objLexeme) - posSeparateur)
            Return strLexemeValide
        End Function
     
    End Class
    '    
    'Classe RegleGrammaire
    '    
    Public Class RegleGram
        'un lexeme de RegleGram
        Public strRegle As String
        Public Sub New()
            strRegle = ""
        End Sub
    End Class
    '    
    'Classe Phrase
    '    
    Public Class Phrase
        'un lexeme de Phrase
        Public strPhrase As String
        Public Sub New()
            strPhrase = ""
        End Sub
    End Class

    bon code....

  6. #6
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut expression et liste
    rebonjour
    ci-joint un fichier de test de la phrase exemple que j'ai entree avec des erreurs expres...pour faire le test.
    bon code....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. récupérer la valeur d'une liste déroulante + comparaison de dates
    Par jackseed dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 27/06/2007, 16h29
  2. Comparaison de liste
    Par Bourdet dans le forum Langage
    Réponses: 2
    Dernier message: 13/10/2006, 09h50
  3. comparaison de listes chainee
    Par smalto dans le forum C
    Réponses: 5
    Dernier message: 22/09/2006, 18h10
  4. [List][Map?] Comparaison de Lists
    Par yolepro dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 25/08/2006, 17h39
  5. Comparaison d'une liste de string à un string
    Par maxazac dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/10/2005, 15h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo