Page 1 sur 1
connaitre les occurences dans un texte
Publié : sam. 09/févr./2013 15:21
par blendman
salut
voici un petit code pour connaitre les occurrences de chaque mots dans un texte (c'est utile pour ce ux qui écrivent, pour voir les répétitions par exemple) :
Code : Tout sélectionner
; trouver les occurrences d'un même mot dans un texte
; fidn the occurences of a word in a text
texte$ = "salut, comment puis-je vous aider ? Je me demande si je peux vous aider, vous, et moi je vais bien, je suis heureux. "+
"Et les calamars et les ours dans tout ça ? Je ne sais pas "
Dim word.s(0)
texte$=LCase(texte$)
For i = 1 To Len(texte$)
character$ = Mid(texte$,i,1)
If character$ <> " "
word$ + character$
Else
For j = 0 To countwords
If word$ = word(j)
Find =1
Break
EndIf
Next j
If Find = 0
If word$ <> "!" And word$ <> "?"
countwords+1
ReDim word(countwords)
word(countwords) = word$
Debug word$ +"("+CountString(texte$, word$) +")"
EndIf
EndIf
word$ = ""
Find = 0
EndIf
Next i
N'hésitez pas si vous avez un code plus rapide ou mieux

Re: connaitre les occurences dans un texte
Publié : sam. 09/févr./2013 17:32
par PAPIPP
Bonjour Blendman
Je n'ai pas vérifié si ce code et plus ou moins rapide ou que le tien
Il est basé sur les expressions régulières et sur le tri de tableau
Code : Tout sélectionner
texte$="salut, comment puis-je vous aider ? Je me demande si je peux vous aider, vous, et moi je vais bien, je suis heureux. Et les calamars dans tout ça ? Je ne sais pas "
Dim Resultat$(0)
; Resultat = CreateRegularExpression(0, "[-\w\d$!?+%@=]+")
If CreateRegularExpression(0, "[-\w\d$!+%@=]+")
Nb = ExtractRegularExpression(0, texte$, Resultat$())
SortArray(resultat$(), #PB_Sort_Ascending)
NBx=1
For k = 0 To Nb-1
If k<Nb-1
If resultat$(k+1)=resultat$(k)
nbx+1
Else
Debug Resultat$(k)+" "+Str(nbx)
NBx=1
EndIf
Else
Debug Resultat$(k)+" "+Str(nbx)
EndIf
Next
EndIf
A+
Re: connaitre les occurences dans un texte
Publié : dim. 10/févr./2013 10:15
par blendman
salut
Merci Papip pour ton code, mais j'ai l'impression qu'il beugue sur cette phrase, car j'ai les mots suivants qui sont comptés :
d 2, l 2, m 2, p1, r2, tre 1
la phrase :
Code : Tout sélectionner
texte$="Il lui était difficile, pénible même, de se prononcer sans avoir fait le tour de la question. "+
"La réalité dans laquelle il venait d'être projeté ne lui était pas familière. "+
"De même que le monde qui l'entourait sortait de l'ordinaire les personnes qu'il croisait et les réactions qu'ils affichaient "+
"dénotaient de ce qui composait son quotidien habituellement."
Dim Occurrence$(0)
; Resultat = CreateRegularExpression(0, "[-\w\d$!?+%@=]+")
texte$=LCase(texte$)
If CreateRegularExpression(0, "[-\w\d$!+%@=]+")
Nb = ExtractRegularExpression(0, texte$, Occurrence$())
SortArray(Occurrence$(), #PB_Sort_Ascending)
NBx=1
For k = 0 To Nb-1
If k<Nb-1
If Occurrence$(k+1)=Occurrence$(k)
nbx+1
Else
Debug Occurrence$(k)+" "+Str(nbx)
NBx=1
EndIf
Else
Debug Occurrence$(k)+" "+Str(nbx)
EndIf
Next
EndIf
une idée du problème ?
Re: connaitre les occurences dans un texte
Publié : dim. 10/févr./2013 10:46
par PAPIPP
Bonjour Blendman
Oui il faut ajouté toutes les lettres accentuées éèêàùë etc.. pour le français
pour l'allemand il faudrait ajouter les lettres propres à l'allemand etc..
exemple :
; texte$="salut, comment puis-je vous aider ? Je me demande si je peux vous aider, vous, et moi je vais bien, je suis heureux. Et les calamars dans tout ça ? Je ne sais pas "
texte$="Il lui était difficile, pénible même, de se prononcer sans avoir fait le tour de la question. "+
"La réalité dans laquelle il venait d'être projeté ne lui était pas familière. "+
"De même que le monde qui l'entourait sortait de l'ordinaire les personnes qu'il croisait et les réactions qu'ils affichaient "+
"dénotaient de ce qui composait son quotidien habituellement."
Dim Resultat$(0)
; Resultat = CreateRegularExpression(0, "[-\w\d$!?+%@=]+")
If CreateRegularExpression(0, "[-\w\d$!+%@=éèêàùë]+")
Nb = ExtractRegularExpression(0, texte$, Resultat$())
; For k = 0 To Nb-1
; Debug Resultat$(k)
; Next
Debug "******************************************************"
SortArray(resultat$(), #PB_Sort_Ascending)
NBx=1
For k = 0 To Nb-1
If k<Nb-1
If resultat$(k+1)=resultat$(k)
nbx+1
Else
Debug Resultat$(k)+" "+Str(nbx)
NBx=1
EndIf
Else
Debug Resultat$(k)+" "+Str(nbx)
EndIf
Next
EndIf
A+
Re: connaitre les occurences dans un texte
Publié : dim. 10/févr./2013 11:06
par Ar-S
Sympa ce code. Papipp, n'oublie pas de laisser la gestion de la casse si nécessaire, sinon tel quel il compte " il = x et Il = x ". Pour un comptage de mot c'est ballot.
Re: connaitre les occurences dans un texte
Publié : dim. 10/févr./2013 11:24
par blendman
Merci Papipp pour la correction et l'information.
Je n'ai jamais utilisé les regular expressions, mais ça a l'air très sympa ^^.
Pour le tri,je vais essayer d'ajouter le tri descendant en fonction du nombre de répétitions trouvées et je posterai le résultat.
JE l'ai ajouté à mon petit éditeur de texte et c'est bien utile pour trouver les répétitions dans un texte (avec quelques options, comme les mots ignorés ou la taille minimum d'un mot recherché, etc..)
Re: connaitre les occurences dans un texte
Publié : dim. 10/févr./2013 12:59
par comtois
une autre variante, le tri se fait en même temps que le comptage
http://purebasic.developpez.com/sources ... brebinaire
Code : Tout sélectionner
Structure Noeud
mot.s
compteur.l
*Gauche.Noeud
*Droit.Noeud
EndStructure
Procedure.s Affiche(*Noeud.Noeud, minimum.l)
Protected resultat.s
If *Noeud
resultat + Affiche(*Noeud\Gauche, minimum)
If *Noeud\compteur >= minimum
resultat + RSet(Str(*Noeud\compteur), 4, "0") + " : " + *Noeud\mot + #CRLF$
EndIf
resultat + Affiche(*Noeud\Droit, minimum)
EndIf
ProcedureReturn resultat
EndProcedure
Procedure.l Arbre(*Noeud.Noeud, mot.s)
If *Noeud
If mot = *Noeud\mot
*Noeud\compteur + 1
ElseIf mot < *Noeud\mot
*Noeud\Gauche = Arbre(*Noeud\Gauche, mot)
Else
*Noeud\Droit = Arbre(*Noeud\Droit, mot)
EndIf
Else
*Noeud = AllocateMemory(SizeOf(Noeud))
If *Noeud
*Noeud\mot = mot
*Noeud\compteur = 1
EndIf
EndIf
ProcedureReturn *Noeud
EndProcedure
Procedure.l Analyse(texte.s, minimum.l)
Protected *arbre, mot.s, nbcar.l, *txt.Character = @texte
While *txt\c
Select *txt\c
Case ' ', '.', ',', ';', ' ', '(', ')', #TAB, #CR, #LF
If nbcar >= minimum
*arbre = Arbre(*arbre, mot)
EndIf
mot = ""
nbcar = 0
Default
mot + Chr(*txt\c)
nbcar + 1
EndSelect
*txt + SizeOf(Character)
Wend
ProcedureReturn *arbre
EndProcedure
Procedure.s Texte(fichier.s)
Protected texte.s
texte="Il lui était difficile, pénible même, de se prononcer sans avoir fait le tour de la question. "+
"La réalité dans laquelle il venait d'être projeté ne lui était pas familière. "+
"De même que le monde qui l'entourait sortait de l'ordinaire les personnes qu'il croisait et les réactions qu'ils affichaient "+
"dénotaient de ce qui composait son quotidien habituellement."
ProcedureReturn texte
EndProcedure
;- affiche les mots de 2 caractères minimum, présents au minimum 1 fois dans le texte.
MessageRequester("Résultat", Affiche(Analyse(Texte(#PB_Compiler_Home+"Compilers/APIFunctionListing.txt"), 2), 1))
Re: connaitre les occurences dans un texte
Publié : dim. 10/févr./2013 14:22
par PAPIPP
Bonjour comtois
Merci comtois pour cet algo utilisant une méthode arborescente.
on peut aussi utiliser une Map en contrôlant les collisions.
Pour revenir aux remarques de Ar-s et de Blendman
Voici un prg qui tient compte des caractères de la langue française. Je ne pense pas avoir oublié un caractère spécial de la langue française.
Il tient aussi compte de la casse (Maj_Min)
Code : Tout sélectionner
; texte$="salut, comment puis-je vous aider ? Je me demande si je peux vous aider, vous, et moi je vais bien, je suis heureux. Et les calamars dans tout ça ? Je ne sais pas "
texte$="Il lui était difficile, pénible même, de se prononcer sans avoir fait le tour de la question. "+
"La réalité dans laquelle il venait d'être projeté ne lui était pas familière. "+
"De même que le monde qui l'entourait sortait de l'ordinaire les personnes qu'il croisait et les réactions qu'ils affichaient "+
"dénotaient de ce qui composait son quotidien habituellement ."
Debug texte$
Dim Resultat$(0)
; Resultat = CreateRegularExpression(0, "[-\w\d$!?+%@=]+")
ALPHA_FR$+"[-\wÀàÂâÆæÇçÉéÈèÊêËëÎîÏïÔôÙùÛûÜüÿ"+Chr(156)+Chr(230)+Chr(159)+"]+"
; If CreateRegularExpression(0, "[-\w\d$!+%@=éèêàùë]+")
If CreateRegularExpression(0, ALPHA_FR$)
Nb = ExtractRegularExpression(0, texte$, Resultat$())
SortArray(resultat$(), #PB_Sort_Ascending|#PB_Sort_NoCase ) ;pour ne pas différencier la casse (MAj_Min)
NBx=1
For k = 0 To Nb-1
If k<Nb-1
If LCase(resultat$(k+1))=LCase(resultat$(k)); pour ne pas différencier la casse (MAj_Min)
nbx+1
Else
Debug Resultat$(k)+" "+Str(nbx)
NBx=1
EndIf
Else
Debug Resultat$(k)+" "+Str(nbx)
EndIf
Next
EndIf
A+
Re: connaitre les occurences dans un texte
Publié : lun. 11/févr./2013 8:38
par PAPIPP
Bonjour à tous
On peut aussi utiliser une logique complémentaire
Plutôt que de définir les composants d’un mot
on peut définir tout les éléments qui séparent lest mots (ponctuation parenthèses etc ..)
voici une exemple. J’ai placé dans le texte à analyser des () {} [] !?:
Code : Tout sélectionner
texte$="Il lui était difficile, pénible même, de se prononcer sans avoir fait le tour de la question. "+
"La réalité dans laquelle il venait d'être {projeté ne }lui était [pas familière.] "+
"De même ! que le monde qui! l'entourait (sortait) : de l'ordinaire les ? (personnes qu'il) croisait et les réactions qu'ils affichaient "+
"dénotaient de ce qui composait son quotidien habituellement ."
Debug texte$
Dim Resultat$(0)
If CreateRegularExpression(0, "[^(){};, !:'\.\?\[\]]+")
Nb = ExtractRegularExpression(0, texte$, Resultat$())
SortArray(resultat$(), #PB_Sort_Ascending|#PB_Sort_NoCase ) ;pour ne pas différencier la casse (MAj_Min)
Debug NB
NBx=1
For k = 0 To Nb-1
If k<Nb-1
If LCase(resultat$(k+1))=LCase(resultat$(k))
nbx+1
Else
Debug Resultat$(k)+" "+Str(nbx)
NBx=1
EndIf
Else
Debug Resultat$(k)+" "+Str(nbx)
EndIf
Next
EndIf