Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[HELP] Ai besoin d'un compteur de mots vraiment "précis"...

8 réponses
Avatar
Pierre
Bonjour,

(Précision : je m'y connais peu en javascript)

J'ai besoin pour mon site d'un script permettant de compter les mots. J'en
ai même trouvé plusieurs mais ils ont tous (pour moi !) leurs
inconvénients :

Le premier est mon préféré, car il affiche le nombre de mots au fur et à
mesure que le visiteur tape ses mots dans un champ de saisie.
Cependant il souffre d'un défaut qui peut sembler mineur (mais que je dois
dans le cas spécifique de mon site absolument éviter), il donne un nombre
de mots différent de celui donné par la fonction statistique de Word et
Open Office : par exemple, pour un texte de 890 mots d'après ces 2
traitements de texte, le script en trouve 948...
Je ne sais pas à quoi tient cette différence, en tout cas, avec un autre
texte test ne contenant que des chiffres et des caractères en minuscule et
non accentués (donc pas de tirets, apostrophes, ç, etc.), le "bon"
résultat est donné à la fois par les traitements de texte et par le
script. Il doit donc y avoir un rapport ??

Voici ce 1er script :

<script type="text/javascript">
function Compter(chaine, formulaire) {
var exp=new RegExp("[a-zA-Z0-9éèêëàáâäóòôöíìîïçÉÈÊËÀÁÂÄÒÓÔÖÌÍÎÏÇ-]+","g");
var tabNom=chaine.match(exp);
if (tabNom==null) {formulaire.compte.value = " 0";}
else if (tabNom.length==1)
{
var affichage=" " + tabNom.length + " mot";
formulaire.compte.value = affichage;
}
else
{
var affichage=" " + tabNom.length + " mots.";

formulaire.compte.value = affichage;
}
}

</script>

J'ai tenté "pour voir" de remplacer la ligne var exp=new etc.
par
var exp=new
RegExp("[a-zA-Z0-9-éèêëàáâäóòôöíìîïúùûüçæ½ñÿÉÈÊËÀÁÂÄÒÓÔÖÌÍÎÏÚÙÛÜÇƼѾ-]+","g");
mais cela n'a rien changé (et je ne comprends pas comment fontionne ce
script...)

Pour ce qui est du second script, il donne quant à lui le même résultat
que la fonction statistique des traitements de texte, mais d'une part il
est moins compact, et surtout il affiche le résultat uniquement quand le
visiteur clique sur un bouton "Calculer les mots". Je tiens à ce que mon
visiteur n'ait pas besoin de cliquer sur ce bouton et que le résultat
s'affiche "au fur et à mesure" de la frappe, mais je n'arrive pas à
changer cela... Voici ce deuxième script :


<body>
<<br>
<SCRIPT language="JavaScript" title="G1SCRIPT">
//Script Généré sur le Site http://www.G1SCRIPT.COM


function countit(){
var formcontent=document.wordcount.wordcount2.value
formcontent=formcontent.split(" ")
document.wordcount.wordcount3.value=formcontent.length
}
//Identifiant du script: 112
//Mis en ligne: 26/09/02
//By TANGUY
</SCRIPT>
<form method="POST" name="wordcount"><input type="hidden" name="PHPSESSID"
value="b71259f88a590eaf6768b389ca3f3b7f" />
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="100%"><textarea rows="12" name="wordcount2" cols="60"
wrap="virtual"class="form"
> </textarea></td>
</tr>
<tr>
<td width="100%"><div align="right"><p>
<input type="button" value="Calculez les mots"
onClick="countit()"class="form"
> <input type="text" name="wordcount3" size="0"class="form"
>

</p>
</td>
</tr>
</table>
</form>
</body>


Quant au 3ème script que j'ai trouvé il cumule pour moi les inconvénients
car il donne un résultat encore plus éloigné de celui donné par les
traitements de texte (plus de 1 000 mots au lieu de 890), et de plus il
oblige le visiteur à cliquer sur un bouton...


Voilà, j'ai été un peu long j'ai l'impression...


Merci d'avance à ceux qui pourront m'aider !


--
Pierre

8 réponses

Avatar
Olivier Miakinen

[...] il souffre d'un défaut qui peut sembler mineur (mais que je dois
dans le cas spécifique de mon site absolument éviter), il donne un nombre
de mots différent de celui donné par la fonction statistique de Word et
Open Office : par exemple, pour un texte de 890 mots d'après ces 2
traitements de texte, le script en trouve 948...


Ce ne serait pas par hasard la fonction de Word et Open Office qui
serait incorrecte ?

