Scripts
Pourquoi deux scripts ?
Nous avons décidé d’utiliser deux scripts pour réaliser notre projet, parce nous avons deux systèmes de langues : le chinois, et les langues qui se basent sur les caractères latins (le français et l’anglais). Le chinois a besoin d’un segmenteur de texte, puisque l’espace est absent entre les caractères.
Nous avons aussi deux systèmes d’exploitation : Mac OS et Windows. Certaines commandes ou certaines options d’une commande ne sont pas compatibles sur ces deux systèmes d'exploitation. Par exemple : grep -P n’existe pas sur mac, ainsi que head -n -1 pour supprimer la dernière ligne d’un texte. Donc, Chang a travaillé pour le chinois sur Mac et Salomé a travaillé pour l’anglais et le français sur Windows.
Les différences principales dans les deux scripts :
Le script qui travaille sur les urls chinois :
introduire un segmenteur stanford-segmenter
utiliser la commande iconv pour convertir les sites en encodage non utf-8 et les sites en utf-8 mais qui s’affiche de manière illisible(problème d’encodage impossible à résoudre avec lynx - - display_charset utf-8).
appeler une fonction python pour faire les fichiers contextes, qui capte la ligne précédente et la ligne suivante par rapport à la ligne sur laquelle se trouve un motif.
Le script qui travaille sur les urls anglais et français :
contrôle sur les arguments du programme : vérifier s’il y a bien deux arguments du type dossier : ./URL, ./Tableaux
contrôle sur les urls qui sont en mouvement (Code HTTP : 301 qui n'apparaît pas parmi les urls chinois)
pour faire les fichiers contextes, le script capte 10 mots avant et après un motif.
Script pour la langue chinoise
Le télécharger ici
#!/bin/bash
# pour lancer ce script :
# bash premierscript.sh <dossier URL> <dossier TABLEAUX>
# stocker les arguments dans des varaibles
# Il faut lire les données dans le dossier URLS
DOSSIER_URL=$1
# Il faut créer un fichier html dans le dossier TABLEAUX à partir des données du Dossier URLS
DOSSIER_TABLEAUX=$2
#fonction pour transformer les lettres majuscules en miniscules
tolower ()
{
echo $1 | tr '[:upper:]' '[:lower:]'
}
recuperer_texte_brut ()
{
lynx --assume_charset $1 --display_charset $1 --dump -nolist ./PAGES-ASPIREES/"$2".html > ./DUMP-TEXT/"$2".txt ;
iconv -f $1 -t UTF-8//IGNORE ./DUMP-TEXT/"$2".txt > ./DUMP-TEXT/"$2-utf8".txt ;
}
# Pour chaque fichier urls dans DOSSIER_URL
# Ecrire les premières lignes dans le fichier HTML tableau.html, en ajoutant un certain style au tableau
# Pour chaque fichier urls dans DOSSIER_URL
# Ecrire les premières lignes dans le fichier HTML tableau.html, en ajoutant un certain style au tableau
echo "<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
Liste des urls
</head>
<body>" > $DOSSIER_TABLEAUX/tableau.html
cptTableau=0
rm ./contatenate.txt
rm ./contatenate-contexte.txt
# lire chaque fichier d'url dans une boucle
for fichier in $(ls $DOSSIER_URL); do
echo $fichier
compteur=0
# compter les tableaux
cptTableau=$(($cptTableau+1))
# prendre le nom du fichier sans son extension pour afficher sur le tableau
nom_fichier="${fichier%%.*}"
# Créer un tableau pour chaque fichier d'url
# Les entêtes de tableaux
echo "<div class="titre">
<h4>$langue</h4>
</div><table><tr>
<th>Index</th>
<th>code HTTP</th>
<th>Encodage</th>
<th>Url</th>
<th>compte</th>
<th>Pages aspirée</th>
<th>DUMP</th>
<th>Liste Index</th>
<th>Bigramme</th>
<th>Contexte txt</th>
<th>Contexte html</th>
</tr>" >> $DOSSIER_TABLEAUX/tableau.html
# Boucle pour lire chaque ligne du $fichier
while read line; do
# Compter le nombre de url
compteur=$(($compteur+1)) ;
echo "< file=\"$compteur\" >" >> ./contatenate.txt ;
echo "< file=\"$compteur\" >" >> ./contatenate-contexte.txt
# 1. Une variable pour vérifier si la connexion vers l'URL est OK
# Aspirer les sites et les enregistrer localment dans le dossier ./PAGES-ASPIREES
fichier_curl=$cptTableau-$compteur
echo $fichier_curl
codeHTTP=$(curl -L -w '%{http_code}\n' -o ./PAGES-ASPIREES/"$fichier_curl".html $line)
# vérifier le code HTTP de l'url est bien 200
if [[ $codeHTTP == 200 ]]
then
#un variable pour essayer de repérer l'encodage via CURL
encodage=$(curl -I -L $line | egrep charset | cut -d"=" -f2 | tr -d '\r' | tr -d '\n' ) ;
#on n'arrive pas à récupérer l'encodage, il faut essayer d'obtenir l'encodage en cherchant dans l'ensemble de l'entête de html
if [[ $encodage == "" ]]
then
if [[ $(curl -i -L $line | egrep "charset"| cut -d"=" -f4 | cut -d'"' -f1) != "" ]]
then
# lorsque "charset" figure dans
encodage=$(curl -i -L $line | egrep "charset"| cut -d"=" -f4 | cut -d'"' -f1)
else
# lorsque "charset" figure dans
encodage=$(curl -i -L $line | egrep "charset"| cut -d'"' -f2)
# curl -i -L $line | egrep "charset"| grep -o -P "charset=[\'\"].*[\'\"]"
# sed -e 's/.*charset="\(.*\)".*/\1/'
fi
recuperer_texte_brut $encodage $fichier_curl
else
#si l'encodage est bien utf-8 ou autre encodage répondu par le serveur, on peut récuperer le texte brut et l'enregistrer en format .txt dans le dossier ./DUMP-TEXT/
# utiliser iconv pour supprimer certains caractères mal encodés.
recuperer_texte_brut $encodage $fichier_curl
fi
../stanford-segmenter-2020-11-17/segment.sh pku ./DUMP-TEXT/"$cptTableau-$compteur-utf8".txt UTF-8 0 | grep -v "[@【\*].*" > ./DUMP-TEXT/"$fichier_curl-utf8-segmente".txt
# le fichier concatenate
cat ./DUMP-TEXT/"$fichier_curl-utf8-segmente".txt >> ./contatenate.txt
# obtenir le nombre du motif "zen"
decompte=$(cat ./DUMP-TEXT/"$fichier_curl-utf8-segmente".txt | grep -c "禅" )
# le texte index
cat ./DUMP-TEXT/"$fichier_curl-utf8-segmente".txt | ggrep -o -P "[\p{Han}\p{L}]+" | sort -n | uniq -c | sort -r > ./DUMP-TEXT/"$fichier_curl-utf8-index".txt
# bigramme
cat ./DUMP-TEXT/"$fichier_curl-utf8-segmente".txt | ggrep -o -P "[\p{Han}\p{L}]+" > ./DUMP-TEXT/"$fichier_curl-utf8-list".txt
cat ./DUMP-TEXT/"$fichier_curl-utf8-list".txt | sed '1d' > ./DUMP-TEXT/"$fichier_curl-utf8-list-copy".txt
paste ./DUMP-TEXT/"$fichier_curl-utf8-list".txt ./DUMP-TEXT/"$fichier_curl-utf8-list-copy".txt | sed '$d' > ./DUMP-TEXT/"$fichier_curl-utf8-bigramme".txt
rm ./DUMP-TEXT/"$fichier_curl-utf8-list".txt
rm ./DUMP-TEXT/"$fichier_curl-utf8-list-copy".txt
# contexte html
perl ./minigrepmultilingue-v2.2-regexp/minigrepmultilingue.pl "UTF8" ./DUMP-TEXT/"$fichier_curl-utf8-segmente".txt ./minigrepmultilingue-v2.2-regexp/motif-regexp.txt ./CONTEXTES/"$cptTableau-$compteur-contexte.html"
# contexte txt
cat ./DUMP-TEXT/"$fichier_curl-utf8-segmente".txt | tr '\n' '&' | sed 's/& / /g' | tr '&' '\n' | sed 's/。/。\n/g' | sed 's/?/?\n/g' | grep -v "[@【\*].*" > ./CONTEXTES/"$fichier_curl-utf8".txt
python3 ./PROGRAMMES/contexte.py ./CONTEXTES/"$fichier_curl-utf8".txt ./CONTEXTES/"$fichier_curl-contexte".txt
rm ./CONTEXTES/"$fichier_curl-utf8".txt
cat ./CONTEXTES/"$fichier_curl-contexte".txt >> ./contatenate-contexte.txt
# Ecrire les numéros des urls et les urls ligne par ligne dans le fichier tableau.html
# ranger les valeurs correpondantes dans les différentes colonnes
echo "<tr><td>$compteur</td>
<td>$codeHTTP</td>
<td>$encodage</td>
<td>$line<</td>
<td>$cptTableau-$compteur</td>
<td>$cptTableau-$compteur</td>
<td>$decompte</td>
<td>$cptTableau-$compteur</td>
<td>$cptTableau-$compteur<</td>
<td>$cptTableau-$compteur</td>
<td>$cptTableau-$compteur">$cptTableau-$compteur</td></tr>" >> $DOSSIER_TABLEAUX/tableau.html ;
else
echo "<tr><td>$compteur</td><td>$codeHTTP</td>
<td>$line</td>
<td>-</td><td>$encodage</td></tr>" >> $DOSSIER_TABLEAUX/tableau.html ;
fi
# travailler l'url, attention le tiré bas ne fonctionne pas
curl -o ./PAGES-ASPIREES/"$cptTableau-$compteur".html $line
echo "</file>§" >> contatenate.txt ;
echo "</file>§" >> ./contatenate-contexte.txt
done < $DOSSIER_URL/$fichier
#fin du tableau html
echo "</table>" >> $DOSSIER_TABLEAUX/tableau.html
done
# fin du fichier html
echo "</body>
</html>" >> $DOSSIER_TABLEAUX/tableau.html
Script pour l'anglais et le français
Le télécharger ici
#!/usr/bin/bash
#-------------------------------------------------------
# pour lancer ce script:
# bash premierscript.sh <dossier URL> <dossier TABLEAUX>
#-------------------------------------------------------
# stocker les arguments dans des variables
DOSSIER_URL=$1 ;
DOSSIER_TABLEAUX=$2 ;
#fonction qui transforme les majuscules en minuscules
tolower ()
{
echo $1 | tr '[:upper:]' '[:lower:]'
}
#-------------------------------------------------------
# on vérifie s'il y a bien deux arguments et s'ils sont des dossiers existants
if [[ $# -eq 2 ]];
then
echo "Il y a bien deux arguments !"
if [[ -d $1 ]] && [[ -d $2 ]]
then
echo "Les deux arguments sont bien des dossiers !"
echo $DOSSIER_URL ;
echo $DOSSIER_TABLEAUX ;
#-------------------------------------------------------
# en-tête du fichier html
echo "<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
Liste des urls
</head>
<body>" > $DOSSIER_TABLEAUX/tableau.html
for fichier in $(ls $DOSSIER_URL); do
echo "Fichier lu : $fichier" ;
langue=$(echo $fichier | cut -d"." -f1 )
# on compte les tableaux
cptTableau=$(($cptTableau + 1)) ;
# on va aussi compter les URLs de chaque tableau
compteur=0 ;
# Pour chaque fichier => 1 tableau HTML
# Début de tableau
echo "<div class="titre">
<h4>$langue</h4>
</div><table><tr>
<th>Index</th>
<th>code HTTP</th>
<th>Encodage</th>
<th>Url</th>
<th>compte</th>
<th>Pages aspirée</th>
<th>DUMP</th>
<th>Liste Index</th>
<th>Bigramme</th>
<th>Contexte txt</th>
<th>Contexte html</th> >> $DOSSIER_TABLEAUX/tableau.html
# lire chaque fichier du dossier
while read line; do
compteur=$(($compteur + 1)) ;
#je crée mon fichier de concatenation des fichiers dump
echo "<file>" >>./DUMP-TEXT/concatdump-"$cptTableau".txt
echo "<file>" >>./CONTEXTES/concatcontexte-"$cptTableau".txt
# je peux travailler avec line (l'url)
# Deux variables pour essayer de repérer l'encodage et le code HTTP via CURL
info=$(curl -L -w 'Type:%{content_type} Code:%{response_code}\n' -o ./PAGES-ASPIREES/"$cptTableau-$compteur".html $line);
encodage=$(echo $info | egrep charset | cut -d"=" -f2 | cut -d" " -f1)
echo $encodage
code=$(echo $info | egrep Code | cut -d":" -f3 | tr -d '\n')
# On vérifie le code HTTP
if [[ $code == '200' ]]
then
#on vérifie si l'encodage est UTF-8
if [[ $encodage == '' ]]
then
if [[ $(curl -i -L $line | egrep "charset"| cut -d"=" -f4 | cut -d'"' -f1) ]]
then
encodage=$(curl -i -L $line | egrep "charset"| cut -d"=" -f4 | cut -d'"' -f1)
else
encodage=$(curl -i -L $line | egrep "charset" | cut -d'"' -f2)
fi
fi
#on transforme l'encodage en minuscule
encodage=$(tolower $encodage)
if [[ $encodage == 'utf-8' ]]
then
# l'encodage est bien en UTF-8, on continue
texte=$(lynx -nolist -assume_charset "UTF-8" -dump ./PAGES-ASPIREES/"$cptTableau-$compteur".html)
# echo "$texte" |
#on nettoie le texte : grep -v "[\*\#©\+o].*"
echo "$texte" |sed 's#zen#Zen#g' | grep -v "[@【\*].*" > ./DUMP-TEXT/"$cptTableau-$compteur".txt
decompte=$(cat ./DUMP-TEXT/"$cptTableau-$compteur".txt| grep -i -c "zen")
#on concatene les fichiers dump
echo "$texte" |sed 's#zen#Zen#g'|grep -v "[@【\*].*" >> ./DUMP-TEXT/concatdump-"$cptTableau".txt
# on affiche les unigrammes
echo "$texte" | grep -o -P "\p{L}+" | sort | uniq -c | sort -nr > ./DUMP-TEXT/index-$cptTableau-$compteur.txt
#on tokenise le texte dump pour avoir un mot par ligne
echo "$texte" | grep -o -P "\p{L}+" > ./DUMP-TEXT/token-$cptTableau-$compteur.txt
# on copie le texte dump en enlevant la première ligne de la copie
tail -n +2 ./DUMP-TEXT/token-$cptTableau-$compteur.txt > ./DUMP-TEXT/copie-$cptTableau-$compteur.txt
#on copie les deux fichiers côte à côte pour créer les bigrammes
paste ./DUMP-TEXT/token-$cptTableau-$compteur.txt ./DUMP-TEXT/copie-$cptTableau-$compteur.txt | head -n -1 > ./DUMP-TEXT/bigrammes-$cptTableau-$compteur.txt
#on crée les fichiers contextes au format txt
echo "$texte"| tr '\n' '&'| sed 's/& / /g'|tr '&' '\n'| grep -E -o -i "((\w+ +)|(\w+)|,|.|\"|\'|-){0,10}zen(( +\w+)|(\w+)|,|.|\"|\'|-){0,10}" |sed 's#zen#Zen#g'|grep -v "[@【\*_#+©].*" >./CONTEXTES/contexte-$cptTableau-$compteur.txt
cat ./CONTEXTES/contexte-$cptTableau-$compteur.txt >>./CONTEXTES/concatcontexte-"$cptTableau".txt
#option 2 : créer le fichier contexte html avec le programme minigrepmultilingue
perl ./PROGRAMMES/MINIGREP/minigrepmultilingue.pl "UTF-8" ./DUMP-TEXT/"$cptTableau-$compteur".txt ./PROGRAMMES/MINIGREP/motif-regexp.txt ./CONTEXTES/contexte-$cptTableau-$compteur.html
else
# l'encodage n'est pas UTF8 il faut faire quelque chose
echo "raté"
fi
# construire les lignes du tableau
echo "<tr><td>$compteur</td>
<td>$codeHTTP</td>
<td>$encodage</td>
<td>$line<</td>
<td>$cptTableau-$compteur</td>
<td>$cptTableau-$compteur</td>
<td>$decompte</td>
<td>$cptTableau-$compteur</td>
<td>$cptTableau-$compteur<</td>
<td>$cptTableau-$compteur</td>
<td>$cptTableau-$compteur">$cptTableau-$compteur</td></tr>" >> $DOSSIER_TABLEAUX/tableau.html ;
else
# construire les lignes du tableau pour une URL inaccessible !
echo "<tr><$compteur><td>$code</td><td>$line</td><td>-</td></tr<" >> $DOSSIER_TABLEAUX/tableau.html ;
fi
echo "</file>§" >>./DUMP-TEXT/concatdump-"$cptTableau".txt
echo "</file>§" >>./CONTEXTES/concatcontexte-"$cptTableau".txt
done < $DOSSIER_URL/$fichier ;
# Fin du tableau (et de la lecture du fichier)
echo "</table>" >> $DOSSIER_TABLEAUX/tableau.html ;
done ;
echo "</body>
</html>" >> $DOSSIER_TABLEAUX/tableau.html ;
exit;
else
echo "Les arguments doivent être des dossiers !"
exit;
fi
else
echo "Il faut deux arguments!"
exit;
fi