I. EXTRAIRE CHAQUE MOT DU TEXTE DANS UN DICTIONNAIRE TRIÉ ET ORDONNÉ :
I.1) Remplacer les espaces par des retour-chariots
I.2) Conserver uniquement les chaînes de caractères qui sont des mots
I.3) Laisser passer seulement les lignes qui commencent et qui se terminent par une lettre
I.4) Trier les mots par ordre alphabétique
I.5) Supprimer les doublons de mots
I.6) Écrire le résultat dans le fichier dictionnaire.txt
II. COUPLER LES MOTS DU DICTIONNAIRE DEUX À DEUX :
II.1) Lire chaque ligne du fichier dictionnaire.txt, et faire : pour chaque ligne du fichier dictionnaire.txt écrire chaque ligne du fichier dictionnaire.txt.
II.2) Écrire le résultat dans le fichier dictionnaire_couples.txt
III. CALCUL DE LA FRÉQUENCE D'OCCURENCE DE CHAQUE COUPLE DE MOTS :
III.1) Remplacer chaque caractère espace par ###, et ajouter un retour chariot après chaque caractère de ponctuation terminant une phrase (.!?: ;) afin de faciliter le traitement. Écrire ce résultat dans le fichier texte1.txt
III.2) Lire chaque ligne du fichier dictionnaire_couples.txt, (correspondant à un couple de mots)
III.3) Écrire chaque ligne du fichier dictionnaire_couples.txt, (correspondant à un couple de mots)
III.4) Calculer la fréquence d'occurrence de chaque couple de mots dans le texte.txt (sur lequel on travail) et écrire le résultat à cotés du couple de mots correspondant.
III.5) Ignorer les couples de mots ayant une fréquence d'occurrence égale à zero.
III.6) Ordonner de manière décroissante les couples de mots en fonction de leurs fréquences d'occurrence.
III.7) Ordonner, au sein de chaque classe d'ordres de fréquences, les couples de mots de manière alphabétique.
I. EXTRAIRE CHAQUE MOT DU TEXTE DANS UN DICTIONNAIRE TRIÉ ET ORDONNÉ :
grep . texte.txt | sed "s/\ /\n/g" | sed "s/'/\n/g" | sed 's/\W//g' | grep '^[a-z]' | grep '[a-z]$' | sort | uniq > dictionnaire.txt
II. COUPLER LES MOTS DU DICTIONNAIRE DEUX À DEUX :
for i in `grep . dictionnaire.txt`; do for j in `grep . dictionnaire.txt`; do echo "$i $j" >> dictionnaire_couples.txt
III. CALCUL DE LA FRÉQUENCE D'OCCURENCE DE CHAQUE COUPLE DE MOTS :
grep . texte.txt | sed -e 's/\ /###/g; s/\n/###/g; s/\./\.\n/g; s/\!/\!\n/g; s/\?/\?\n/g; s/\:/\:\n/g; s/\;/\;\n/g' > texte1.txt;
for i in `awk '{print $0}' dictionnaire_couples.txt | sed -e "s/\ /###/g"`; do echo "$i:`grep $i -c texte1.txt`"; done | grep :0$ -v | sed -e 's/###/\ /g' | sort -t: -k2nr,2nr >RESULTAT.txt
COMPLÉMENTS et OPTIMISATION:
Il est possible d'optimiser cet algorithme en faisant un traitement préliminaire au texte.txt sur lequel nous travaillons :
_ nous pouvons retirer les « petits mots » du texte, comme par exemple les conjonctions de coordinations, de subordinations, les pronoms, les articles, etc ...
SCRIPT :
grep . texte.txt | sed -e 's/\ le\ /\ /g; s/\ la\ /\ /g; s/\ les\ /\ /g; s/\ un\ /\ /g; s/\ une\ /\ /g; s/\ du\ /\ /g; s/\ des\ /\ /g; s/\ mais\ /\ /g; s/\ ou\ /\ /g; s/\ est\ /\ /g; s/\ donc\ /\ /g; s/\ or\ /\ /g; s/\ ni\ /\ /g; s/\ car\ /\ /g; s/\ à\ /\ /g; s/\ dans\ /\ /g; s/\ et\ /\ /g; s/\ par\ /\ /g; s/\ y\ /\ /g; s/\ pour\ /\ /g; s/\ en\ /\ /g; s/\ vers\ /\ /g; s/\ avec\ /\ /g; s/\ de\ /\ /g; s/\ sans\ /\ /g; s/\ sous\ /\ /g; s/\ je\ /\ /g; s/\ tu\ /\ /g; s/\ il\ /\ /g; s/\ elle\ /\ /g; s/\ nous\ /\ /g; s/\ vous\ /\ /g; s/\ ils\ /\ /g; s/\ elles\ /\ /g; s/\ on\ /\ /g; s/\ mon\ /\ /g; s/\ ma\ /\ /g; s/\ son\ /\ /g; s/\ mien\ /\ /g; s/\ miènne\ /\ /g; s/\ leur\ /\ /g; s/\ leurs\ /\ /g; s/\ eux\ /\ /g; s/\ ce\ /\ /g; s/\ ça\ /\ /g; s/\ ces\ /\ /g; s/\ se\ /\ /g; s/\ sa\ /\ /g; s/\ ses\ /\ /g; s/\ qui\ /\ /g; s/\ que\ /\ /g; s/\ quoi\ /\ /g; s/\ quand\ /\ /g; s/\ ne\ //g; s/\ me\ //g; s/\ qu\ //g; s/\ cette\ //g; s/\ cet\b //g;s/\ si\ //g; s/\ quel\ //g; s/\ sur\ //g' > votre_nouveau_texte.txt;
-> cette ligne est à exécuter en premier avant tout autre traitement, après il sera nécessaire de renommer votre fichier votre_nouveau_texte.txt en texte.txt.
Version améliorée avec une interface graphique Zenity permettant le choix d'un fichier texte :
copiez et collez le code source suivant dans votre éditeur de texte préféré et enregistrez-le au format .sh
#!/bin/bash
#BOITE DE DIALOGUE
file=`zenity --file-selection --title "Choisissez votre fichier texte" --text "Choisissez votre fichier texte"`;
fichier=$file;
#grep . $fichier#I liste tous les mots de votre texte dans une colonne
echo "listage des mots du texte puis exclusion des petits mots";
grep . $fichier | sed "s/\ /\n/g" | sed "s/'/\n/g" | sed 's/\W//g' | grep '^[a-z]' | grep '[a-z]$' | sort | uniq | grep -iv ^'\(le\|la\|les\|un\|une\|du\|des\|mais\|ou\|est\|donc\|or\|ni\|car\|à\|dans\|et\|par\|y\|pour\|en\|vers\|avec\|de\|sans\|sous\|je\|tu\|il\|elle\|nous\|vous\|ils\|elles\|lui\|on\|mon\|ma\|son\|mien\|miènne\|leur\|leurs\|eux\|ce\|cet\|cette\|ça\|ces\|se\|sa\|ses\|qui\|que\|quoi\|quand\|quel\|lequel\|lesquels\|laquelle\|dont\|aux\|au\|ne\|si\|sur\|a\|z\|e\|r\|t\|y\|u\|i\|o\|p\|q\|s\|d\|f\|g\|h\|j\|k\|l\|m\|w\|x\|c\|v\|b\|n\)'$ >> $HOME/tmp_RS_1.txt;#II génération du couplage de chaque mot de la liste par association
echo "association de chaque mot par deux";
for i in `grep . $HOME/tmp_RS_1.txt`; do for j in `grep . $HOME/tmp_RS_1.txt`; do echo "$i $j" >> $HOME/dictionnaire_mots-couples.txt; done; done
#efface $HOME/tmp_RS_1.txt
echo "efface $HOME/tmp_RS_1.txt";
rm $HOME/tmp_RS_1.txt;#III calcul de fréquence d'association de mots
echo "calcul de fréquence de mots couplés dans le texte";
grep . $fichier | sed -e 's/\ le\ /\ /g; s/\ la\ /\ /g; s/\ les\ /\ /g; s/\ un\ /\ /g; s/\ une\ /\ /g; s/\ du\ /\ /g; s/\ des\ /\ /g; s/\ mais\ /\ /g; s/\ ou\ /\ /g; s/\ est\ /\ /g; s/\ donc\ /\ /g; s/\ or\ /\ /g; s/\ ni\ /\ /g; s/\ car\ /\ /g; s/\ à\ /\ /g; s/\ dans\ /\ /g; s/\ et\ /\ /g; s/\ par\ /\ /g; s/\ y\ /\ /g; s/\ pour\ /\ /g; s/\ en\ /\ /g; s/\ vers\ /\ /g; s/\ avec\ /\ /g; s/\ de\ /\ /g; s/\ sans\ /\ /g; s/\ sous\ /\ /g; s/\ je\ /\ /g; s/\ tu\ /\ /g; s/\ il\ /\ /g; s/\ elle\ /\ /g; s/\ nous\ /\ /g; s/\ vous\ /\ /g; s/\ ils\ /\ /g; s/\ elles\ /\ /g; s/\ on\ /\ /g; s/\ mon\ /\ /g; s/\ ma\ /\ /g; s/\ son\ /\ /g; s/\ mien\ /\ /g; s/\ miènne\ /\ /g; s/\ leur\ /\ /g; s/\ leurs\ /\ /g; s/\ eux\ /\ /g; s/\ ce\ /\ /g; s/\ ça\ /\ /g; s/\ ces\ /\ /g; s/\ se\ /\ /g; s/\ sa\ /\ /g; s/\ ses\ /\ /g; s/\ qui\ /\ /g; s/\ que\ /\ /g; s/\ quoi\ /\ /g; s/\ quand\ /\ /g; s/\ ne\ //g; s/\ me\ //g; s/\ qu\ //g; s/\ cette\ //g; s/\ cet\b //g;s/\ si\ //g; s/\ quel\ //g; s/\ sur\ //g' | sed -e 's/\ /###/g; s/\n/###/g; s/\./\.\n/g; s/\!/\!\n/g; s/\?/\?\n/g; s/\:/\:\n/g; s/\;/\;\n/g' > $HOME/texte1.txt;
echo "calcul de fréquence de mots couplés dans le texte";
#algo ordre decroissant
for i in `awk '{print $0}' $HOME/dictionnaire_mots-couples.txt | sed -e "s/\ /###/g"`; do echo "$i:`grep $i -c $HOME/texte1.txt`"; done | grep :0$ -v | sed -e 's/###/\ /g' | sort -t: -k2nr,2nr >$HOME/TABLE_RS2.txt;
#efface texte1
echo "efface texte1.txt";
rm $HOME/texte1.txt;
#efface $HOME/dictionnaire_mots-couples.txt
echo "efface $HOME/dictionnaire_mots-couples.txt";
rm $HOME/dictionnaire_mots-couples.txt;
echo "--- FIN ---";
gedit $HOME/TABLE_RS2.txt || nano $HOME/TABLE_RS2.txt;
Version Stable 1.0 officielle executable en extention .sh :
###################
#BOITE DE DIALOGUE
file=`zenity --file-selection --title "Choisissez votre fichier texte" --text "Choisissez votre fichier texte"`;
fichier=$file;
#grep . "$fichier"
nom=`zenity --entry --title="Ajouter une entrée" --text="Saisissez votre nom de fichier :"`;
echo "le fichier résultat sera nommé $HOME/"$nom"_TABLE_RS2.txt";
#I liste tous les mots de votre texte dans une colonne
echo "I listage des mots du texte puis exclusion des petits mots";
grep . "$fichier" | sed "s/\ /\n/g" | sed "s/'/\n/g" | sed 's/\W//g' | grep '^[a-z]' | grep '[a-z]$' | sort | uniq | grep -iv ^'\(le\|la\|les\|un\|une\|du\|des\|mais\|ou\|est\|donc\|or\|ni\|car\|à\|dans\|et\|par\|y\|pour\|en\|vers\|avec\|de\|sans\|sous\|je\|tu\|il\|elle\|nous\|vous\|ils\|elles\|lui\|on\|mon\|ma\|son\|ton\|ta\|te\|vos\|nos\|mien\|miènne\|me\|mes\|où\|leur\|leurs\|eux\|ce\|cet\|cette\|ça\|ces\|se\|sa\|ses\|qui\|que\|quoi\|quand\|quel\|lequel\|lesquels\|laquelle\|dont\|aux\|au\|ne\|si\|sur\|ceci\|cela\|ci\|celle\|celles\|ceux\|a\|z\|e\|r\|t\|y\|u\|i\|o\|p\|q\|s\|d\|f\|g\|h\|j\|k\|l\|m\|w\|x\|c\|v\|b\|n\)'$ >> $HOME/tmp_RS_1.txt;
#II génération du couplage de chaque mot de la liste par association
echo "II association de chaque mot par deux";
for i in `grep . $HOME/tmp_RS_1.txt`; do for j in `grep . $HOME/tmp_RS_1.txt`; do echo "$i $j" >> $HOME/dictionnaire_mots-couples.txt; done; done
#efface $HOME/tmp_RS_1.txt
echo "efface $HOME/tmp_RS_1.txt";
rm $HOME/tmp_RS_1.txt;
#III calcul de fréquence d'association de mots
echo "III 1) calcul de fréquence de mots couplés dans le texte : filtre";
grep . "$fichier" | sed -e 's/\ le\ /\ /g; s/\ la\ /\ /g; s/\ les\ /\ /g; s/\ un\ /\ /g; s/\ une\ /\ /g; s/\ du\ /\ /g; s/\ des\ /\ /g; s/\ mais\ /\ /g; s/\ ou\ /\ /g; s/\ est\ /\ /g; s/\ donc\ /\ /g; s/\ or\ /\ /g; s/\ ni\ /\ /g; s/\ car\ /\ /g; s/\ à\ /\ /g; s/\ dans\ /\ /g; s/\ et\ /\ /g; s/\ par\ /\ /g; s/\ y\ /\ /g; s/\ pour\ /\ /g; s/\ en\ /\ /g; s/\ vers\ /\ /g; s/\ avec\ /\ /g; s/\ de\ /\ /g; s/\ sans\ /\ /g; s/\ sous\ /\ /g; s/\ je\ /\ /g; s/\ tu\ /\ /g; s/\ il\ /\ /g; s/\ elle\ /\ /g; s/\ nous\ /\ /g; s/\ vous\ /\ /g; s/\ ils\ /\ /g; s/\ elles\ /\ /g; s/\ on\ /\ /g; s/\ mon\ /\ /g; s/\ ma\ /\ /g; s/\ son\ /\ /g; s/\ mien\ /\ /g; s/\ miènne\ /\ /g; s/\ leur\ /\ /g; s/\ leurs\ /\ /g; s/\ eux\ /\ /g; s/\ ce\ /\ /g; s/\ ça\ /\ /g; s/\ ces\ /\ /g; s/\ se\ /\ /g; s/\ sa\ /\ /g; s/\ ses\ /\ /g; s/\ qui\ /\ /g; s/\ que\ /\ /g; s/\ quoi\ /\ /g; s/\ quand\ /\ /g; s/\ ne\ //g; s/\ me\ //g; s/\ qu\ //g; s/\ cette\ //g; s/\ cet\b //g;s/\ si\ //g; s/\ quel\ //g; s/\ sur\ //g' | sed -e 's/\ /###/g; s/\n/###/g; s/\./\.\n/g; s/\!/\!\n/g; s/\?/\?\n/g; s/\:/\:\n/g; s/\;/\;\n/g' > $HOME/texte1.txt;
echo "III 2) calcul de fréquence de mots couplés dans le texte : cherche";
#algo ordre decroissant
for i in `awk '{print $0}' $HOME/dictionnaire_mots-couples.txt | sed -e "s/\ /###/g"`; do echo "$i:`grep $i -c $HOME/texte1.txt`"; done | grep :0$ -v | sed -e 's/###/\ /g'>$HOME/tmp_"$nom"_TABLE_RS2.txt;
grep . $HOME/tmp_"$nom"_TABLE_RS2.txt | sort -t: -k2nr,2nr >$HOME/"$nom"_TABLE_RS2.txt;
#efface $HOME/"tmp_$nom"TABLE_RS2.txt
echo "efface $HOME/tmp_"$nom"_TABLE_RS2.txt";
rm $HOME/tmp_"$nom"_TABLE_RS2.txt;
#efface texte1
echo "efface texte1.txt";
rm $HOME/texte1.txt;
#efface $HOME/dictionnaire_mots-couples.txt
echo "efface $HOME/dictionnaire_mots-couples.txt";
rm $HOME/dictionnaire_mots-couples.txt;
echo "--- FIN ---";
gedit $HOME/"$nom"_TABLE_RS2.txt || nano $HOME/"$nom"_TABLE_RS2.txt;###################