Je ne sais pas à quoi tient cette différence, en tout cas, avec un autre
texte test ne contenant que des chiffres et des caractères en minuscule et
non accentués (donc pas de tirets, apostrophes, ç, etc.), le "bon"
résultat est donné à la fois par les traitements de texte et par le
script. Il doit donc y avoir un rapport ??


Oui. Essaye avec les phrases « c'est l'été aujourd'hui » et « c'était
l'été avant-hier ». Si Word trouve 5 mots dans les deux cas, il doit
utiliser un dictionnaire pour savoir que « c'est » compte pour deux
mots et « aujourd'hui » pour un seul. S'il trouve 6 et 5 mots, c'est
moins bien. S'il n'en trouve que 3, ce n'est pas terrible.

Voici ce 1er script :
var exp=new RegExp("[a-zA-Z0-9éèêëàáâäóòôöíìîïçÉÈÊËÀÁÂÄÒÓÔÖÌÍÎÏÇ-]+","g");


Simple et de bon goût. On peut l'améliorer :

J'ai tenté "pour voir" de remplacer la ligne var exp=new etc.
par
var exp=new
RegExp("[a-zA-Z0-9-éèêëàáâäóòôöíìîïúùûüçæ½ñÿÉÈÊËÀÁÂÄÒÓÔÖÌÍÎÏÚÙÛÜÇƼѾ-]+","g");


Oui, c'est mieux, sauf le « - » que tu as mis entre « 9 » et « é ». Il
vaut mieux le laisser à une extrémité, d'ailleurs il y est déjà (après
le ¾).

mais cela n'a rien changé (et je ne comprends pas comment fontionne ce
script...)


Une expression rationnelle cherche toutes les suites ininterrompues des
caractères contenus entre les crochets, puis compte le nombre de suites
trouvées.

Si Word avait compté 3 pour mes deux phrases de tests, j'imagine que
rajouter une apostrophe dans le test a des chances de retourner le même
résultat :
"[a-zA-Z0-9-éèêëàáâäóòôöíìîïúùûüçæ½ñÿÉÈÊËÀÁÂÄÒÓÔÖÌÍÎÏÚÙÛÜÇƼѾ'-]+"

Avatar
Pierre
Merci Olivier pour ton aide. Malheureusement ton message a été tronqué, il
se termine ainsi :

Si Word avait compté 3 pour mes deux phrases de tests, j'imagine que
rajouter une apostrophe dans le test a des chances de retourner le même
résultat :
"[a-zA-Z0-9-éèêëàáâäóòôöíìîïúùûüçæ½ñÿÉÈÊËÀÁÂÄÒÓÔÖÌÍÎÏÚÙÛÜÇƼѾ'-]+"



J'ai essayé de modifier la formule du 1er script ainsi :

var exp=new
RegExp("[a-zA-Z0-9éèêëàáâäóòôöíìîïúùûüçæ½ñÿÉÈÊËÀÁÂÄÒÓÔÖÌÍÎÏÚÙÛÜÇƼѾ'-]+","g");

