Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/01/2013, à 12:47

roger64

[résolu] Créer une liste de noms à partir d'un odt

Bonjour

L'utilisation du correcteur orthographique d'OpenOffice est terriblement fastidieuse pour des gros fichiers (gros romans par exemple). La fenêtre de dialogue est très processionnelle, et, en ce qui concerne les noms propres les propositions sont très souvent fantaisistes. En pratique, cela veut dire que je me contente souvent de survoler le texte, ce qui est loin d'être une solution optimale...

J'ai désormais mis au point deux macros qui me permettent d'écarter de la vérification orthographique les noms propres (disons les noms commençant par une majuscule, ce qui inclut également les noms communs en tête de phrase). Cela accélère énormément la vérification, au prix, bien sûr, d'une impasse sur ces noms propres et autres (+).

En ce qui concerne ces derniers, plutôt que de recourir à la fenêtre de dialogue, il me semble qu'il serait beaucoup plus efficace de produire (avec sed ou quelque autre logiciel de cette famille) une liste alphabétique des noms commençant par une majuscule. Une liste alphabétique peut être parcourue infiniment plus vite qu'en utilisant successivement et laborieusement les entrées de la fenêtre de dialogue. Cela permet accessoirement  de mettre rapidement en évidence les graphies distinctes pour les mêmes noms qui sont de fréquentes sources d'erreur.

Le fichier source serait bien sûr un fichier odt. Quelqu'un pourrait-il me dire si la réalisation d'une telle liste alphabétique  poserait un problème technique ?(nécessité de convertir à un format txt par exemple).

Dernière modification par roger64 (Le 22/01/2013, à 17:03)

Hors ligne

#2 Le 22/01/2013, à 13:12

pingouinux

Re : [résolu] Créer une liste de noms à partir d'un odt

Bonjour,
À partir d'un fichier texte, c'est facile à faire.

Hors ligne

#3 Le 22/01/2013, à 13:46

roger64

Re : [résolu] Créer une liste de noms à partir d'un odt

Bonjour

Dans ce cas, c'est sans doute la solution que je vais adopter... si tu veux bien me donner le code sur la façon de procéder à partir d'un fichier txt tongue

La conversion vers txt ne pose bien sûr aucun problème (dans la mesure où l'on n'a pas à se soucier de question de formatage).

Dernière modification par roger64 (Le 22/01/2013, à 13:47)

Hors ligne

#4 Le 22/01/2013, à 14:12

pge

Re : [résolu] Créer une liste de noms à partir d'un odt

Bonjour,

Les kadors du sed diront qu'on peut faire mieux, plus vite, ... etc wink ... mais ça marche !!!

cat ton_fichier.txt | sed 's/<[^>]*>/\n/g' | sed '/./!d' | sed 's/ /\n/g' | grep [A-Z] | sort -u

Edit :
Oups !!! Mélange dans mes lignes : cette ligne fonctionne pour le fichier content.xml du fichier .odt ...

