Script bash
Le script bash élaboré suit le schéma suivant :

Vous trouverez ci-dessous le code dans son intégralité, ou vous pouvez le télécharger
ici.
Le programme s'exécute depuis notre répertoire de travail, qui contient les sous-répertoires suivants :
- ./URLS : répertorie les fichiers .txt correspondant à nos listes d'URLs,
- ./TABLEAUX : y est créée la page html contenant nos tableaux,
- ./PROGRAMMES : répertorie notre script principal, ainsi que trois autres programmes auxquels il fait appel :
- minigrepmultilingue : utilisé pour produire une version lisible et sympathique de nos contextes, dans une page html,
- stanford-segmenter : utilisé pour la tokenisation des dumps en arabe,
- detect-encoding : utilisé pour détecter l'encodage de l'URL dans le cas où la détection avec curl a échouée.
1 #!/user/bin/bash
2
3 #à partir de x fichiers txt contenant chacun une liste d'URLs, génère un fichier html avec x tableaux.
4
5 #le programme s'utilise comme ceci :
6 #bash ./PROGRAMMES/tableaux_URLs.sh ./URLS ./TABLEAUX/tableaux_URLS.html "anglicisme|anglicismes|anglicismo|anglicismi|anglismo|anglismi|inglesismo|inglesismi|الدخيل|الانجليزي|نكلزة"
7
8 #premier agument du programme : input : $1 le répertoire URLS qui contient tous les fichiers d'URLs .txt
9 dossierURL=$1;
10 #deuxième argument du programme : output : $2 : le nom du tableau html
11 monTableau=$2;
12 #troisième argument du programme : motif : le mot pour lequel on recherche les occurrences
13 motif=$3;
14
15 #écriture du début du fichier HTML
16 echo "<html><head><meta charset=\"UTF-8\"/><title>TABLEAUX URLS</title></head><body>" > $monTableau;
17
18 #première boucle : pour chaque fichier d'URL
19 compteurTableau=1; #déclaration-initialisation de la variable compteurTableau qui va compter le nb de fichiers
20 for fichier in $(ls $dossierURL)
21 do
22 #On crée un nouveau tableau pour chaque fichier d'URLs
23 echo "<table align=center border=1 width=100%>" >> $monTableau #début du tableau
24 echo "<tr bgcolor = #3CA9D1><th colspan=\"11\"TABLEAU NUMERO $compteurTableau</th></tr>" >> $monTableau #titre du tableau
25 #1ère ligne du tableau avec les intitulés de nos colonnes
26 echo "<tr bgcolor = #84E3F7><td>NUMERO URL</td>
27 <td>HTTP</td>
28 <td>ENCODAGE</d>
29 <td>URL</td>
30 <td>PAGE ASPIREE</td>
31 <td>DUMP</td>
32 <td>OCCURRENCES MOTIF</td>
33 <td>CONTEXTES TXT</td>
34 <td>CONTEXTES HTML</td>
35 <td>INDEX HIERARCHIQUE</td>
36 <td>BIGRAMMES</td></tr>" >> $monTableau;
37
38 #deuxième boucle : lecture du fichier ligne par ligne
39 compteur=1; #déclaration-initialisation de la variable compteur
40 #pour chaque ligne du fichier d'URLS, càd pour chaque URL, on crée une ligne dans le tableau
41 while read ligne
42 do
43 #on veut aspirer les URLS et on les sauvegarde dans le répertoire PAGES-ASPIREES
44 #d'abord, il faut s'assurer que la commande curl se passe bien
45 #on crée une variable codeHttp qui va récupérer le code retour fourni par http_code généré par curl
46 #on utilise -s et -L pour suivre les redirections
47 codeHttp=$(curl $ligne -s -L -o ./PAGES-ASPIREES/">$compteurTableau-$compteur".html -w %{http_code});
48
49 #on teste la valeur de codeHttp
50 #si cette valeur est 200 : tout se passe bien. Sinon, on ne peut pas récupérer la page aspirée
51 if [[ $codeHttp == 200 ]]
52 then
53 #on s'assure ensuite que l'URL est bien encodé en UTF-8
54 #pour cela, on isole la valeur du charset de l'URL et on la stocke dans une variable
55 #il faut récupérer le 2ème champ
56 encodageURL=$(curl -I $ligne | egrep -i "charset" | cut -f2 -d= | tr [a-z] [A-Z] | tr -d "\r");
57
58 #on teste la valeur de encodageURL
59 #si l'encodage est bien UTF-8 : on peut récupérer la page aspirée et remplir le tableau
60 if [[ $encodageURL == "UTF-8" ]]
61 then
62
63 # ********************* CodeHttp 200 + encodage UTF-8 ---> TRAITEMENTS *********************
64
65 # 1. Dump
66 #on récupère le contenun textuel de la page via la commande lynx
67 #on exécute lynx sur la page aspirée, pas sur l'URL (car certains sites nous empêchent de récupérer leur contenu textuel avec lynx)
68 #on stocke les dumps dans le répertoire DUMP-TEXT
69 lynx -dump -nolist -assume_charset="UTF-8" -display_charset="UTF-8" ./PAGES-ASPIREES/"$compteurTableau-$compteur".html > ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt;
70
71 # 2. Tokenisation (traitement supplémentaire pour les URLs en arabe uniquement)
72 if [[ $fichier == "urls_3_arabe.txt" ]]
73 then
74 java -cp ./PROGRAMMES/stanford-segmenter/stanford-segmenter-4.2.0.jar -mx1g edu.stanford.nlp.international.arabic.process.ArabicSegmenter -loadClassifier ./PROGRAMMES/stanford-segmenter/data/arabic-segmenter-atb+bn+arztrain.ser.gz -textFile ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt > ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8-tk.txt
75 mv ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8-tk.txt ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt
76 fi;
77
78 # 3. Nombre d'occurrences de notre motif
79 #on stocke ce nombre dans la variable compteur_motif
80 compteur_motif=$(egrep -o -i $motif ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt | wc -l);
81
82 # 4. Contextes avec egrep
83 #Méthode 1 : egrep : construire des morceaux de corpus
84 egrep -C 2 -i "$motif" ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt > ./CONTEXTES/"$compteurTableau-$compteur".txt;
85
86 # 5. Contextes HTML avec minigrep
87 perl ./PROGRAMMES/minigrepmultilingue/minigrepmultilingue.pl "UTF-8" ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt ./PROGRAMMES/minigrepmultilingue/motif-regexp.txt;
88 #3 arguments du programme minigrepmultilingue.pl : l'encodage + le fichier + le motif
89 #Attention le motif à chercher doit être indiqué dans le fichier motif-regexp.txt sous forme d'expression régulière !
90 #Attention il faut "sauvegarder" le résultat
91 mv resultat-extraction.html ./CONTEXTES/"$compteurTableau-$compteur".html;
92
93 # 6. Index hiérarchique
94 egrep -i -o "\w+" ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt | sort | uniq -c | sort -n -r -s -k 1,1 > ./DUMP-TEXT/"$compteurTableau-$compteur"-index.txt;
95
96 # 7. Bigrammes (séquence de 2 mots consécutifs)
97 tr " " "\n " < ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt | tr -s "\n" | egrep -v "^$" > index1.txt;
98 tail -n +2 index1.txt > index2.txt;
99 paste index1.txt index2.txt | sort | uniq -c | sort -r -n -s -k 1,1 > ./DUMP-TEXT/"$compteurTableau-$compteur"-bigramme.txt
100
101 # ------------> On peut remplir toutes les lignes du tableau
102 echo "<tr><td>$compteur</td>
103 <td>$codeHttp</td>
104 <td>$encodageURL</td>
105 <td><a target=\"_blank\" href=\"$ligne\">$ligne</a></td>
106 <td><a target=\"_blank\" href=\"../PAGES-ASPIREES/$compteurTableau-$compteur.html\">Page aspirée $compteur</a></td>
107 <td><a target=\"_blank\" href=\"../DUMP-TEXT/$compteurTableau-$compteur-dump-utf8.txt\">Dump $compteur</a></td>
108 <td>$compteur_motif</td>
109 <td><a target=\"_blank\" href=\"../CONTEXTES/$compteurTableau-$compteur.txt\">Contexte txt $compteur</a></td>
110 <td><a target=\"_blank\" href=\"../CONTEXTES/$compteurTableau-$compteur.html\">Contexte html $compteur</a></td>
111 <td><a target=\"_blank\" href=\"../DUMP-TEXT/$compteurTableau-$compteur-index.txt\">Index $compteur</a></td>
112 <td><a target=\"_blank\" href=\"../DUMP-TEXT/$compteurTableau-$compteur-bigramme.txt\">Bigramme $compteur</a></td>
113 </tr>" >> $monTableau;
114
115 else
116 #code http = 200 OK mais encodage PAS UTF-8
117
118 #est ce que curl a récupéré quelque chose ?
119 #si curl a récupéré quelque chose (une chaîne non-vide), il faut vérifier si cette chaîne de caractère récupérée est effectivement un bon encodage
120 if [[ $encodageURL != "" ]]
121 then
122 #on utilise iconv, l'option -l (--list) renvoie la liste de tous les encodages connus
123 response=$(iconv -l | egrep "\b$encodageURL\b");
124 if [[ $response != "" ]]
125 #si l'encodage est bien dans la liste iconv
126
127 # ********************* CodeHttp 200 + encodage récupéré par curl ---> TRAITEMENTS *********************
128
129 then
130 # 1. Dump
131 # Attention on effectue le lynx dans la valeur de l'encodage
132 lynx -dump -nolist -assume_charset="$encodageURL" -display_charset=$encodageURL" ./PAGES-ASPIREES/"$compteurTableau-$compteur".html > ./DUMP-TEXT/"$compteurTableau-$compteur"-dump.txt;
133
134 # 1bis. Conversion du dump en UTF-8
135 iconv -f $encodageURL -t UTF-8 ./DUMP-TEXT/"$compteurTableau-$compteur"-dump.txt > ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt;
136
137 # 2. Tokenisation (traitement supplémentaire pour les URLs en arabe uniquement)
138 if [[ $fichier == "urls_3_arabe.txt" ]]
139 then
140 java -cp ./PROGRAMMES/stanford-segmenter/stanford-segmenter-4.2.0.jar -mx1g edu.stanford.nlp.international.arabic.process.ArabicSegmenter -loadClassifier ./PROGRAMMES/stanford-segmenter/data/arabic-segmenter-atb+bn+arztrain.ser.gz -textFile ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt > ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8-tk.txt
141 mv ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8-tk.txt ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt;
142 fi;
143
144 # 3. Nombre d'occurrences de notre motif
145 compteur_motif=$(egrep -o -i $motif ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt | wc -l);
146
147 # 4. Contextes avec egrep
148 egrep -C 2 -i "$motif" ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt > ./CONTEXTES/"$compteurTableau-$compteur".txt;
149
150 # 5. Contextes HTML avec minigrep
151 perl ./PROGRAMMES/minigrepmultilingue/minigrepmultilingue.pl "UTF-8" ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt ./PROGRAMMES/minigrepmultilingue/motif-regexp.txt;
152 mv resultat-extraction.html ./CONTEXTES/"$compteurTableau-$compteur".html;
153
154 # 6. Index hiérarchique
155 egrep -i -o "\w+" ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt | sort | uniq -c | sort -n -r -s -k 1,1 > ./DUMP-TEXT/"$compteurTableau-$compteur"-index.txt;
156
157 # 7. Bigrammes (séquence de 2 mots consécutifs)
158 tr " " "\n " < ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt | tr -s sort -r -n -s -k 1,1 > ./DUMP-TEXT/"\n" | egrep -v sort -r -n -s -k 1,1 > ./DUMP-TEXT/"^$" > index1.txt;
159 tail -n +2 index1.txt > index2.txt;
150 paste index1.txt index2.txt | sort | uniq -c | sort -r -n -s -k 1,1 > ./DUMP-TEXT/"$compteurTableau-$compteur"-bigramme.txt;
161
162 # ------------> On peut remplir toutes les lignes du tableau
163 echo "<tr><td>$compteur</td>
164 <td>$codeHttp</td>
165 <td bgcolor=#FDF08D>$encodageURL (détecté avec curl)</td>
166 <td><a target=\"_blank\" href=\"$ligne\">$ligne</a></td>
167 <td><a target=\"_blank\" href=\"../PAGES-ASPIREES/$compteurTableau-$compteur.html\">Page aspirée $compteur</a></td>
168 <td><a target=\"_blank\" href=\"../DUMP-TEXT/$compteurTableau-$compteur-dump-utf8.txt\">Dump $compteur</a></td>
169 <td>$compteur_motif</td>
170 <td><a target=\"_blank\" href=\"../CONTEXTES/$compteurTableau-$compteur.txt\">Contexte txt $compteur</a></td>
171 <td><a target=\"_blank\" href=\"../CONTEXTES/$compteurTableau-$compteur.html\">Contexte html $compteur</a></td>
172 <td><a target=\"_blank\" href=\"../DUMP-TEXT/$compteurTableau-$compteur-index.txt\">Index $compteur</a></td>
173 <td><a target=\"_blank\" href=\"../DUMP-TEXT/$compteurTableau-$compteur-bigramme.txt\">Bigramme $compteur</a></td>
174 </tr>" >> $monTableau;
175
176 else
177 # ------------> PROBLEME - encodage détecté par curl non connu
178 echo "<tr><td>$compteur</td>
179 <td>$codeHttp</td>
180 <td bgcolor=#E5AB55>$encodageURL (encodage non connu d'iconv)</td>
181 <td><a target=\"_blank\" href=\"$ligne\">$ligne</a></td>
182 <td>-</td>
183 <td>-</td>
184 <td>-</td>
185 <td>-</td>
186 <td>-</td>
187 <td>-</td>
188 <td>-</td></tr>" >> $monTableau;
189
190 fi;
191
192 #si curl a récupéré une chaîne vide ($encodageURL == "") : il faut détecter l'encodage d'une autre manière : on utilise le programme miracle detect-encodage
193 else
194 encodageExtrait=$(perl ./PROGRAMMES/detect-encoding.pl ./PAGES-ASPIREES/"$compteurTableau-$compteur".html | tr -d "\n" | tr -d "\r");
195 #on s'assure que la valeur récupérée par le programme est effectivement un bon encodage
196 #on procède de la même manière que lorsque l'encodage récupéré par curl n'est pas UTF-8 : avec iconv
197 response=$(iconv -l | egrep "\b$encodageExtrait\b");
198 if [[ $response != "" ]]
199 #si l'encodage est bien dans la liste iconv
200
201 # ********************* CodeHttp 200 + encodage récupéré par detect ---> TRAITEMENTS *********************
202
203 then
204 # 1. Dump
205 # Attention on effectue le lynx dans la valeur de l'encodage
206 lynx -dump -nolist -assume_charset="$encodageExtrait" -display_charset="$encodageExtrait" ./PAGES-ASPIREES/"$compteurTableau-$compteur".html > ./DUMP-TEXT/"$compteurTableau-$compteur"-dump.txt;
207
208 # 1bis. Conversion du dump en UTF-8
209 iconv -f $encodageExtrait -t UTF-8 ./DUMP-TEXT/"$compteurTableau-$compteur"-dump.txt > ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt;
210
211 # 2. Tokenisation (traitement supplémentaire pour les URLs en arabe uniquement)
212 if [[ $fichier == "urls_3_arabe.txt" ]]
213 then
214 java -cp ./PROGRAMMES/stanford-segmenter/stanford-segmenter-4.2.0.jar -mx1g edu.stanford.nlp.international.arabic.process.ArabicSegmenter -loadClassifier ./PROGRAMMES/stanford-segmenter/data/arabic-segmenter-atb+bn+arztrain.ser.gz -textFile ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt > ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8-tk.txt;
215 mv ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8-tk.txt ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt;
216 fi;
217
218 # 3. Nombre d'occurrences de notre motif
219 compteur_motif=$(egrep -o -i $motif ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt | wc -l);
220
221 # 4. Contextes avec egrep
222 egrep -C 2 -i "$motif" ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt > ./CONTEXTES/"$compteurTableau-$compteur".txt;
223
224 # 5. Contextes HTML avec minigrep
225 perl ./PROGRAMMES/minigrepmultilingue/minigrepmultilingue.pl "UTF-8" ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt ./PROGRAMMES/minigrepmultilingue/motif-regexp.txt;
226 mv resultat-extraction.html ./CONTEXTES/"$compteurTableau-$compteur".html;
227
228 # 6. Index hiérarchique
229 egrep -i -o "\w+" ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt | sort | uniq -c | sort -n -r -s -k 1,1 > ./DUMP-TEXT/"$compteurTableau-$compteur"-index.txt;
230
231 # 7. Bigrammes (séquence de 2 mots consécutifs)
232 tr " " "\n " < ./DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt | tr -s "\n" | egrep -v "^$" > index1.txt;
233 tail -n +2 index1.txt > index2.txt;
234 paste index1.txt index2.txt | sort | uniq -c | sort -r -n -s -k 1,1 > ./DUMP-TEXT/"$compteurTableau-$compteur"-bigramme.txt;
235
236 # ------------> On peut remplir toutes les lignes du tableau
237 echo "<tr><td>$compteur</td>
238 <td>$codeHttp</td>
239 <td bgcolor=#FDF08D>$encodageExtrait (détecté avec detect-encoding)</td>
240 <td><a target=\"_blank\" href=\"$ligne\">$ligne</a></td>
241 <td><a target=\"_blank\" href=\"../PAGES-ASPIREES/"$compteurTableau-$compteur".html\">Page aspirée $compteur</a></td>
242 <td><a target=\"_blank\" href=\"../DUMP-TEXT/"$compteurTableau-$compteur"-dump-utf8.txt\">Dump $compteur</a></td>
243 <td>$compteur_motif</td>
244 <td><a target=\"_blank\" href=\"../CONTEXTES/"$compteurTableau-$compteur".txt\">Contexte txt $compteur</a></td>
245 <td><a target=\"_blank\" href=\"../CONTEXTES/"$compteurTableau-$compteur".html\">Contexte html $compteur</a></td>
246 <td><a target=\"_blank\" href=\"../DUMP-TEXT/"$compteurTableau-$compteur"-index.txt\">Index $compteur</a></td>
247 <td><a target=\"_blank\" href=\"../DUMP-TEXT/"$compteurTableau-$compteur"-bigramme.txt\">Bigramme $compteur</a></td>
248 </tr>" >> $monTableau;
249
250 else
251 # ------------> PROBLEME - encodage détecté par detect-encoding non connu
252 echo "<tr><td>$compteur</td>
253 <td>$codeHttp</td>
254 <td bgcolor=#E5AB55>$encodageExtrait (encodage non connu d'iconv)</td>
255 <td><a target=\"_blank\" href=\"$ligne\">$ligne</a></td>
256 <td>-</td>
257 <td>-</td>
258 <td>-</td>
259 <td>-</td>
260 <td>-</td>
261 <td>-</td>
262 <td>-</td></tr>" >> $monTableau;
263 fi;
264 fi;
265 fi;
266
267 else
268 # PROBLEME de code http ---> On ne récupère aucune donnée de l'URL :-(
269 echo "<tr><td>$compteur</td>
270 <td bgcolor=#E5AB55>$codeHttp</td>
271 <td>-</td>
272 <td><a target=\"_blank\" href=\"$ligne\">$ligne</a></td>
273 <td>-</td>
274 <td>-</td>
275 <td>-</td>
276 <td>-</td>
277 <td>-</td>
278 <td>-</td>
279 <td>-</td></tr>" >> $monTableau;
280 fi;
281
282 compteur=$((compteur + 1)); #incrémentation --> lecture de la prochaine ligne d'URL
283 done < $dossierURL/$fichier #pour accéder au fichier input qui se trouve dans le sous-dossier, il faut redonner le chemin
284 echo "</table>" >> $monTableau; #fin du tableau
285 echo "<p><hr color=\"blue\"></p>" >> $monTableau
286 compteurTableau=$((compteurTableau + 1)) #incrémentation --> prochain fichier txt, prochain tableau
287 done;
288 echo "</body></html>" >> $monTableau; #fin de la page HTML
289 #fin du programme