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