11402 sujets

JavaScript, DOM et API Web HTML5

Pages :
Modérateur
(reprise du message précédent)

Est-ce que :
[^\d\W]+[^\d\W-]*|[\d]*

correspond du coup ?
upload/1613656757-42161-capture.jpg

https://regexr.com/5mp6s


(oops j'ai oublié les caractères spéciaux comme le î Smiley sweatdrop )
(et mince j'ai perdu les - aussi... Smiley lol )
Modifié par _laurent (18 Feb 2021 - 15:02)
Modérateur
Me revoilou avec :
([a-zÀ-ú]+[a-zÀ-ú-]*)|([\d]+)

Qui prend les groupes qui commencent par 1 ou + caractère (du a au z et du À au ú pour les accent voir la table unicode mais sinon on peut tous les mettre un par un) et qui continue par 0 ou + autre caractère ou tiret. J'ai exclus volontairement les nombres pour ne pas mélanger. Apres on trouve un OR et tout les digit (1 ou +).
Ca a l'air de coller avec ce que tu en attends..
https://regexr.com/5mp6s
upload/1613657612-42161-regexp.jpg
Merci beaucoup !

@parsimonhi : Ah ! Donc ça va compliquer la regex ou la rendre impossible ?
Du coup, il faut des dictionnaires ?
Si ça peut aider, j'ai une liste de mots français : http://www.pallier.org/extra/liste.de.mots.francais.frgut.txt mais où les caractères accentués sont encodés (D'ailleurs avez-vous une liste de décodages pour des fichiers csv que j'utilise ?) !

@_laurent : Merci ! Selon ce que je pensais, c'était presque bon, il manquait juste les pourcents qui devaient se séparer des nombres et compter comme un, mais avec la règle que je ne connaissais pas "Les mots composés comptent pour 2 mots à partir du moment où chacun des mots pris séparément a un sens", ça complique tout.

Si c'est faisable, je veux bien un code pour respecter cette règle, sinon, je me contenterais de la précédente, mais...

Dans la regex, l'astérisque signifie quoi ? "Un ou plusieurs caractères ?"

Merci beaucoup !
Modérateur
Bonjour,

js_html a écrit :
@parsimonhi : Ah ! Donc ça va compliquer la regex ou la rendre impossible ?
Du coup, il faut des dictionnaires ?

Si tu veux un résultat "selon les règles en usage pour le français", un dictionnaire me semble indispensable. Je ne sais pas si ça compliquera la regex, mais une regex seule ne suffira pas de toute façon. Il faudra sans doute faire un premier jet avec une regex, puis regarder ensuite chaque mot à problème potentiel (ceux qui contiennent des apostrophes et des tirets en particulier) et vérifier pour eux ce qu'il y a dans le dictionnaire (et même là, ce n'est pas si facile car il peut y avoir des verbes conjugués, des mots au pluriel, etc.)

Si tu veux juste un résultat approximatif, tu peux te passer du dictionnaire, et faire une regex du genre de ce que te propose _laurent.

Il n'y a que toi qui sais jusqu'où il faut aller.

Amicalement,
Si vous voulez bien m'aider à continuer, je pense qu'il serait mieux d'avoir un résultat "selon les règles en usage pour le français".
Si cela vous dérange ou vous embête (ce que je peux comprendre), je serai obligé de garder ça car je ne vois pas comment je pourrais continuer tout seul...

Merci !
Modérateur
Bonjour,

J'ai jeté un coup d'oeil sur ton dictionnaire.

1) Quand on l'affiche dans la fenêtre d'un navigateur, on a des caractères qui s'affichent mal, mais c'est normal parce que le navigateur n'affiche pas un fichier .txt en utf-8 par défaut. Mais si on fait enregistrer le fichier, puis si on l'ouvre avec un "vrai" éditeur de texte, on n'a plus d'erreur. A priori, cela devrait bien se passer si on utilise php ou js.

2) ce dictionnaire est inutilisable pour ton problème. Il ignore complètement les apostrophes, et il met (tous?) les mots avec des tirets, même ceux qui sont considérés comme devant être comptés comme plusieurs mots (voir par exemple cerf-volant). Or, c'est de la fiabilité sur ces points-là dont tu as besoin.

En l'absence de dictionnaire approprié (que de toute façon tu risques d'avoir beaucoup de mal à trouver), fais donc des règles simplifiées, sinon c'est mission impossible.

Amicalement,
Modifié par parsimonhi (18 Feb 2021 - 18:23)
Modérateur
Et l'eau,