Directement pour le fichier .txt (enregistrement de l' .odt sous .txt) :
cat ton_fichier.txt | sed 's/ /\n/g' | grep [A-Z] | sort -u

Dernière modification par pge (Le 22/01/2013, à 14:22)

Hors ligne

#5 Le 22/01/2013, à 14:37

pingouinux

Re : [résolu] Créer une liste de noms à partir d'un odt

for i in $(cat fichier.txt); do grep '^[A-Z]' <<<"$i"; done | sort -u

Ajouté :
@pge #4 : Il y a une petite erreur dans ta commande. Voici la correction :

cat ton_fichier.txt | sed 's/ /\n/g' | grep '^[A-Z]' | sort -u

ou mieux

sed 's/ /\n/g' ton_fichier.txt | grep '^[A-Z]' | sort -u

Dernière modification par pingouinux (Le 22/01/2013, à 14:45)

Hors ligne

#6 Le 22/01/2013, à 15:13

roger64

Re : [résolu] Créer une liste de noms à partir d'un odt

Je teste vos nouveautés smile

Tout d'abord merci beaucoup de votre aide et de votre réactivité.

J'ai testé sur un roman la dernière solution de pge et de pingouinux qui fonctionnent toutes deux.

1. Le résultat est excellent (pour le but recherché) et hyper-rapide.
2. Voici un exemple de quelques mots où les fautes sautent aux yeux:
Chameroy
Chameroy,
Chameroy.
Chameroy, –
Chameroy. –
Chamkroy, –
.../...
Champs-Elysées,
Champs-Élysées,
Champs-Élysées.
Ce n'est, à mon avis, pas la peine de compliquer en cherchant à retirer les ponctuations. Par contre, vu le volume du texte, j'ai du rajouter à la formule magique l'expression

 | less

pour faire défiler à mon rythme.  Je pense qu'il vaudrait mieux d'ailleurs une sortie texte.

3. En fin de classement orthographique, on trouve les mots qui suivent les tirets de dialogue et les guillemets ouvrants (suivis l'un et l'autre d'insécables). Cela fait une petite liste annexe mais ce n'est pas un problème.

Dernière modification par roger64 (Le 22/01/2013, à 15:36)

Hors ligne

#7 Le 22/01/2013, à 15:26

pge

Re : [résolu] Créer une liste de noms à partir d'un odt

@ Pingouinux
Merci pour ta correction ... Effectivement, sans le "^", ce sont tous les mots qui contiennent une majuscule qui sont conservés (même si elle se trouve au milieu de la chaîne ... ce qui, a priori, est plutôt rare en français ...)
... Mais de toute façon, ta ligne est bien plus élégante !!!

Hors ligne

#8 Le 22/01/2013, à 17:37

pingouinux

Re : [résolu] Créer une liste de noms à partir d'un odt

@roger64 #6 : Tu peux essayer ceci

sed 's/[^[:alpha:]]/\n/g' fichier.txt | grep '^[A-Z]' | sort -u

Hors ligne

#9 Le 23/01/2013, à 02:42

roger64

Re : [résolu] Créer une liste de noms à partir d'un odt

@pingouinux

Merci beaucoup, je prends note. Je vais  tester vos solutions avec notamment des mots d'origine très variée et pas forcément d'origine française, que l'on est cependant susceptible de rencontrer (Saint-Nazaire, La_Rochefoucauld avec une insécable, La_Roche-sur-Yon, L'Encyclopedia Britannica, etc.). Parfois le mieux est l'ennemi du bien.

Je reviendrai ensuite sur ce fil. Il est possible que je cherche encore à "purger" cette expression pour faciliter et accélérer la lecture: ôter les points, virgules, points-virgule p.ex. Mais il faut que je m'assure que cela ne crée pas de problèmes par ailleurs. Les apostrophes, insécables, d'autres signes de ponctuation peuvent en effet être porteurs de sens pour certains mots.

Un ultime progrès serait ensuite de décanter encore cette liste en séparant les noms communs résiduels des véritables noms propres. Mais pour cela il faudrait une analyse sémantique ... rapide. Plus facile à dire qu'à faire.  C'est une autre paire de manches. hunspell sait le faire (disons qu'il reconnait les noms communs -de son dictionnaire- et donc que, par défaut, ceux qu'il ne reconnaît pas sont, soit des mots tout à fait nouveaux (rares ou étrangers), soit des noms propres) et on peut le brancher avec un menu contextuel sur OO mais de là à passer à l'examen et au tri d'une liste...

Dernière modification par roger64 (Le 23/01/2013, à 02:43)

Hors ligne

#10 Le 23/01/2013, à 13:19

roger64

Re : [résolu] Créer une liste de noms à partir d'un odt

Bonjour

J'ai créé un script pour faire ce dont on a parlé hier.

Les étapes successives sont dans le fichier http://dl.dropbox.com/u/31141350/guide.zip

Il contient
- un livre au format odt (déjà publié sur MobileRead au format EPUB): guide.odt
- un livre au format txt (converti par odt2txt): guide.txt
- le fichier noms propres au format txt: guide2.txt
- le script qui permet de passer de l'odt au fichier.

Si c'est possible, j'aimerais perfectionner le résultat de sortie du fichier.

En regardant le détail du fichier guide2.txt, vous verrez qu'en général les ponctuations sont conservées dans ou à la suite des noms de fichier. C'est parfois très utile et signifiant dans le cas des traits d'union (Saint-Nazaire), des apostrophes (l'Encyclopédie), de certains insécables (Louis_XIII).

Par contre, il n'y a aucune valeur ajoutée à conserver les signes de ponctuation comme la virgule, le point (qui sont ceux que l'on rencontre les plus fréquemment) ainsi que les points de suspension. C'est également vrai pour les signes composés suivants:  (insécable suivi d'une ponctuation haute (;!?:), insécable suivi d'un guillemet fermant) : il n'y a pas de valeur ajoutée à les conserver.

Ceci dit, cela n'a en fait pas une grosse importance. Si vous ouvrez ce fichier txt avec le Writer, il suffit de se concentrer sur les noms propres (et/ou inconnus) soulignés en rouge.Soit, ils ne figurent pas dans le dictionnaire, soit ils contiennent une faute d'orthographe. Il n'y a pas de flexion, donc pas d'incertitude à leur sujet (hormis la marque du pluriel). Néanmoins, si vous me débarrassez des points et des virgules, ce ne sera pas de refus... big_smile

