Un petit plus

Semaine exotique 4

Lors de la préparation d’un nuage de mots, on a remarqué que…

Ligne de commande pour la fréquence de mots

Il y a des mots qui sont comptés plusieurs fois différemment. S’agit-il des caractères différents ?
L’éditeur hexadécimal indique qu’ils sont bien identiques.

L’exécution de cette opération en partie a révélé le problème derrière ce phénomène.

Problème du japonais : Le système d’écriture est complexe.

En cas de langue comme le français

Les mots peuvent être classés en ordre alphabétique.

En cas de japonais

C’est bien compliqué…

  • ひらがな
  • カタカナ
  • alphabet
  • 漢字

2 types de syllabaires, l’alphabet latin et les kanjis. En outre les kanjis changent leur sons en fonction de contexte.

En effet la ligne de commande « sort » a donné l’ordre comme ci-dessous.

Exemple d’un résultat de sort

Solution : Précision de la langue

En ajoutant « LANG=ja_JP.Unicode » à la ligne de commande, on peut récupérer le résultat attendu.

Exemple d’un résultat de sort 2

Les mots sont bien comptés une seule fois.

Après un nettoyage des mots, nous avons créé un nuage de mots en japonais et sa traduction en français.



Petite amélioration sur l’encodage :

La ligne de commande curl ne peut pas récupérer l’encodage de tous les sites.

Ligne de commande Curl

curl is a tool to transfer data from or to a server, using one of the supported protocols (HTTP, HTTPS, FTP, FTPS, GOPHER, DICT, TELNET, LDAP or FILE). The command is designed to work without user interaction.

-i/–include : (HTTP) Include the HTTP-header in the output. The HTTP-header includes things like server-name, date of the document, HTTP-version and more…

Manuel : https://www.mit.edu/afs.new/sipb/user/ssen/src/curl-7.11.1/docs/curl.html

Afin de voir d’où vient la différence des sites avec ou sans encodage, nous avons comparer les deux résultats de la commande « curl -L -I ».

Site avec encodage

Pour le site avec encodage, curl récupère l’information d’encodage, « charset ».

Site sans encodage

En revanche, pour le site sans encodage, il n’y a pas de l’information sur « charset ».

Donc on ne peut pas avoir l’encodage avec « curl -L -I ».

Solution :
Récupération de l’encodage à partir de la ligne de html.

Ligne de commande curl


Pour les html qui ne sont pas en UTF-8, l’exécution de iconv afin de convertir en UTF-8, puis sed -e pour modifier le html.

Voici le tableau avec l’information encodage complète.

N-grammes

Semaine exotique 3

« A bigram or digram is a sequence of two adjacent elements from a string of tokens, which are typically letters, syllables, or words. A bigram is an n-gram for n=2. »

– WIKIPEDIA –

Un bigramme et sa fréquence peuvent servir à certaines mesures d’association lexicale.

Problème du japonais : L’ordre des mots japonais ne permet pas de recueillir des bigrammes significatifs.

Exemple des bigrammes bitext-1-1.txt

Dans cet exemple ci-dessus, parmi les 18 bigrammes les plus attestés dans un texte, il n’y a aucune paire sujet – verbe ou nom – adjectif. Ce sont des paires particule – particule, nom – particule, verbe – auxiliaire ou nom composé.

L’ordre de mots canonique en japonais est sujet – objet – verbe, et le groupe verbal est le dernier élément de la phrase :

ケバブ は、世界 三 大 料理 に も 数え られる トルコ 料理の 一つ です。
Kebab P. monde 3 grand cuisine P. P. compter PASSIF Turquie cuisine P. 1 être