J'ai lu en Z les réponses et je me dis que tu (js_html) te casses la tête pour pas grand chose. J'ai ouvert un libre office writer et j'ai saisi le texte ci-dessous. Je n'ai même pas eu besoin d'utiliser Counter de l'objet collection. Bref, il suffit de faire simple.


Text = """anti-passe temps Chuck Norris a déjà compté jusqu'à l'infini. Deux fois. Google, c'est le seul endroit où tu peux taper Chuck Norris… Chuck Norris donne fréquemment du sang à la Croix-Rouge. Mais jamais le sien."""

for char in '.,\n':
    Text=Text.replace(char,' ')
word_list = Text.lower().split()

print(word_list)
print(len(word_list))


Pour commenter ce code :
- la boucle for va faire un petit nettoyage rudimentaire
- le text est mis en bas de casse afin qu'il n'y ait pas d'ambiguité (pour un traitement ultérieur)
- il est splité suivant les espaces (équivalent à explode en php)
- compte le nombre d'occurence dans la list. (j'obtiens le même résultat dans libre office writer)
Modifié par niuxe (19 Feb 2021 - 19:48)
@parsimonhi
parsimonhi a écrit :
ce dictionnaire est inutilisable pour ton problème
Ah bon ? Ce que l'on a besoin, ce n'est pas de savoir si les mots de chaque côté des apostrophes et traits d'union existent indépendamment ?