Le "balayage" peut donc être extrêmement rapide. Il y a un coût:  cette technique "oublie" de remplir le dictionnaire utilisateur.

Dernière modification par roger64 (Le 23/01/2013, à 13:26)

Hors ligne

#11 Le 23/01/2013, à 13:33

pingouinux

Re : [résolu] Créer une liste de noms à partir d'un odt

@roger64 #10 : Tu n'as pas tenu compte de ma suggestion du #8

Dernière modification par pingouinux (Le 23/01/2013, à 13:34)

Hors ligne

#12 Le 23/01/2013, à 14:33

roger64

Re : [résolu] Créer une liste de noms à partir d'un odt

C'est vrai,  je le fais immédiatement. J'avais un peu m... avec le script...

Hors ligne

#13 Le 23/01/2013, à 14:52

roger64

Re : [résolu] Créer une liste de noms à partir d'un odt

@pingouinux

Formidable!!! Ton code est un vrai bijou. smile

Le fichier résultat est hyper-clean et c'est un vrai régal à utiliser. Il a aussi énormément fondu puisque les  redondances ont été supprimées, ce qui facilite d'autant la correction. Les doublons qui restent trahissent immédiatement les fautes de frappe.

Tu vas sans doute me trouver exigeant. Il y a un tout petit point qui me chiffonne:  les traits d'union sont passés à la trappe avec le reste. Or, Roche-sur-Yon ne devrait pas être tronçonné en Roche et Yon. Pour les autres suppressions, cela ne pose pas de problème particuliers.

PS: J'ai modifié le fichier dropbox pour y mettre ta dernière commande.

Dernière modification par roger64 (Le 23/01/2013, à 15:42)

Hors ligne

#14 Le 23/01/2013, à 15:37

pingouinux

Re : [résolu] Créer une liste de noms à partir d'un odt

roger64 #13 a écrit :

les traits d'union sont passés à la trappe

Il n'y a pas grand-chose à changer

sed 's/[^[:alpha:]-]/\n/g' fichier.txt | grep '^[A-Z]' | sort -u

Hors ligne

#15 Le 23/01/2013, à 15:50

roger64

Re : [résolu] Créer une liste de noms à partir d'un odt

@pingouinux

Merci beaucoup de ton aide. Je suis vraiment ravi du résultat.  smile

Je suis persuadé que l'on a ainsi un excellent moyen de vérifier rapidement l'orthographe des noms propres d'un fichier. Ce faisant on fait la moitié du boulot. L'autre moitié existe sous forme de deux macros, une aller et une retour que l'on exécute sous OpenOffice.
Je mettrai un lien sur ce fil lorsque je publierai le tout d'ici quelques jours sur MobileRead.

Le tout constitue une solution alternative qui accélère grandement la vérification orthographique de gros fichiers (livres, ...) à l'intention de ceux que la fenêtre de dialogue plan-plan du vérificateur orthographique exaspère.

Dernière modification par roger64 (Le 23/01/2013, à 15:51)

Hors ligne

#16 Le 24/01/2013, à 11:24

roger64

Re : [résolu] Créer une liste de noms à partir d'un odt

Bonjour

J'ai rajouté au script un tri hunspell (paquets hunspell + hunspell.fr). Celui-ci ne retient de la liste 2 produite par seb/grep que les mots qui ne sont pas dans le(s) dictionnaire(s), c'est-à-dire les mots inconnus et/ou fautifs. Pour le livre que j'ai pris comme exemple, cela se résume à une liste résiduelle d'un peu plus de 300 mots, parmi lesquels il est bien sûr aisé de repérer les mots mal écrits.

Ce n'est même pas la peine de faire une analyse morphologique. Il est aussi possible ensuite d'entrer les mots nouveaux dans le dictionnaire utilisateur. Pour le moment, je le fais mot après mot (touche i) et je cherche le traitement par lot.

Le traitement complet d'un livre standard avec ce script prend une poignée de secondes. Voici l'état actuel du script:

#! /bin/bash

name=$(zenity --entry --title "Nom du fichier odt" --text "Nom?" --entry-text=Nom?)
echo "name=$name"

odt2txt --width=-1 "${name}".odt > "${name}".txt

sed 's/[^[:alpha:]-]/\n/g' "${name}".txt | grep '^[A-Z]' | sort -u  > "${name}"2.txt

hunspell -l "${name}"2.txt > "${name}"3.txt

