Qui : nous sommes trois étudiant·e·s en première année de master « Traitement automatique des langues (TAL) » à l’INaLCO.
Quoi : Dans le cadre du cours « Programmation et projet encadré » de Serge Fleury et Pierre Magistry, nous avons mené à bien un projet qui consiste à analyser le comportement sémantique d’un mot dans un corpus multilingue en ligne. Nous avons choisi d’étudier le mot « kebab » en japonais, persan et turc.
Les principales questions auxquelles nous avons à répondre sont :
Durant la préparation du projet, nous avons tenu un blog de travail permettant de suivre les étapes de notre travail de programmation.
Bonne lecture !
La recherche a été effectuée via un moteur de recherche usuel paramétré pour privilégier les résultats en une langue donnée, par exemple le turc (Türkçe).
En première approche, ont été exclues de la recherche les pages de restaurants, à l’exception de celles (nombreuses) où il est question de dire des recettes de kebab. Souvent ces recettes s’accompagnent d’un discours historique, empreint de patriotisme régional (« chez nous voici comment on fait le kebab »). On retrouve des éléments de ce discours sur Wikipédia en version turque, ou sur certains dictionnaires collaboratifs.
Un second type de page, dont le contenu n’est finalement pas très éloigné, vient de la presse locale, nationale ou internationale : là encore, il est question de recettes, de particularités locales ou régionales, de fierté vis-à-vis du kebap comme plat « patriotique » et/ou mondialement apprécié.
Certaines pages enfin sont particulièrement intéressantes parce qu’elles abordent la question des litiges opposant certaines régions ou localités, chacune se prétendant patrie exclusive de tel ou tel type de kebap. Cela met en évidence les enjeux d'appellation d'origine, de certification et de légitimation qui traversent les usages sémantiques et discursifs relatifs aux aliments et à la cuisine en général.
#!/usr/bin/bash
for dump in $(ls *.txt);
do
echo $dump;
echo "<dump=\"$dump\">" >> concat-DUMPS.txt ;
cat $dump >> concat-DUMPS.txt ;
echo "</dump>" >> concat-DUMPS.txt ;
done
#!/usr/bin/bash
for contexte in $(ls *.txt);
do
cat $contexte >> concat-CONTEXTES.txt ;
done
#!/usr/bin/bash
# Shebang qui indique au système d'exploitation (type Unix) que le fichier est un script, et l'interpréteur de commandes utilisé.
# Commande d'exécution du script (à partir du répertoire-racine PROJET-MOT-SUR-LE-WEB) :
# bash ./PROGRAMMES/script-JP-PER-TR_2022.sh ./URLS ./TABLEAUX
# Motif dans les trois langues pour minigrepmultilingue :
# MOTIF=(ケバブ)|(.{0,5}کباب.{0,5})|((\w+ *){0,5} کباب (\w+ *){0,5})|((\w+ *){0,5}[[:punct:]]? (K|k)eba(b|p)(.*)( *\w+){0,5})
# Lancement du script : on veut que le programme récupère des informations, en les transformant en objets informatiques qu'il puisse ensuite manipuler. Il faut donc qu'il stocke les arguments dans des variables.
# Il faut commencer par créer deux variables pour informer le programme de la localisation des fichiers d'entrée (URLS) et de sortie (TABLEAUX) (remarque : il n'est pas obligatoire d'indiquer d'emblée au programme quel sera le répertoire de sortie, c'est un choix de programmation).
DOSSIER_URLS=$1
DOSSIER_TABLEAUX=$2
# Valider les arguments :
echo $DOSSIER_URLS;
echo $DOSSIER_TABLEAUX;
# Création de l'en-tête du fichier HTML :
echo "<html>
<head>
<meta charset=\"UTF-8\">
</head>
<body>
<h1> Brochette de kebab JP-PER-TR</h1>" > $DOSSIER_TABLEAUX/tableau.html ;
# Un seul chevron suffit ici car l'en-tête n'est créé qu'une fois. (Si la variable ne renvoie à aucune valeur, echo essaiera d'écrire à la racine du système de fichiers, ce qui est interdit sous Unix, donc "permission denied"...)
cptTableau=0; # Création un compteur de tableaux pour servir à la numérotation des fichiers
for fichier in $(ls $DOSSIER_URLS) ; do
# Création d'un compteur de lignes pour chaque liste d'URL, qu'il faudra incrémenter ; on le fait ici (dans la boucle for) afin de s'assurer que le compteur revienne à zéro à chaque changement de fichier.
compteur=0 ;
# Vérification de l'existence de listes d'URLS dans le fichier d'entrée
if [[ ! -e "$fichier" ]]
then
echo "$fichier existe" ;
# Incrémentation du compteur de tableaux
cptTableau=$((cptTableau+1)) ;
# Ouverture d'un boucle afin de parcourir successivement les trois domaines linguistiques représentés
# (chaque domaine appelant un traitement approprié pour l'encodage et la tokenization)
if [[ $fichier == "kebab-JP.txt" ]]
then
echo "Un peu de japonais pour commencer"
# cat ./URLS/kebab-JP.txt ;
# début de tableau
echo "<h2>En japonais</h2>
<table align=\"center\" border=\"1px\" bordercolor=gray>
<tr align=\"center\" backgroundcolor=grey bgcolor=\"#D6EAF8\">
<tr><td>Num.</td><td>HTTP</td><td>Encodage</td><td>URL</td><td>Page aspirée</td><td>Dump</td><td>Index</td><td>Trigrammes</td><td>Contextes</td></tr>" >> $DOSSIER_TABLEAUX/tableau.html ;
# traitement de chaque ligne du fichier d'URLS japonaises en cours
# lire chaque fichier du dossier
while read line; do
compteur=$(($compteur + 1)) ;
echo "Traitement de l'URL : $line" ;
# récupérer html et le mettre dans un fichier
# travailler avec line (l'url)
# vérification de l'accès à l'URL
codeHTTP=$(curl -L -w '%{http_code}\n' -o ./PAGES-ASPIREES/"$cptTableau-$compteur".html $line) ;
# test de code html: si 200, ok
if [[ $codeHTTP == 200 ]]
then
# une variable pour essayer de repérer l'encodage via CURL, effacer des retours de ligne | tr [A-Z] [a-z]
encodage=$(curl -L -I $line | egrep charset | cut -d "=" -f2 | tr -d '\r' | tr -d '\n' );
# mettre en place la détection de l'encodage
if [[ $encodage == 'UTF-8' ]] || [[ $encodage == 'utf-8' ]]; then
echo "UTF-8 ok" ;
else
echo "not UTF-8" ;
# read html to pick up the first charset in the text
encodage=$(cat ./PAGES-ASPIREES/"$cptTableau-$compteur".html | egrep -i -m1 'charset=.+\"' | sed -E 's/.+charset=//' | sed -E 's/"? ?\/?>.*//g' | sed 's/"//g' | tr -d '\r' | tr -d '\n' ) ;
echo "encodage est $encodage.";
# convert encode to utf8
iconv -f $encodage -t UTF-8//IGNORE ./PAGES-ASPIREES/"$cptTableau-$compteur".html > ./PAGES-ASPIREES/tmp.html ;
# rewrite encode in html tag
cat ./PAGES-ASPIREES/tmp.html | sed "s/$encodage/utf-8/g" > ./PAGES-ASPIREES/"$cptTableau-$compteur".html ;
fi
# récupérer les documents html et les mettre chaque fichier dans le dossier PAGES-ASPIREES
lynx -assume_charset="UTF-8" -display_charset="UTF-8" -dump -nolist ./PAGES-ASPIREES/""$cptTableau-$compteur"".html > ./DUMP-TEXT/"$cptTableau-$compteur".txt
# iconv utf to utf avec l'option ignore (to clean illegible characters)
iconv -f UTF-8 -t UTF-8//IGNORE ./DUMP-TEXT/"$cptTableau-$compteur".txt > ./DUMP-TEXT/tmp"$cptTableau-$compteur".txt
# renommer les fichiers
mv ./DUMP-TEXT/tmp"$cptTableau-$compteur".txt ./DUMP-TEXT/"$cptTableau-$compteur".txt
# Tokenization avec nettoyage des sauts de ligne
cat ./DUMP-TEXT/"$cptTableau-$compteur".txt | tr '\n' '&' | sed 's/& / /g' | tr '&' '\n' | tr -d ' ' | sed -E 's/([0-9a-zA-Z_\-\=\.:\/\?%\&]){15,}//g' | sed -E 's/(BUTTON)|(IFRAME)//g' | tr -s " " | tr -s "\n" | sed 's/^ +//g' > ./PREP-CORPUS/"$cptTableau-$compteur".txt;
echo "Page dumped";
###### Index with frequency:
###### Create frequency file & spaced file by a janome tokenizer ######
# frequency -> ./DUMP-TEXT/index-$cptTableau-$compteur.txt
# spaced text -> ./DUMP-TEXT/spacedText-$cptTableau-$compteur.txt
python3.8 ./PROGRAMMES/tokenizer.py
cat ./DUMP-TEXT/spacedText-"$cptTableau-$compteur".txt >> ./CONTEXTES/corpus.txt
###### Trigrams
###### read text and create 3 files (1 with all lines, 2 others without the first few lines), then paste them all to put side by side ######
# read file, replace multiple space to one space & space to line break
cat DUMP-TEXT/spacedText-"$cptTableau-$compteur".txt | tr -d '[、。]' | sed 's/ / /g' | tr ' ' '\n' > ./DUMP-TEXT/tmp-tritext1.txt;
# delete the first line(=1d, if the last:‘$d’)
cat ./DUMP-TEXT/tmp-tritext1.txt | sed '1d' > ./DUMP-TEXT/tmp-tritext2.txt;
cat ./DUMP-TEXT/tmp-tritext2.txt | sed '1d' > ./DUMP-TEXT/tmp-tritext3.txt;
paste ./DUMP-TEXT/tmp-tritext1.txt ./DUMP-TEXT/tmp-tritext2.txt ./DUMP-TEXT/tmp-tritext3.txt | sed '$d' | sed '$d' | sort | uniq -c | sort -nr > ./DUMP-TEXT/tritext-"$cptTableau-$compteur".txt;
echo "trigram done";
###### Context:
# Use minigrep to collect every occurence
perl ./minigrep/minigrepmultilingue.pl "utf-8" ./PREP-CORPUS/$cptTableau-$compteur.txt ./minigrep/motif.txt
if [ "$(ls *.html)" != '' ]; then
echo "Result moved to CONTEXTES"
mv resultat-extraction.html ./CONTEXTES/result-"$cptTableau-$compteur".html
else
echo 'Result Not Found'
fi
# construire les lignes du tableau
echo "<tr>
<td>$compteur</td>
<td>$codeHTTP</td>
<td>$encodage</td>
<td><a target ="blank" href=\"$line\">n°$compteur</a></td>
<td><a target ="blank" href=\"../PAGES-ASPIREES/$cptTableau-$compteur.html\">P-$cptTableau-$compteur<a/></td>
<td><a target ="blank" href=\"../DUMP-TEXT/$cptTableau-$compteur.txt\">Txt-$cptTableau-$compteur</a></td>
<td><a target ="blank" href=\"../DUMP-TEXT/index-$cptTableau-$compteur.txt\">Idx-$cptTableau-$compteur</a></td>
<td><a target ="blank" href=\"../DUMP-TEXT/tritext-$cptTableau-$compteur.txt\">Tri-$cptTableau-$compteur</a></td>
<td><a target ="blank" href=\"../CONTEXTES/result-$cptTableau-$compteur.html\">C-$cptTableau-$compteur</a></td>
</tr>" >> $DOSSIER_TABLEAUX/tableau.html ;
else
# Table in case unable to treat url
echo "<tr>
<td>$compteur</td>
<td>$codeHTTP</td>
<td><a href=\"$line\">$line</a></td>
<td>-</td>
<td>-</td>
<td>-</td>motif
<td>-</td>
<td>-</td>
<td>-</td>
</tr>" >> $DOSSIER_TABLEAUX/tableau.html ;
fi
# -> le lien relatif par rapport au DOSSIER_TABLEAUX
done < $DOSSIER_URLS/$fichier ; # préciser l'endroit
# fin du tableau et de la lecture du fichier, fermeture du tableau
echo "</table><hr/>" >> $DOSSIER_TABLEAUX/tableau.html ;
elif [[ $fichier == "kebab-PER.txt" ]]
then
echo "Un peu de persan pour continuer ?"
# Début de tableau
echo "<h2>En persan</h2>
<table align=\"center\" border=\"1px\" bordercolor=gray>
<tr align=\"center\" backgroundcolor=grey bgcolor=\"#D6EAF8\">
<td><b>No</b></td>
<td><b>Http Code</b></td>
<td><b>URL</b></td>
<td><b>Page Aspirée</b></td>
<td><b>Encodage</b></td>
<td><b>Text Dump</b></td>
<td><b>Text Propre</b></td>
<td><b>Index</b></td>
<td><b>B-gram</b></td>
<td><b>Contexte</b></td>
</tr>" >> $DOSSIER_TABLEAUX/tableau.html ;
while read line; do
compteur=$(($compteur + 1)) ;
# je peux travailler avec line (l'url)
# 1. Une variable pour vérifier si la connexion vers l'URL est OK
# pour USER Agent de curl = -H "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) Gecko/20100101 Firefox/94.0"
codeHTTP=$(curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0" -L -w '%{http_code}\n' -o ./PAGES-ASPIREES/"$cptTableau-$compteur".html $line);
if [[ $codeHTTP == 200 ]]
then
# 2. une variable pour essayer de repérer l'encodage via CURL
encodage=$(curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0" -L -I $line | egrep charset | cut -d"=" -f2 | tr -d '\r' | tr -d '\n');
# Mettre en place la détection de l'encodage
# et savoir si on est en UTF8 ou pas ??????
# si encodage = UTF8 alors on fait certains traitements
# sinon il faudra aussi les faire et probablement
echo $encodage
if [[ $encodage == 'UTF-8' ]]
then
# l'encodage est bien en UTF-8, on continue
texte=$(lynx -nolist -assume_charset ="$encodage " -display_charset "UTF-8" -dump ./PAGES-ASPIREES/"$cptTableau-$compteur".html);
echo "$texte" > ./DUMP-TEXT/$cptTableau-$compteur.txt
# index
echo "$texte" | grep -o -E "\w+" | sort | uniq -c | sort -nr | sed "s/[A-Za-z[:punct:]]//g" | sed "s/ //g" | sed "s/ \n //g" > ./DUMP-TEXT/Idx-"$cptTableau-$compteur".txt;
# Nettoyer le texte
echo "$texte" | tr '\n' '&' | sed 's/& \+/ /g' | tr '&' '\n' | sed "s/[A-Za-z0-9[:punct:]]//g" > ./PROPRE-TEXT/prop-"$cptTableau-$compteur".txt;
# Bigrammes
echo "$texte" | grep -o -E "\w+" | sort | uniq -u | sort -nr | sed "s/[A-Za-z[:punct:]]//g" | sed "s/ //g" | sed "s/ \n //g" | head -n -1 > ./BIGRAM/lst-"$cptTableau-$compteur".txt;
echo "$texte" | grep -o -E "\w+" | sort | uniq -u | sort -nr | sed "s/[A-Za-z[:punct:]]//g" | sed "s/ //g" | sed "s/ \n //g" | tail -n +2 > ./BIGRAM/lst2-"$cptTableau-$compteur".txt;
BG=$(paste BIGRAM/lst-"$cptTableau-$compteur".txt BIGRAM/lst2-"$cptTableau-$compteur".txt > ./BIGRAM/BG-"$cptTableau-$compteur".txt);
#Contextes
CT=$(echo "$texte" | tr '\n' '&' | sed 's/& \+/ /g' | tr '&' '\n' | sed "s/[A-Za-z0-9[:punct:]]//g" | grep -owP '.{0,20}کباب.{0,20}' > ./CONTEXTES/CT-"$cptTableau-$compteur".txt;);
#motif=$(echo "CT" grep -owP '.{0,10}کباب.{0,10}' > ./CONTEXTES/CT-"$cptTableau-$compteur")
# Affichage HTML des contextes
perl ./minigrep/minigrepmultilingue.pl "utf-8" ./DUMP-TEXT/$cptTableau-$compteur.txt ./minigrep/motif.txt ;
mv resultat-extraction.html ./CONTEXTES/contexte-$cptTableau-$compteur.html ;
else
echo "raté"
fi
# construire les lignes du tableau
echo "<tr>
<td align=\"center\" >$compteur</td>
<td align=\"center\" >$codeHTTP</td>
<td><a href=\"$line\">$line</a></td>
<td align=\"center\"><a href=\"../PAGES-ASPIREES/"$cptTableau-$compteur".html\"> $cptTableau-$compteur </a></td>
<td align=\"center\" >$encodage</td>
<td align=\"center\"><a href=\"../DUMP-TEXT/$cptTableau-$compteur.txt\"> "$cptTableau-$compteur" </a></td>
<td align=\"center\"><a href=\"../PROPRE-TEXT/prop-$cptTableau-$compteur.txt\"> "TP-$cptTableau-$compteur" </a></td>
<td align=\"center\"><a href=\"../DUMP-TEXT/Idx-$cptTableau-$compteur.txt\"> "Idx-$cptTableau-$compteur" </a></td>
<td align=\"center\"><a href=\"../BIGRAM/BG-$cptTableau-$compteur.txt\">"BG-$cptTableau-$compteur"</a></td>
<td align=\"center\"><a href=\"../CONTEXTES/CT-$cptTableau-$compteur.txt\">"CT-$cptTableau-$compteur"</a></td>
</tr> " >> $DOSSIER_TABLEAUX/tableau.html ;
else
# construire les lignes du tableau pour une URL inaccessible !
echo "<tr>
<td align=\"center\" >$compteur</td>
<td align=\"center\" >$codeHTTP</td>
<td><a href=\"$line\">$line</a></td>
<td align=\"center\" >-</td>
<td align=\"center\" >-</td>
<td align=\"center\" >-</td>
<td align=\"center\" >-</td>
<td align=\"center\" >-</td>
<td align=\"center\" >-</td>
<td align=\"center\" >-</td>
</tr>" >> $DOSSIER_TABLEAUX/tableau.html ;
fi
done < $DOSSIER_URLS/$fichier ;
# Fin du tableau (et de la lecture du fichier)
echo "</table><hr/>" >> $DOSSIER_TABLEAUX/tableau.html ;
else
echo "Et pour finir, un peu de turc." ;
# cat ./URLS/kebab-TR.txt ;
# Ouverture du tableau HTML :
echo "<h2>En turc</h2>
<table align=\"center\" border=\"1px\" bordercolor=blue>
<tr><td>#</td><td>HTTP</td><td>URL</td><td>Encodage</td><td>Page aspirée</td><td>Texte brut</td><td>Index</td><td>Bigrammes</td><td>Contxts</td><td>Contextes</td><td>Fréq. motif</td></tr>" >> $DOSSIER_TABLEAUX/tableau.html ;
# Pour lire chaque fichier d'URL
while read line; do
# Incrémentation du compteur d'URLS
compteur=$(($compteur+1)) ;
echo "Traitement de l'URL : $line"
# Vérification sur l'accessibilité de l'URL (préalable à son aspiration)
# Ajout du user-agent dans l'en-tête, précisant un nom de navigateur, afin de résoudre un code 403
codeHTTP=$(curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0" -L -w '%{http_code}\n' -o ./PAGES-ASPIREES/"$cptTableau-$compteur".html $line) ;
if [[ $codeHTTP == 200 ]]
then
encodage=$(curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0" -L -I $line | egrep charset | cut -d "=" -f2 | tr -d '\r' | tr -d '\n' | tr '[:lower:]' '[:upper:]') ;
# Nettoyage pour supprimer les caractères de fin de ligne et uniformisation en majuscule (pour correspondre à la norme d'iconv -l plus loin) afin que toutes les pages bien encodées soient prises en considération par la suite.
echo "Encodage lisible par curl : $encodage" ;
# Mise en place de la détection de l'encodage afin de savoir s'il s'agit d'UTF-8 ou non :
if [[ $encodage == "UTF-8" ]]
# Si l'encodage est UTF-8, aspiration sans conversion préalable :
then
lynx -assume_charset="utf-8" -display_charset="UTF-8" -nolist -dump ./PAGES-ASPIREES/"$cptTableau-$compteur".html > ./DUMP-TEXT/"$cptTableau-$compteur".txt ;
# Avec guillemets autour de la variable, pour préciser que l'intégralité du contenu de la variable forme bien un seul argument ; un chevron plutôt que deux (notamment pour le cas où l'on relancerait plusieurs fois le script et que cela créerait des copies multiples du même contenu dans les fichiers txt)
# Génération de l'index par token, avec egrep puis sort et uniq
# N.B. l'uniformisation en minuscule pour fusionner les doublons éventuels
cat ./DUMP-TEXT/"$cptTableau-$compteur".txt | tr '[:upper:]' '[:lower:]' | tr -s ' ' | egrep -o -E "\w+" | sort | uniq -c | sort -nr > ./DUMP-TEXT/"index-$cptTableau-$compteur".txt ;
# Index des bigrammes
# Création de fichiers temporaires (listes tronquées) avant fusion
egrep -o -E "\w+" ./DUMP-TEXT/"$cptTableau-$compteur".txt > all.txt ;
head -n -1 all.txt > croptail.txt ;
tail -n +2 all.txt > crophead.txt ;
# Commande paste pour fusionner ces deux fichiers
paste croptail.txt crophead.txt > ./DUMP-TEXT/"bigrammes-$cptTableau-$compteur".txt ;
rm all.txt croptail.txt crophead.txt ;
# Filtrage des contextes (TXT)
egrep -o -E "(\w+ *){0,5}[[:punct:]]? (K|k)eba(b|p)(.*)( *\w+){0,5}" ./DUMP-TEXT/"$cptTableau-$compteur".txt > ./CONTEXTES/"contxt-$cptTableau-$compteur".txt ;
# Fréquence du motif
freqmotif=$(egrep -coiE "(\w+ *){0,5}[[:punct:]]? (K|k)eba(b|p)(.*)( *\w+){0,5}" ./DUMP-TEXT/"$cptTableau-$compteur".txt) ;
# Affichage HTML des contextes
perl ./minigrep/minigrepmultilingue.pl "utf-8" ./DUMP-TEXT/$cptTableau-$compteur.txt ./minigrep/motif.txt ;
mv resultat-extraction.html ./CONTEXTES/contexte-$cptTableau-$compteur.html ;
# Ajout d'ancres HTML pour rendre les liens cliquables ; au moment de cette écriture on se situe dans /TABLEAUX d'où le chemin relatif
echo "<tr><td>$compteur</td><td>$codeHTTP</td><td><a href=\"$line\">$line</a></td><td>$encodage</td><td><a target="blank" href=\"../PAGES-ASPIREES/$cptTableau-$compteur.html\">"$cptTableau-$compteur".html</a></td><td><a target="blank" href=\"../DUMP-TEXT/$cptTableau-$compteur.txt\">"$cptTableau-$compteur".txt</td><td><a target="blank" href=\"../DUMP-TEXT/index-$cptTableau-$compteur.txt\">"idx-$cptTableau-$compteur"</td><td><a target="blank" href=\"../DUMP-TEXT/bigrammes-$cptTableau-$compteur.txt\">"bigrammes-$cptTableau-$compteur"</td><td><a target="blank" href=\"../CONTEXTES/contxt-$cptTableau-$compteur.txt\">"contxt-$cptTableau-$compteur"</td><td><a target="blank" href=\"../CONTEXTES/contexte-$cptTableau-$compteur.html\">"contexte-$cptTableau-$compteur"</td><td>$freqmotif</td></tr>" >> $DOSSIER_TABLEAUX/tableau.html ;
else
# Si l'encodage n'est pas UTF-8, il reste deux possibilités : curl a détecté une autre chaîne de caractères pour $encodage ; ou bien ne retourne qu'une chaîne de caractères vide.
# Si curl a détecté une chaîne de caractères non vide : aspiration après conversion préalable par iconv
if [[ $encodage != "" ]]
then
echo "Encodage non UTF-8 lisible par curl : $encodage" ;
# Vérifier que l'encodage détecté est connu de iconv (option -i pour éviter la casse) :
verifencodage=$(iconv -l | egrep -i "$encodage") ;
if [[ $verifencodage != "" ]]
then
echo "Encodage détecté conforme iconv : $verifencodage" ;
lynx -assume_charset=$encodage -display_charset=$encodage -nolist -dump ./PAGES-ASPIREES/"$cptTableau-$compteur".html > ./DUMP-TEXT/"$cptTableau-$compteur"-"$encodage".txt ;
iconv -f "$encodage" -t utf-8 ./DUMP-TEXT/"$cptTableau-$compteur"-"$encodage".txt > ./DUMP-TEXT/"$cptTableau-$compteur".txt ;
# Index des tokens
cat ./DUMP-TEXT/"$cptTableau-$compteur".txt | tr '[:upper:]' '[:lower:]' | tr -s ' ' | egrep -o -E "\w+" | sort | uniq -c | sort -nr > ./DUMP-TEXT/"index-$cptTableau-$compteur".txt ;
# Index des bigrammes
egrep -o -E "\w+" ./DUMP-TEXT/"$cptTableau-$compteur".txt > all.txt ;
head -n -1 all.txt > croptail.txt ;
tail -n +2 all.txt > crophead.txt ;
# Commande paste pour fusionner ces deux fichiers
paste croptail.txt crophead.txt > ./DUMP-TEXT/"bigrammes-$cptTableau-$compteur".txt ;
rm all.txt croptail.txt crophead.txt ;
# Filtrage des contextes (TXT)
egrep -o -E "(\w+ *){0,5}[[:punct:]]? (K|k)eba(b|p)(.*)( *\w+){0,5}" ./DUMP-TEXT/"$cptTableau-$compteur".txt > ./CONTEXTES/"contxt-$cptTableau-$compteur".txt
# Fréquence du motif
freqmotif=$(egrep -coiE "(\w+ *){0,5}[[:punct:]]? (K|k)eba(b|p)(.*)( *\w+){0,5}" ./DUMP-TEXT/"$cptTableau-$compteur".txt) ;
# Affichage HTML des contextes
perl ./minigrep/minigrepmultilingue.pl "utf-8" ./DUMP-TEXT/$cptTableau-$compteur.txt ./minigrep/motif.txt ;
mv resultat-extraction.html ./CONTEXTES/contexte-$cptTableau-$compteur.html ;
# Ajout d'ancres HTML pour rendre les liens cliquables ; au moment de cette écriture on se situe dans /TABLEAUX d'où le chemin relatif
echo "<tr><td>$compteur</td><td>$codeHTTP</td><td><a target="blank" href=\"$line\">$line</a></td><td>$encodage</td><td><a target="blank" href=\"../PAGES-ASPIREES/$cptTableau-$compteur.html\">"$cptTableau-$compteur".html</a></td><td><a target="blank" href=\"../DUMP-TEXT/$cptTableau-$compteur.txt\">"$cptTableau-$compteur".txt</td><td><a target="blank" href=\"../DUMP-TEXT/index-$cptTableau-$compteur.txt\">"idx-$cptTableau-$compteur"</td><td><a target="blank" href=\"../DUMP-TEXT/bigrammes-$cptTableau-$compteur.txt\">"bigrammes-$cptTableau-$compteur"</td><td><a target="blank" href=\"../CONTEXTES/contxt-$cptTableau-$compteur.txt\">"contxt-$cptTableau-$compteur"</td><td><a target="blank" href=\"../CONTEXTES/contexte-$cptTableau-$compteur.html\">"contexte-$cptTableau-$compteur"</td><td>$freqmotif</td></tr>" >> $DOSSIER_TABLEAUX/tableau.html ;
else
echo "Encodage détecté inconnu d'iconv" ;
fi
# Si curl n'a pas détecté de chaîne de caractères pour l'encodage :
else
echo "Encodage non UTF-8 illisible par curl" ;
detectencodage=$(perl ./PROGRAMMES/detect-encoding.pl ./PAGES-ASPIREES/"$cptTableau-$compteur".html | tr -d "\n" | tr -d "\r") ;
if [[ $detectencodage != "" ]]
then
verifencodage=$(iconv -l | egrep -i "$detectencodage") ;
if [[ $verifencodage != "" ]]
then
echo "Encodage détecté par detect-encoding.pl compatible iconv: $detectencodage";
lynx -assume_charset=$detectencodage -display_charset=$detectencodage -nolist -dump ./PAGES-ASPIREES/"$cptTableau-$compteur".html > ./DUMP-TEXT/"$cptTableau-$compteur"-"$detectencodage".txt ;
iconv -f "$detectencodage" -t utf-8 ./DUMP-TEXT/"$cptTableau-$compteur"-"$detectencodage".txt > ./DUMP-TEXT/"$cptTableau-$compteur".txt;
# Index des tokens
cat ./DUMP-TEXT/"$cptTableau-$compteur".txt | tr '[:upper:]' '[:lower:]' | tr -s ' ' | egrep -o -E "\w+" | sort | uniq -c | sort -nr > ./DUMP-TEXT/"index-$cptTableau-$compteur".txt ;
# Index des bigrammes
egrep -o -E "\w+" ./DUMP-TEXT/"$cptTableau-$compteur".txt > all.txt ;
head -n -1 all.txt > croptail.txt ;
tail -n +2 all.txt > crophead.txt ;
# Commande paste pour fusionner ces deux fichiers
paste croptail.txt crophead.txt > ./DUMP-TEXT/"bigrammes-$cptTableau-$compteur".txt ;
rm all.txt croptail.txt crophead.txt ;
# Filtrage des contextes (TXT)
egrep -o -E "(\w+ *){0,5}[[:punct:]]? (K|k)eba(b|p)(.*)( *\w+){0,5}" ./DUMP-TEXT/"$cptTableau-$compteur".txt > ./CONTEXTES/"contxt-$cptTableau-$compteur".txt
# Fréquence du motif
freqmotif=$(egrep -coiE "(\w+ *){0,5}[[:punct:]]? (K|k)eba(b|p)(.*)( *\w+){0,5}" ./DUMP-TEXT/"$cptTableau-$compteur".txt) ;
# Affichage HTML des contextes
perl ./minigrep/minigrepmultilingue.pl "utf-8" ./DUMP-TEXT/$cptTableau-$compteur.txt ./minigrep/motif.txt ;
mv resultat-extraction.html ./CONTEXTES/contexte-$cptTableau-$compteur.html ;
# Ajout d'ancres HTML pour rendre les liens cliquables ; au moment de cette écriture on se situe dans /TABLEAUX d'où le chemin relatif
echo "<tr><td>$compteur</td><td>$codeHTTP</td><td><a target="blank" href=\"$line\">$line</a></td><td>$encodage</td><td><a href=\"../PAGES-ASPIREES/$cptTableau-$compteur.html\">"$cptTableau-$compteur".html</a></td><td><a href=\"../DUMP-TEXT/$cptTableau-$compteur.txt\">"$cptTableau-$compteur".txt</td><td><a href=\"../DUMP-TEXT/index-$cptTableau-$compteur.txt\">"idx-$cptTableau-$compteur"</td><td><a href=\"../DUMP-TEXT/bigrammes-$cptTableau-$compteur.txt\">"bigrammes-$cptTableau-$compteur"</td><td><a target="blank" href=\"../CONTEXTES/contxt-$cptTableau-$compteur.txt\">"contxt-$cptTableau-$compteur"</td><td><a target="blank" href=\"../CONTEXTES/contexte-$cptTableau-$compteur.html\">"contexte-$cptTableau-$compteur"</td><td>$freqmotif</td></tr>" >> $DOSSIER_TABLEAUX/tableau.html ;
else
echo "Encodage détecté par detect-encoding.pl inconnu d'iconv : $detectencodage" ;
fi
else
echo "Aucun encodage détecté" ;
fi
fi
fi
fi
done < $DOSSIER_URLS/$fichier # redirection de flux entrant à partir d’un fichier
echo "</table>" >> $DOSSIER_TABLEAUX/tableau.html # Fermeture du tableau après la boucle sur la liste d'URLS/kebab-TR.
fi
fi
done
# Fin du fichier HTML
echo "</body></html>" >> $DOSSIER_TABLEAUX/tableau.html
exit;
#!/usr/bin/env python
#-*- coding: utf-8 -*-
from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.charfilter import *
from janome.tokenfilter import *
from re import sub, match
# Create filters
char_filters = [UnicodeNormalizeCharFilter(), # UnicodeをNFKC(デフォルト)で正規化
#RegexReplaceCharFilter('<.*?>', ''), # HTMLタグを削除
#RegexReplaceCharFilter('[#!:;<>{}`^.,-=$/_\'"\[\]\|]', ''),
RegexReplaceCharFilter('<°c>', '℃')]
token_filters = [POSStopFilter('空白'), LowerCaseFilter(),
TokenCountFilter(att = "base_form", sorted = True)]
token_filter = [ # CompoundNounFilter(),名詞が連続する場合は複合名詞にする
POSStopFilter('空白'), LowerCaseFilter()]
# Create tokenizer
tokenizer = Tokenizer()
# Create analyzer with filters & tokenizer
analyzer1 = Analyzer(char_filters=char_filters, tokenizer=tokenizer, token_filters=token_filters)
analyzer2 = Analyzer(char_filters=char_filters, tokenizer=tokenizer, token_filters = token_filter)
for i in range(1, 51):
try:
with open(f"./PREP-CORPUS/1-{i}.txt", "r", encoding = 'utf-8') as src:
text = src.read()
# index: frequency using base forms
with open(f"./DUMP-TEXT/index-1-{i}.txt", "w", encoding = 'utf-8') as fp:
for k, v in analyzer1.analyze(text):
k = sub('[ 、。◎**✽※☆✦♪()()「」『』【】\"\”・“##!!??&::;;<><>»{}`^++.,-=$/_\'\"\[\]\|\r\n\d©]', '', str(k))
# k = sub(r'[a-z]{20,0}', '', str(k))
if k == "":
continue
fp.write('%d \t%s' % (v, k))
fp.write("\n")
# spaced text in surface forms to make corpus
with open(f"./DUMP-TEXT/spacedText-1-{i}.txt", "w", encoding = 'utf-8') as fp:
for word in analyzer2.analyze(text):
w = word.surface
w = sub('[ ◎**✽※☆✦♪【】\"\”・“❝❞’´\'##!!??&::;;<><>«»{}()()「」『』`^++.,-─=$/_\'\"\[\]\|©\r\n|\r|\n]', '', str(w))
# write in spacedText.file
if w != "":
fp.write(word.surface)
fp.write(" ")
# write in corpus.file if not stop word
p = word.part_of_speech.split(',')
# r'名詞|動詞|形容詞|副詞'以外
if match(p[0], r'記号|助詞|助動詞|接続詞'):
pass
else:
f.write(word.base_form)
f.write(" ")
except:
continue
Cliquez ici pour lire le fichier des tableaux produit en sortie du script.
L'essentiel du travail pour ce projet a porté sur la préparation du script, et les données utilisées reposent sur un échantillon de pages web à la représentativité limitée. Les résultats obtenus dans le contexte d'un tel « coup d'essai » n'égalent donc ni fiabilité ni portée ceux que livrerait l'étude approfondie d'un corpus plus systématiquement constitué.
L'utilisation du « nuage de mots » ne permet guère plus que la concrétisation d'hypothèses de travail.
Ainsi par exemple ci-dessous dans la version turque traduite en français, où le code couleur adopté (à partir de l'outil en ligne Word Art) symbolise : en vert, certains déclinaisons du nom donné au kebab ; en bleu, les termes de description matérielle et gustative du plat ; en violet, les termes de qualification des métiers et des façons de faire le kebab ; en rouge, certains des noms de lieu (quartier, ville, région, pays) invoqués pour qualifier voire légitimer une façon de faire.
Nuage de mots en Persan
Nuage de mots en japonais et traduction en français
L'outil en ligne iTrameur fournit d'utiles moyens de visualisation des concordances des termes recherchés... :
iTrameur sur le corpus persan
... ainsi que des cooccurrences de ces termes :
En japonais
Il est important de rappeler ici que le choix de nos URL de travail a lui-même été accompagné d'hypothèses préalables qui ont orienté la sélection. Il n'est par conséquent pas étonnant que les premiers relevés textométriques semblent (en partie au moins) confirmer ces mêmes hypothèses : prédominance d'un répertoire de préparation culinaire, accent sur la localité (ou la régionalité) et la dimension historique, enjeux de légitimation et de certification. Il faudra pousser plus loin l'analyse de données textuelles pour espérer sortir de la boucle dans laquelle la constitution des données elle-même nous a enfermés.
Megumi ADACHI, diplômée de sciences du langage
Matiullah AFZAL, diplômé de TAL
Marc AYMES, diplômé d'histoire, enseignant-chercheur (CNRS / EHESS)
© Serge Fleury / Université Sorbonne Nouvelle