(en rajoutant l'apostrophe donc), et le résultat est toujours "faux", càd
de 948 mots alors que Word trouve 890. Je m'étais moi aussi posé la
question de savoir si ce n'étaient pas plutôt les fonctions statistiques
de Word et Open Office qui se trompaient mais je n'avais pas vérifié comme
tu le suggérais...

Voici les résultats :

c'est l'été aujourd'hui --> Word 3 mots / 1er script (sans ') 6 mots /
1er script (avec ') 3 mots / En réalité : 5
c'était l'été avant-hier --> Word 3 mots / 1er script (sans ') 5 mots /
1er script (avec ') 3 mots / En réalité : 5

Ainsi, le 1er script d'origine, sans l'apostrophe, semble plus exact (il
faudrait juste qu'il gère spécifiquement le mot "aujourd'hui", et les mots
"prud'homie / prud'homal / prud'homale / prud'homaux / prud'homme /
prud'hommes), je crois (?) qu'il n'y a pas d'autres mots contenant
d'apostrophe en français que l'on doive considérer comme constituant un
seul mot (et gérer les noms propres avec apostrophe serait inutile), mais
enfin traiter ces quelques cas spécifiques dans le comptage des mots est
un luxe dont je peux me passer...)


Au départ cette mauvaise concordance avec Word et Open Office me posait
vraiment problème, car je voulais absolument que mon script affiche un
résultat identique aux traitements de texte (mon travail étant tarifé au
nombre de mots, si mon client veut contrôler avec Word par exemple il va
penser que je l'escroque...). Finalement je vais peut-être mettre sur mon
site un message explicatif pour prouver que le script est plus proche de
la vérité que les fonctions statistiques des traitements de texte...

J'espère que tu reposteras ton message pour que je le lise en totalité, en
tout cas merci de nouveau !


--
Pierre

Avatar
SAM
Voici les résultats :

c'est l'été aujourd'hui --> Word 3 mots / 1er script (sans ') 6 mots /
1er script (avec ') 3 mots / En réalité : 5
c'était l'été avant-hier --> Word 3 mots / 1er script (sans ') 5 mots /
1er script (avec ') 3 mots / En réalité : 5


Je comprends que pour toi : l'été est constitué de 2 mots ?

Essaie ceci (comptage auto méthode Word) :


<html>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
function countit(monform,methode){
var contenu = monform.texteur.value;
var exp;
if(methode) // comptage perso
exp = new RegExp("[., ;:nr'-]+","g");
else // comptage Word
exp = new RegExp("[., ;:nr]+","g");
contenu = contenu.split(exp);
monform.verif.value = contenu; // pour vérifier les mots
monform.compteur.value = contenu[contenu.length-1]==''?
contenu.length-1 : contenu.length;
}
</script>
<form method="post" name="wordcount" onsubmit="return false;">
<p>entrez votre texte :
<textarea name="texteur" onkeyup="countit(this.form)"
rows="12" cols="60" wrap="virtual">
c'était l'été avant-hier.

et on n'est pas dimanche; ce soir , mais
on le sera demain

.</textarea>
<br>
nombre de mots tapés :
<input type="text" name="compteur" size="3" readonly>
</p>
<p>Vérification comptage :
<input type=button value="methode word"
onclick="countit(this.form);">
<input type=button value="methode perso"
onclick="countit(this.form,1);">
<br>
<textarea name="verif" rows="12" cols="80"></textarea>
</p>
</form>
</html>

qui compte juste même si on a fait des fautes de frappe dans les
espacements et ponctuations.

Avatar
newdb
Pierre wrote:
il faudrait juste qu'il gère spécifiquement le mot "aujourd'hui", et les mots
"prud'homie / prud'homal / prud'homale / prud'homaux / prud'homme /
prud'hommes), je crois (?) qu'il n'y a pas d'autres mots contenant
d'apostrophe en français que l'on doive considérer comme constituant un
seul mot


bonjour,
pour info :


Les apostrophes ont été supprimées dans les mots suivants :
entrouvrir,
entracte,
entraide,
entraccorder,
entraccorder,
entraccuser,
grand'rue,
grand'mère (devenue un trait d'union depuis 1935)


Elles sont conservées dans :

(cinq verbes constituant des exceptions)
- s'entr'aimer,
- s'entr'égorger,
- entr'apercevoir,
- s'entr'appeler,
- s'entr'avertir

(faux anglicisme)
- pin's

(patronymes irlandais O' ou «fils de»)
- O'Connor,
- O'Driscoll (!)
- ...

(génitif anglais)
- chez Maxim's,
- au Fouquet's
- ...

(formés à partir de l'adjectif prod, «sage» en ancien français)
- prud'homme,
- prud'homie,
- prud'homal

- aujourd'hui (du latin «hodie»)

--
@@@@@
E -00 comme on est very beaux dis !
' `) /
|_ =="

Avatar
Pierre
Alors là Sam chapeau bas : 2 scripts pour le prix d'un ! Je n'ai plus qu'à
choisir, merci beaucoup...

Quant à DenisB, merci pour la liste et bravo pour l'érudition... Pour
info, certaines graphies ont été effectivement rectifiées mais ne sont que
des recommandations ; par exemple la graphie "entr'ouvrir" au lieu de la
graphie rectifiée "entrouvrir" n'a pas été "supprimée" et reste encore
tout à fait correcte.

Pierre
Avatar
SAM
Pierre wrote:
il faudrait juste qu'il gère spécifiquement le mot "aujourd'hui", et les mots
"prud'homie / prud'homal / prud'homale / prud'homaux / prud'homme /
prud'hommes), je crois (?) qu'il n'y a pas d'autres mots contenant
d'apostrophe en français que l'on doive considérer comme constituant un
seul mot


bonjour,
pour info :


Bon alors petite modification,
et peut-être un peu tiré par les cheveux ? :

On supprime le - ou le ' dans les mots composés issus d'un tableau de
référence
on repère et réduit tous les trucs qui ne sont pas des mots et on s'en
sert de séparateur pour créer le tableau des mots
tableau qu'on trie et inverse
on en supprime les éléments vide
enfin ... la longueur de ce tableau nous donne le nombre de mots


<html>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
function countit(monform,methode){
var contenu = monform.texteur.value;
var exp;
var exceptions = ['entr','grand','prud','Entr','Grand','Prud'];
for(var i=0; i<exceptions.length; i++) {
exp = new RegExp(exceptions[i]+"'|(' )|-|(- )","g");
contenu = contenu.replace(exp,exceptions[i]);
}
if(methode)
exp = new RegExp("[., ;:?!{}()nr'-]+","g");
else
exp = new RegExp("[., ;:?!{}()nr]+","g");
contenu = contenu.split(exp).sort().reverse();
while(contenu[contenu.length-1]=='') contenu.length--;
monform.compteur.value = contenu.length;
monform.verif.value = contenu;
}
</script>
<form method="post" name="wordcount" onsubmit="return false;">
<p>entrez votre texte :
<textarea name="texteur" onkeyup="countit(this.form)"
rows="12" cols="60" wrap="virtual" style="vertical-align:top">
c'était l'été avant-hier.

et on n'est pas dimanche; ce soir , mais
on le sera demain ?

Le Prud'Homme n'est pas le prud-homme
(pourtant chacun sera compté comme un seul mot !)
(tout comme "avant-hier" d'alleurs)
...

.</textarea>
<br>
nombre de mots tapés :
<input type="text" name="compteur" size="3" readonly>
</p>
<p>Vérification comptage :
<input type=button value="methode word" onclick="countit(this.form);">
<input type=button value="methode perso" onclick="countit(this.form,1);">
<br>
<textarea name="verif"
rows="12" cols="60" wrap="virtual"></textarea>
</p>
</form>
</html>


Les apostrophes ont été supprimées dans les mots suivants :


C'est dingue ça !


Avatar
SAM
Alors là Sam chapeau bas : 2 scripts pour le prix d'un ! Je n'ai plus
qu'à choisir, merci beaucoup...


Oui, bon ... c'est tout de même à rôder !
Je n'ai sans doute pas écarté tous les pièges

Avatar
Olivier Miakinen
Merci Olivier pour ton aide. Malheureusement ton message a été tronqué, il
se termine ainsi :

Si Word avait compté 3 pour mes deux phrases de tests, j'imagine que
rajouter une apostrophe dans le test a des chances de retourner le même
résultat :
"[a-zA-Z0-9-éèêëàáâäóòôöíìîïúùûüçæ½ñÿÉÈÊËÀÁÂÄÒÓÔÖÌÍÎÏÚÙÛÜÇƼѾ'-]+"



C'est plutôt moi qui ai arrêté mon article ici car je n'avais rien de
très intelligent à ajouter... ;-)

C'est vrai que j'aurais pu mettre une formule de salutation ou une
signature, mais j'avais la flemme.

J'ai essayé de modifier la formule du 1er script ainsi :

var exp=new
RegExp("[a-zA-Z0-9éèêëàáâäóòôöíìîïúùûüçæ½ñÿÉÈÊËÀÁÂÄÒÓÔÖÌÍÎÏÚÙÛÜÇƼѾ'-]+","g");

(en rajoutant l'apostrophe donc), et le résultat est toujours "faux", càd
de 948 mots alors que Word trouve 890. [...]

Voici les résultats :

c'est l'été aujourd'hui --> Word 3 mots / 1er script (sans ') 6 mots /
1er script (avec ') 3 mots / En réalité : 5
c'était l'été avant-hier --> Word 3 mots / 1er script (sans ') 5 mots /
1er script (avec ') 3 mots / En réalité : 5


Bon, j'avais donc une bonne intuition concernant les apostrophes. Mais
mon intention était surtout de t'inviter à rechercher ce qui, dans Word,
serait différent de la recherche que tu fais. Tu peux partir de ton
texte d'environ 900 mots, puis en supprimer petit à petit pour voir où
se trouvent les différences.

Si ça se trouve, le test de Word correspond de façon simpliste à :
var exp=new RegExp("[^ ]+","g");
(il doit y avoir une espace normale et une espace insécable, mais mon
logiciel remplace tout par une espace simple)

Du coup, il trouverait quatre mots au lieu de deux dans « qui ? moi ? »

Au départ cette mauvaise concordance avec Word et Open Office me posait
vraiment problème, car je voulais absolument que mon script affiche un
résultat identique aux traitements de texte (mon travail étant tarifé au
nombre de mots, si mon client veut contrôler avec Word par exemple il va
penser que je l'escroque...). Finalement je vais peut-être mettre sur mon
site un message explicatif pour prouver que le script est plus proche de
la vérité que les fonctions statistiques des traitements de texte...


Quitte à avoir une différence, je te conseille d'en avoir une qui soit à
l'avantage de ton client : ça ne te fera pas une différence énorme en
termes pécuniaires, mais tu seras mieux apprécié, et du coup ils n'en
travailleront que mieux.

J'espère que tu reposteras ton message pour que je le lise en totalité, en
tout cas merci de nouveau !


:-D