Problème pour calculer le nombre d'occurences d'un mot dans une phrase

Résolu
cirtey Messages postés 30 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 8 mai 2009 - 7 mai 2007 à 13:49
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 - 7 mai 2007 à 19:54
Bonjour;
Je cherche à créer un petit programme sous vb6 pour calculer le nombre d'occurences d'un mot dans une phrase.
Lorsque je tente d'exécuter mon programme, j'ai le message suivant:
"Erreur de compilation, qualificateur incorrect."
L'objet phrase dans la boucle for est alors pointé par le débogeur (phrase.length).
Pouvez-vous m'aider à déterminer la source d'erreur? Merci d'avance.

Voici le code:

Private Sub cmdRechercher_Click()

Dim motrecherche As String
Dim phraseorigine As String
Dim phrase() As String
Dim nbrmotrecherche As Integer
Dim i As Integer

motrecherche = txtRecherche.Text
phraseorigine = lblTexte.Caption
phrase() = Split(phraseorigine)
nbrmotrecherche = 0

If motrecherche <> "" Then
  For i = 0 To phrase.length - 1
      If phrase(i) = motrecherche Then
          nbrmotrecherche = nbrmotrecherche + 1
      End If
  Next i
 
  txtOccurence = CStr(nbrmotrecherche)
 
Else
    MsgBox "La chaîne ne peut être vide.", vbInformation, "Comptage des mots."
   
End If

End Sub

4 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
7 mai 2007 à 14:12
phrase étant ici un tableau, il ne faut pas faire phrase.length pour en obtenir l'index maximum mais plutot UBound(phrase)

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
7 mai 2007 à 19:54
Ouh là, là tu vas sérieusement compliquer les choses. Il ne s'agit plus seulement d'un simple découpage de mots. Ca devient un véritable analyser syntaxique.

La fonction Split tel que tu l'utilise actuellement ne te permet pas de découper une phrase en mots tel qu'on les définis dans la langue française, elle te découpe la chaine de caractère en entités en utilisant le caractère espace comme séparateur. Alors si la plupart du temps ces entités correspondent aux mots de la langue française, ce n'est plus le cas dans certains cas, comme la présence d'apostrophe, de signe de ponctuation, ....
Ex : Si tu découpe la phrase "Le mouton, la chêvre et l'éléphant ...." et que tu recherche le mot "mouton", il ne sera pas trouvé car losrque tu fait If phrase(i) = motrecherche Then avec phrase(i)="mouton , " et motrecherche = "mouton", phrase(i)<>motrecherche.

Il te faudrait découper la phrase selon plusieurs critères, espace, virgule, point, apostrophe, ....
Tu peux regarde les sources, je crois que quelqu'un à fait un équivalent de Split mais multicritères.

Quant aux autres problèmes, oui InStr peut t'aider, mais pas completement. Si tu recherche "effraie" dans la chaine "m'effraie." alors oui InStr la trouvera, de même si tu recherche "silence" dans "silences", par contre si tu recherche "silences" dans "silence" alors là non elle ne la trouvera pas.

Je pense que tu vois maintenant le vaste travail qu'il y a à faire pour ce que tu demande, surtout qu'il faudrait que tu tienne compte des subtilités de la langue française. ex pour la recherche de singulier/puriel avec des mots comme cheval/chevaux ou autre scénario/scénarii, ....

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
3
cirtey Messages postés 30 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 8 mai 2009
7 mai 2007 à 15:27
Salut;
j'ai retouché un peu le code, cela marche. Mais maintenant je souhaite que des mots rentrent dans l'occurence même s'ils ne sont pas à la forme correcte  (pluriel / singulier, '  ou pas).
La phrase "Le silence de ces espaces infinis m'effraie." est en caption du label (lblTexte.Caption).
Ex:
Lorsque je demande effraie j'ai 0. Hors je souhaite avoir 1
Lorsque je fais silences j'ai 0. Hors je souhaite avoir 1

Je pense que la fonction inStr peut résoudre le problème. Je vais tester.

Private Sub cmdRechercher_Click()

Dim motrecherche As String
Dim phraseorigine As String
Dim phrase() As String
Dim nbrmotrecherche As Integer
Dim i As Integer

motrecherche = txtRecherche.Text
phraseorigine = lblTexte.Caption ' "Le silence de ces espaces infinis m'effraie."
phrase() = Split(phraseorigine)
nbrmotrecherche = 0

If motrecherche <> "" Then
  For i = 0 To (UBound(phrase))
      If phrase(i) = motrecherche Then
          nbrmotrecherche = nbrmotrecherche + 1
      End If
  Next i
  
  txtOccurence = CStr(nbrmotrecherche)
  
Else
    MsgBox "La chaîne ne peut être vide.", vbInformation, "Comptage des mots."
    
End If

End Sub

0
cirtey Messages postés 30 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 8 mai 2009
7 mai 2007 à 17:45
Merci Casy pour la remarque sur le ubound :)
0
Rejoignez-nous