1-2.txt (https://rjmnp650.wixsite.com/kebab-japan-hp)

Les arguments du prédicat sont suivis par une particule casuelle. Il y a presque toujours une particule autours des verbes et des noms. La recherche de bigrammes ne sera pas intéressante en terme de l’association lexicale.

Solution :

3-grammes

Exemple des trigrammes tritext-1-1.txt

On obtient des 3-grammes verbe – auxiliaire – nom, objet (nom -particule) – verbe, ce qui est plus intéressant du point de vue lexical et syntaxique. Ainsi nous avons récupérer :

  • brochette de Kebab cuite
    串焼き の ケバブ
  • mettre en brochette
    串 に 刺し
  • chose cuite
    焼い た もの

Traitement des mots

Semaine exotique 2

Problème du japonais : L’absence de délimiteurs clairs aux limites des mots

Exemple de texte japonais (DUMP1-1.txt)

En cas des langues comme le français :

L’extraction des mots se fait par l’intermédiaire des espaces.



En cas du japonais :

Lors de l’extraction des mots, il est impératif de faire l’analyse morpho-syntaxique des éléments de la phrase. Pour ce faire, nous utilisons un outil de tokenizer « Janome. »

Janome : Un analyseur morphologique et tokenizeur encapsulé par dictionnaire écrit en Pure Python.
Janome v0.4 documentation (en) : https://mocobeta.github.io/janome/en/

Usage :

Exemple : tokenization (Extrait du site officiel)

Janome dispose de plusieurs analyses de filtration.

Exemple : filtrage (Extrait du site officiel)

Grâce à ces filtrations nous pouvons nettoyer le texte en même temps que le segmenter.

Afin d’executer ce script python, il suffit de mettre le code ci-dessous dans le script principal.

script.sh

Résultat :

Les mots sont séparés avec un espace.

Texte espacé (spacedText-1-1.txt)

Chaque mot est affiché avec son nombre d’occurrence.

Occurrences (index-1-1)

Petit remarque :

Les mots les plus fréquents sont des particules et conjonctions, ceux qui sont vides ( 9/16 dans l’exemple ci-dessus.) Si on les enlève avec janome, le résultat peut être plus intéressant.

Convertir le texte des pages aspirées en UTF-8 (deuxième tentative)

Semaine 9

Schéma directeur :

Source : Serge Fleury / iCampus Sorbonne Nouvelle

La boucle « if » de notre première tentative, ainsi que Serge Fleury nous en avertissait en commentaire, était loin de traiter tous les cas de figure. Voici donc un nouvel essai distinguant plus précisément les traitements possibles.

Cas de figure 1 : encodage UTF-8 détecté d’emblée

if [[ $encodage == 'utf-8' ]]
	then
		texte=$(lynx -assume_charset "utf-8" -nolist -dump ./PAGES-ASPIREES/"$cptTableau-$compteur".html) ;
		echo "$texte" > ./DUMP-TEXT/"$cptTableau-$compteur".txt ; 

Cas de figure 2 : encodage non UTF-8, et curl a détecté une autre chaîne de caractères pour la variable $encodage

else
# 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 :
		verifencodage=$(iconv -l | egrep "$encodage") ;
		if [[ $verifencodage != "" ]]
			then
			echo "Encodage détecté conforme iconv : $verifencodage" ;
			texte=$(lynx -nolist -dump ./PAGES-ASPIREES/"$cptTableau-$compteur".html | iconv -f "$verifencodage" -t utf-8) ;
			echo "$texte" > ./DUMP-TEXT/"$cptTableau-$compteur".txt ; 
		else
			echo "Encodage détecté inconnu d'iconv"
		fi

Cas de figure 3 : encodage non UTF-8, et curl ne détecte aucune autre chaîne de caractères pour la variable $encodage

	else
		echo "Encodage non UTF-8 illisible par curl" ;
		detectencodage=$(./PROGRAMMES/detect-encoding.exe ./PAGES-ASPIREES/"$compteur_tableau-$compteur".html | tr -d "\n" | tr -d "\r") ; 
		echo "Encodage détecté : $detectencodage";
		verifencodage=$(iconv -l | egrep "$detectencodage") ;
		echo "Encodage détecté : $verifencodage";
		texte=$(lynx -nolist -dump ./PAGES-ASPIREES/"$cptTableau-$compteur".html | iconv -f "$verifencodage" -t utf-8) ;
		echo "$texte" > ./DUMP-TEXT/"$cptTableau-$compteur".txt ; 
	fi

Le résultat comporte encore certaines curiosités ou anomalies sur lesquelles nous devrons revenir… Par exemple ceci (cas de figure 2) :

Traitement de l'URL : http://www.radikal.com.tr/turkiye/bitmeyen-kavga-kebap-nereli-608795/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 79057  100 79057    0     0  46205      0  0:00:01  0:00:01 --:--:-- 46205
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0 79057    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
Encodage lisible par curl : ISO-8859-9
Encodage non UTF-8 lisible par curl : ISO-8859-9
Encodage détecté conforme iconv : ISO-8859-9//
ISO-8859-9E//

Ou ceci (cas de figure 3) :

Traitement de l'URL : https://www.nisanyansozluk.com/?k=kebap
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 25207    0 25207    0     0  46940      0 --:--:-- --:--:-- --:--:-- 46940
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
Encodage lisible par curl :
Encodage non UTF-8 illisible par curl
Pb avec le fichier en argument... at decode-encoding.pl line 8.
Encodage détecté par detect-encoding.pl :
Encodage détecté compatible iconv : 437//

Coder / Décoder

Semaine exotique 1

Problème en cas du japonais : Extraire le texte brut de chacune des URLs

Étape normale :

Si l’encodage de la page aspirée est utf-8, on utilise la commande lynx afin d’obtenir un dump directement en utf-8.

Lynx :
un navigateurs web en mode texte utilisable via une console ou un terminal.

Script :

Ligne de commande lynx



En cas du japonais :

Résultat :

DUMP1-1.txt vu avec éditeur

Problème d’encodage :
Les URL sont en UTF-8 et les fichiers html le sont également. En outre, lors de l’aspiration par lynx, on précise comme suit :

charset="UTF-8" et display_charset="UTF-8"

Pourtant il y a un problème d’encodage sur les fichiers de text brut (41 / 50 fichiers.)

Problème dû aux paramètres régionaux ?
L’information sur locale semblait appropriée.

LANG="ja_JP.UTF-8" LC_COLLATE="ja_JP.UTF-8"

Observation :
Les textes ne sont pas bien affichés avec un éditeur de texte, mais ils contenaient bien des informations hexadécimales et pouvaient être visualisés à l’aide du navigateur web.

DUMP1-1.txt vu à l’aide du navigateur Web

Examen :
En regardant en détail les fichiers DUMP avec navigateur Web, on a remarqué une existence d’un caractère : « ? »

Un caractère en question dans DUMP1-1.txt

La plupart des fichiers avec problème contiennent ce point d’interrogation.
On a vérifié avec les sites web d’origine les caractères qui devraient attachés et comparé leur code unicode et les informations hexadécimales.

Leurs informations hexadécimales ne semblaient pas tous mal codés. Ce qui est commun parmi ces caractères est leur position dans le fichiers txt. Ils se placent tous devant un retour à la ligne. Il y a des cas où un retour à la ligne qui n’existe pas dans le fichier html est ajouté par lynx. Donc, le problème se situe probablement à l’opération de lynx, ce qui cause des caractères mal codés.

Solution :
Ignorer les caractères mal codés par l’intermédiaire d’iconv.

Ligne de commande iconv

Résultat :

DUMP1-1.txt vu avec éditeur après iconv

Convertir le texte des pages aspirées en UTF-8 (première tentative)

Semaine 8

Schéma directeur :

Ce qu’il faut faire, c’est compléter la boucle « for » relativement à l’encodage, en utilisant la commande iconv. Comme suit :

# 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' ]]
					then
						texte=$(lynx -assume_charset "utf-8" -nolist -dump ./PAGES-ASPIREES/"$cptTableau-$compteur".html) ;
						echo "$texte" > ./DUMP-TEXT/"$cptTableau-$compteur".txt ; 
						
										
					else
					# l'encodage n'est pas UTF-8 : 
						echo "Encodage non UTF-8 : conversion en cours." ;
						texte=$(lynx -nolist -dump ./PAGES-ASPIREES/"$cptTableau-$compteur".html | iconv -f "$encodage" -t utf-8) ;
						echo "$texte" | grep -o -E "\w+" | tr '[:upper:]' '[:lower:]' | sort | uniq -c | sort -nr > ./DUMP-TEXT/"index-$cptTableau-$compteur".txt ;					
				fi

Index de tokens pour le turc : premières tentatives

Semaine 7

Schéma directeur :

Source : Serge Fleury / iCampus Sorbonne Nouvelle

Ajout d’une colonne « Index » à l’en-tête du tableau d’URLs :

echo "<table align="center" border="1px" bordercolor=blue>" >> $DOSSIER_TABLEAUX/tableau_urls_sem7.html ; 
echo "<tr><td>Num.</td><td>Code HTTP</td><td>URL</td><td>Encodage</td><td>Page aspirée</td><td>Texte brut</td><td>Index</td></tr>" >> $DOSSIER_TABLEAUX/tableau_urls_sem7.html ;

Ajout de la génération d’index à la boucle d’aspiration des URLs :

		codeHTTP=$(curl -L -w '%{http_code}\n' -o ./PAGES-ASPIREES/"$cptTableau-$compteur".html $line) ;
		if [[ $codeHTTP == 200 ]] 
			then 
			encodage=$(curl -L -I $line | egrep charset | cut -d "=" -f2 | tr -d '\r' | tr -d '\n' | tr '[:upper:]' '[:lower:]') ; 
			# Nettoyage pour supprimer les caractères de fin de ligne et l'uniformisation en minuscule (en adaptant en conséquence la boucle suivante) afin que toutes les pages bien encodées soient prises en considération par la suite.
			echo $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' ]]
					then
						texte=$(lynx -assume_charset "utf-8" -nolist -dump ./PAGES-ASPIREES/"$cptTableau-$compteur".html) ;
						echo "$texte" > ./DUMP-TEXT/"$cptTableau-$compteur".txt ; # Éventuellement avec guillemets autour de la variable (même si ici cela fonctionne aussi sans), 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)
						# Première tentative de générer l'index des tokens avec les commandes grep puis sort et uniq :
						echo "$texte" | grep -o -P "\w+" | sort | uniq -c | sort -nr > ./DUMP-TEXT/"index-$cptTableau-$compteur".txt ;
						

Aperçu du tableau qui en résulte :

Si le texte brut aspiré se présente bien… (ici 1-15.txt) :

… il en va tout autrement de l’index des tokens, qui mêle mots entiers, syllabes et lettres isolées (ici index-1-15.txt) :

Màj : le résultat s’améliore en modifiant la syntaxe de la commande grep (-E au lieu de -P).

# Deuxième tentative de générer l'index des tokens avec les commandes grep puis sort et uniq :
						echo "$texte" | grep -o -E "\w+" | sort | uniq -c | sort -nr > ./DUMP-TEXT/"index-$cptTableau-$compteur".txt ;

Nouvel index des tokens (sur index-1-15.txt toujours) :

Aspiration des pages (HTML et texte brut)

Semaine 6

Schéma directeur :

Source : Serge Fleury / iCampus Sorbonne Nouvelle

Ajout de colonnes à l’en-tête du tableau d’URLs :

echo "<table align=\"center\" border=\"1px\" bordercolor=blue>" >> $DOSSIER_TABLEAUX/tableau_urls_sem6.html ; 
echo "<tr><td>Num.</td><td>Code HTTP</td><td>URL</td><td>Encodage</td><td>Page aspirée</td><td>Texte brut</td></tr>" >> $DOSSIER_TABLEAUX/tableau_urls_sem6.html ;

Boucle de vérification sur l’accessibilité des URLs préalablement à leur aspiration :

codeHTTP=$(curl -L -w '%{http_code}\n' -o ./PAGES-ASPIREES/$cptTableau-$compteur.html $line) ;
		if [[ $codeHTTP == 200 ]] 
				echo "<tr><td>$compteur</td><td>$codeHTTP</td><td><a 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></tr>" >> $DOSSIER_TABLEAUX/tableau_urls_sem6.html ;
# Noter les chemins relatifs d'accès aux répertoires DUMP-TEXT et PAGES-ASPIREES ici : cela tient au fait que la commande echo est exécutée depuis TABLEAUX.
			else 
				echo "<tr><td>$compteur</td><td>$codeHTTP</td><td><a href=\"$line\">$line</a></td><td>-</td></tr>" >> $DOSSIER_TABLEAUX/tableau_urls_sem6.html ;
		fi

Boucle dans la boucle pour la vérification de l’encodage de chaque page aspirée :

encodage=$(curl -L -I $line | egrep charset | cut -d "=" -f2 | tr -d '\r' | tr -d '\n' | tr "[:upper:]" "[:lower:]") ; 
# Ici, dans la définition de la variable "encodage", on accompagne les requêtes curl et egrep d'instructions visant à supprimer les caractères de fin de ligne et l'uniformisation en minuscule (en adaptant en conséquence la boucle suivante) afin que toutes les pages bien encodées soient prises en considération par la suite.
# Boucle secondaire pour la détection de l'encodage (UTF-8 ou non ?) :
			if [[ $encodage == 'utf-8' ]]
				then
					texte=$(lynx -assume_charset "utf-8" -dump ./PAGES-ASPIREES/$cptTableau-$compteur.html) ;
					echo $texte > ./DUMP-TEXT/$cptTableau-$compteur.txt ; 
# La commande d'écriture avec chevron unique permettra d'éviter, dans le cas où l'on relancerait plusieurs fois le script, que cela ne crée des copies multiples du même contenu dans les fichiers txt.
				else
# Si l'encodage n'est pas UTF-8 : 
					echo "raté !" ;
# A COMPLÉTER !

Aperçu du résultat :

De la liste au tableau d’URL

Semaine 5

Synopsis des consignes :

Source : Serge Fleury / iCampus Sorbonne Nouvelle

Premier script commenté :

En-tête et définition des répertoires d’entrée et de sortie :

Ajout – Vérification sur l’existence de valeurs des variables :

Remarque : à l’exécution, le terminal renvoie une sortie d’erreur « line 15: 1: command not found » dont l’explication reste incertaine, sans que cela affecte par ailleurs le résultat du script. A élucider ?

MàJ : c’est mieux comme ça !

Mise en place de l’en-tête du fichier HTML :

Boucle pour chaque ligne de la liste d’URL, et clôture du fichier HTML :

Aperçu du résultat :

À propos d’une liste d’URL (en turc)

Semaine 4

Rappel des consignes… :

Premières recherches, premières hypothèses

Recherche via un moteur de recherche usuel paramétré pour privilégier les résultants en langue turque (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 kebap »). On retrouve des éléments de ce discours sur Wikipédia en version turque, ou sur certains dictionnaires collaboratifs tel l’« Ekşi Sözlük » (litt. le « dictionnaire aigre »).

Un second type de page, mais 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 deux régions ou localités en Turquie, chacune se prétendant patrie exclusive de tel ou tel type de kebap.

Liste préparatoire

Voici la liste constituée à ce jour (fichier txt encodage Unix UTF-8) :

Espace de variation

Schématisons par des intertitres l’espace de variation des usages du mot perceptibles en première lecture :

  • Encyclopédies, dictionnaires
Source : https://eksisozluk.com/kebab–407465
(Kebab, « mot écrit en lettres néon sur les devantures des vendeurs de kebap en France »,
est ici d’emblée défini comme variante du mot turc kebap en français.)
  • Il y a kebap et kebap : recettes
Source : http://www.sahan.com/kebap-nedir.20.tr.html
  • Il y a kebap et kebap : historiques
Source : https://iskenderiskenderoglu.com.tr/iskender-kebabin-tarihcesi
  • Il y a kebap et kebap : localités
Source : http://www.tokat.gov.tr/tokat-kebabi
  • Affaires de kebap : litiges d’appellation
  • Un plat mondialisé ?

Concevoir un site comme celui-ci avec WordPress.com
Commencer