@niuxe
Ton script, c'est du JS ? Ce n'est pas plutôt du Python ou je ne sais quoi ?
Pourquoi tu mets trois """ ?
Si t'obtiens le même nombre que LibreOffice, c'est qu'il compte mal... Déjà, ta phrase n'a presque pas de mots composés, mais "jusqu'à", "c'est", "Croix-Rouge" doivent compter deux mots chacun, donc imagine un texte de plusieurs pages, on s'éloigne vite du compte...
En plus, là, les "; : ! ?" comptent comme un mot ; les mots composés, ça en est loin... Si ça ne fonctionne pas avec les dicos, je préfère amplement le code de _laurent.

Merci !
Modérateur
Bonjour,

js_html a écrit :
Ah bon ? Ce que l'on a besoin, ce n'est pas de savoir si les mots de chaque côté des apostrophes et traits d'union existent indépendamment ?

Si tu valides la règle "mot composé (que ce soit avec apostrophe ou tiret) vaut 1 mot seulement si au moins un des mots le composant n'est pas dans le dictionnaire", ça ne permet pas de résoudre tous les cas me semble-t-il.

Par exemple, "pense-t-on" doit compter pour 2 mots. On doit retirer le -t- (ok, ça, c'est facile), mais après, "pense" et "on" sont tous les deux dans le dictionnaire. Ils sont séparés par un "-", mais ce n'est pas un mot composé. De même dans "que fait-il", c'est 3 mots, pourtant tous les composés sont dans le dictionnaire. Et pour "va-t'en" c'est pareil : 2 (ou 3?) mots alors que "va" et "en" sont dans le dictionnaire, et qu'il faut retirer (ou pas?) cette fois-ci "-t'".

Il y a peut-être d'autres cas encore plus gênants. Je ne suis pas omniscient.

Il faut aussi faire attention qu'un mot composé a parfois plus de 2 composants.

Il faut tenir compte du fait qu'avec les apostrophes, il manque une (ou plusieurs dans certains cas) lettre au mot précédent l'apostrophe.

Amicalement,
Modifié par parsimonhi (20 Feb 2021 - 18:23)
Bonjour,
Merci de cette réponse !

Je pensais que la règle était pour chaque mot composé (un mot contenant un tiret ou une apostrophe avec une lettre de chaque côté), on split au séparateur, enlève les "t" tous seuls, puis ça compte un mot par mot qui existe dans le dictionnaire tout seul.
Ex :
cerf-volant = mot composé
"cerf" est dans le dico donc compte pour un mot
"volant" est dans le dico donc compte pour un mot

parsimonhi a écrit :
Il faut tenir compte du fait qu'avec les apostrophes, il manque une (ou plusieurs dans certains cas) lettre au mot précédent l'apostrophe.
On pourrait, lorsque ça teste, si ça ne trouve pas dans le dictionnaire, ajouter une voyelle (a, e, i, o, u) et voir à chaque fois si ça y est.
"ou plusieurs dans certains cas" : y aurait-il des exemples ? Y en a-t-il beaucoup ? On pourrait en faire un dico... ?

Merci !
Bonjour,
parsimonhi a écrit :
ce dictionnaire est inutilisable pour ton problème. Il ignore complètement les apostrophes, et il met (tous?) les mots avec des tirets, même ceux qui sont considérés comme devant être comptés comme plusieurs mots (voir par exemple cerf-volant). Or, c'est de la fiabilité sur ces points-là dont tu as besoin.
Sinon, si besoin, après d'amples recherches, j'ai trouvé un dictionnaire qui conviendrait : http://abu.cnam.fr/DICO/donner-dico-uncompress.html ! En copiant tous les mots, en splitant... J'obtiens 289 499 mots, dont 100 avec une apostrophe et 3682 contenant apostrophe ou trait d'union ou les deux. Il date de 1999 (donc les mots plus récents n'y apparaissent pas et les rectifications orthographiques de 1990 n'y apparaissent pas non plus, mais il doit déjà y avoir pas mal de voc...) ! Voici le fichier xlsx correspondant au dico trouvé : ici. Après, il est tout à fait possible de le transformer en txt ou autre...
Sinon, si besoin, après d'amples recherches, j'ai trouvé un dictionnaire qui conviendrait : http://abu.cnam.fr/DICO/donner-dico-uncompress.html ! En copiant tous les mots, en splitant... J'obtiens 289 499 mots, dont 100 avec une apostrophe et 3682 contenant apostrophe ou trait d'union ou les deux. Il date de 1999 (donc les mots plus récents n'y apparaissent pas et les rectifications orthographiques de 1990 n'y apparaissent pas non plus, mais il doit déjà y avoir pas mal de voc...) ! Voici le fichier xlsx correspondant au dico trouvé : ici. Après, il est tout à fait possible de le transformer en txt ou autre...
Salut parsimonhi,
Est-ce que tu penses que c'est envisageable d'utiliser les vraies règles de comptage de mots, du coup ?
Mon dictionnaire convient-il ?
Quel processus faut-il faire ?

Merci !
Modérateur
Bonjour,

Un jour, il y a longtemps, j'étais allé voir mon (jeune) chef (bien diplômé) avec une pile de problèmes plus ou moins insolubles. Et au bout d'une demi-heure, après m'avoir patiemment écouté, il m'a fait :

"Tu sais, il faut que je te dise un truc, le monde est imparfait."

Ça m'a beaucoup marqué.

Je ne pense pas qu'on puisse coder "les vraies règles de comptage de mots", parce que d'une part, on ne les connait pas, et d'autre part, on n'a pas les outils qu'il faudrait sous la main. Ainsi est le monde : imparfait.

Par contre, il est raisonnable d'envisager un comptage des mots approximatif. C'est à toi de décider jusqu'où ce sera approximatif en fonction des ressources dont tu disposes.

Amicalement,
Modifié par parsimonhi (05 Mar 2021 - 19:17)
Bonjour,
a écrit :
C'est à toi de décider jusqu'où ce sera approximatif en fonction des ressources dont tu disposes.
De quelles ressources parles-tu ?

Cela irait-il comme règles ?
Des lettres séparées par un espace=un mot
Pour les mots composés : un mot par composé qui existe seul (sauf le t et les voyelles seules)
Pour les nombres, un mot entre chaque opérateur

Merci pour ton soutien !
Bonjour,
a écrit :
C'est à toi de décider jusqu'où ce sera approximatif en fonction des ressources dont tu disposes.
De quelles ressources parles-tu ?

Cela irait-il comme règles ?
Des lettres séparées par un espace=un mot
Pour les mots composés : un mot par composé qui existe seul (sauf le t et les voyelles seules)
Pour les nombres, un mot entre chaque opérateur

Merci pour ton soutien !
Modérateur
Bonjour,

Les ressources : le ou les dictionnaires dont tu disposes, l'ensemble de règles de comptage de mots que tu as trouvé (ou qu'on t'a indiqué).

Pour le choix des règles, encore une fois, tu fais comme tu le sens. On n'est pas à ta place, on n'a aucune idée du contexte, on ne sait pas jusqu'où il faut être précis, on ne sait pas ce que tu veux faire de ce comptage, on ne sait pas pour quel genre de texte tu veux compter les mots.

On comprend juste qu'il y a un peu de tout sans trop savoir jusqu'où ça va (si par exemple tu commences à vouloir analyser n'importe quelle formule mathématique, voir des textes représentant du code informatique, on n'est pas rendu).

Bref, on ne peut pas faire les choix à ta place.

Amicalement,