echo "Fini"
zenity --info --text "Fini"

Dernière modification par roger64 (Le 24/01/2013, à 11:30)

Hors ligne

#17 Le 26/01/2013, à 05:43

roger64

Re : [résolu] Créer une liste de noms à partir d'un odt

@pingouinux

Je poursuis mes tests. J'ai finalement décidé d'élargir les termes de la recherche à la totalité des mots d'un livre et j'obtiens des résultats particulièrement prometteurs. Cependant, il y a un problème résiduel qui est celui de l'absence de contrôle sur les mots contenant une apostrophe.
Il y a, me semble t-il, deux types de solution. Je pencherais plutôt pour la seconde, en espérant qu'elle soit aussi plus facile à mettre en œuvre.

1. Une solution globale:

La même recherche avec sed comprendrait à la fois les traits d'union et les apostrophes. Je n'ai pas réussi à la faire fonctionner: il semble qu'il faut que ce soit ou l'un ou l'autre. A la réflexion, je ne pense pas que ce soit la meilleure solution.

2. Une solution dissociée.

Elle consiste à faire deux recherches successives, l'une avec des traits d'union, l'autre avec des apostrophes. On obtient alors beaucoup de vilains doublons. Ce serait cependant une solution très convenable si l'on parvenait à limiter rigoureusement la deuxième recherche et à la cantonner exclusivement sur les mots (ou expressions) contenant une apostrophe. Ainsi, elle pourrait être proposée à titre d'option complémentaire. Par ailleurs, la recherche "traits d'union" ne fournit que quelques très rares mots tronqués comme lorsqu, aujourd, etc. plus les lettres djlmnst et qu. qu'il est aisé de rajouter au dictionnaire utilisateur (et donc de faire disparaître définitivement du résultat ultérieur de la recherche).

3. Statistiques

A titre d'exemple, sur un gros roman historique, le résultat final (après le traitement hunspell) "traits d'union" fournit 550 mots (dont sans doute moins d'une centaine pour les mots avec un trait d'union). Le résultat final "apostrophes" en fournit 2660, soit cinq fois plus. Sur ce total de 2660, on peut considérer qu'il y a largement plus de 2000 mots avec des apostrophes dont plus de 99% débutent avec les lettres [djlmnst] et [qu] . Il y en a moins de cent pour les traits d'union. Avec le livre joint, le rapport est de un à quatre.  Il est facile de voir pourquoi les mots avec apostrophes rendent exaspérante l'utilisation de la fenêtre recherche... Lors des premiers livres, la "récolte" de mots avec apostrophes serait importante. Si je parviens, avec un traitement par lot, à les rajouter au dictionnaire utilisateur de hunspell, ce chiffre devrait régulièrement et significativement décroître au fil du temps.

Le problème actuellement est qu'il y a de gros recoupements entre ces deux listes.

4. Question

Voilà où j'en suis. Je suis obligé de faire de nouveau appel à toi pour voir si tu pouvais mettre au point une recherche ne ciblant que les mots ou expressions contenant une apostrophe.

Je te propose un nouveau livre de test. Il contient également le texte de l'état actuel du script et les résultats obtenus sur ce nouveau livre test. Le livre a déjà été publié sur MobileRead au format EPUB.
http://dl.dropbox.com/u/31141350/hussarde.zip

Dernière modification par roger64 (Le 26/01/2013, à 05:50)

Hors ligne

#18 Le 26/01/2013, à 06:45

nesthib

Re : [résolu] Créer une liste de noms à partir d'un odt

Pour extraire les mots avec apostrophe ou trait d'union de ton fichier texte :

en limitant à un seul trait d'union ou une apostrophe :

grep -oe "[[:alpha:]]\+[-'][[:alpha:]]\+" fichier

sans limite :

grep -oe "[[:alpha:]]\+[-'][[:alpha:]'-]*[[:alpha:]]\+" fichier

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#19 Le 26/01/2013, à 08:41

roger64

Re : [résolu] Créer une liste de noms à partir d'un odt

Bonjour nesthib

Si les poids lourds s'en mêlent... smile

J'ai essayé le second car il y a effectivement des expressions avec deux traits d'union.

grep -oe "[[:alpha:]]\+[-'][[:alpha:]'-]*[[:alpha:]]\+" hussarde.txt > hussarde7.txt

D'après cet essai, il ne traite que les traits d'union du texte. Les mots ou expressions ne sont pas rangées alphabétiquement et il y a des duplications (répétitions de mots identiques qui ne devraient occuper qu'une seule entrée).

S'il ne traite pas les apostrophes, c'est peut-être parce que j'utilise systématiquement les apostrophes typographiques (courbes et non droites)?
J'essaye

Dernière modification par roger64 (Le 26/01/2013, à 08:42)

Hors ligne

#20 Le 26/01/2013, à 08:48

roger64

Re : [résolu] Créer une liste de noms à partir d'un odt

Pardonne-moi si je réagis comme un béotien. smile

grep -oe "[[:alpha:]]\+[-’][[:alpha:]'-]*[[:alpha:]]\+" hussarde.txt | sort -u > hussarde7.txt

règle bien le problème et produit la liste traits-d'union (+) et apostrophes (+).

Question résolue. Merci beaucoup. Je continue les tests mais ça sent la ligne d'arrivée... Maintenant, les questions techniques étant résolues, il ne s'agit que de trouver la formule la plus pratique pour l'utilisateur pressé (celui qui veux couper au plus court) mais aussi pour l'utilisateur soupçonneux (celui qui n'y croit pas et qui veut tout voir). Donc, une solution simple + une option.

Je dois aussi penser  à la question du traitement par lot. Je cherche à enregistrer d'un seul coup une liste de noms dans le dictionnaire utilisateur hunspell. Ce dictionnaire est très basique et ne reconnait pas les formes fléchies. Il faut donc rentrer parapluie et parapluies. Heureusement, il ne s'agit pas de verbes... Le man hunspell n'est pas explicite à ce sujet. Il prévoit l'enregistrement au coup par coup, mais si j'ai deux mille mots avec apostrophe... Je vais poser la question sur le forum approprié.

Dernière modification par roger64 (Le 26/01/2013, à 09:18)

Hors ligne

#21 Le 26/01/2013, à 15:42

nesthib

Re : [résolu] Créer une liste de noms à partir d'un odt

@roger64 : oui ma ligne ne faisait que l'extraction des mots wink mais, comme tu le vois, tu as résolu tout seul la question du tri et des doublons tongue (je ne l'ai pas précisé car tu en parlais déjà avant avec pingouinux)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#22 Le 27/01/2013, à 02:42

roger64

Re : [résolu] Créer une liste de noms à partir d'un odt

nesthib a écrit :

comme tu le vois, tu as résolu tout seul la question du tri et des doublons tongue

N'est-ce pas? Pas mal pour un débutant... (bon, je tousse un peu.) Mais j'ai encore une toute dernière question.

D'abord je constate que le choix de fichiers txt est tout à fait judicieux parce que le dictionnaire utilisateur hunspell est tout simplement un document texte brut (text-plain) 

~/.hunspell_fr_FR

, ce qui simplifie énormément les choses. Il importe que les noms soient rangés par ordre alphabétique, cela tombe bien, c'est exactement comme ils sont produits par le script.. Le système permet donc de rajouter le nouveau vocabulaire provenant de livres complets à ce dictionnaire utilisateur (sous réserve de validation, bien sûr) de façon très très rapide. Non seulement on évite la fenêtre de dialogue pour la correction mais en prime on est ô combien plus efficace pour peupler le dictionnaire utilisateur...

Voici donc la questionsmile

Si je produis un fichier

hussard.txt 

contenant quelques centaines de mots rangés par ordre alphabétique, quelle est la commande la plus élégante/efficace pour fusionner et ranger ces mots dans le fichier 

~/.hunspell_fr_FR

?

Dernière modification par roger64 (Le 27/01/2013, à 02:46)

Hors ligne

#23 Le 27/01/2013, à 03:11

nesthib

Re : [résolu] Créer une liste de noms à partir d'un odt

Si j'ai bien compris ta demande :

cat fichier1 fichier2 | sort -u >ton_dictionnaire

attention si un des fichiers et ton_dictionnaire sont un seul et même fichier il faut procéder en deux étapes :

cat fichier1 ton_dictionnaire | sort -u >ton_dictionnaire.temp
mv ton_dictionnaire{.temp,} 

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#24 Le 27/01/2013, à 04:25

roger64

Re : [résolu] Créer une liste de noms à partir d'un odt

Bonjour

Désolé, je me suis mal expliqué.
Le fichier A est ce qui est produit par le script. Le fichier B est le dictionnaire. Je veux intégrer le contenu de A dans B et reclasser ensuite B.
Les deux fichiers sont au format txt. Je teste pour voir si j'ai compris. wink

Hors ligne

#25 Le 27/01/2013, à 04:36

nesthib

Re : [résolu] Créer une liste de noms à partir d'un odt

C'est bien ce que j'avais compris :

cat A B | sort -u >B.temp
mv B{.temp,} 

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne