-
L'écriture de la suite du script Bash sur le traitement de nos URLs consiste au repérage du motif, thème de notre projet.
Premièrement, nous cherchons a récupérer deux lignes avant le motif, et deux lignes après, quelque soit la casse de l'occurrence. Nous sauvegardons ces occurrences et leur contexte dans un fichier texte.
# construction de morceaux de corpus
egrep -C 2 -i "$motif" ./DUMP-TEXT/"utf8_$numTable-$compteur".txt > ./CONTEXTES/"utf8_$numTable-$compteur".txt;Grâce à perl et à un logiciel écrit par un ancien étudiant, "Mini-grep-multilingue", nous enregistrons les contextes dans un fichier HTML. Pour cette étape, il faut au préalable créer un fichier "motif-2020.txt" dans lequel le script écrira le motif : echo "MOTIF=$motif" > ./PROGRAMMES/minigrepmultilingue-v2.2-regexp/motif-2020.txt;.
# donner à voir ces contextes en HTML
perl ./PROGRAMMES/minigrepmultilingue-v2.2-regexp/minigrepmultilingue.pl "UTF-8" ./DUMP-TEXT/"utf8_$numTable-$compteur".txt ./PROGRAMMES/minigrepmultilingue-v2.2-regexp/motif-2020.txt;
# sauvegarde du résultat
mv resultat-extraction.html ./CONTEXTES/"url_$numTable-$compteur".html;Le programme de "Mini-grep-multilingue" produit un fichier dans lequel sont marquées les occurrences d'un motif dans sa ligne. La particularité de ce logiciel est qu'il est très efficace pour les langues non-occidentales.
Après nous être occupés du contexte, nous demandons d'enregistrer dans un nouveau fichier l'index des mots de la page, c'est-à-dire le nombre d'apparition associé au mot.
# index hierarchique de chaque DUMP
egrep -i -o "\w+" ./DUMP-TEXT/"utf8_$numTable-$compteur".txt | sort | uniq -c | sort -r -n -s -k 1,1 > ./DUMP-TEXT/"index_$numTable-$compteur".txt;Ensuite, nous avons cherché les bigrammes (ensemble de deux mots) en récupérant la liste des mots de la page, et en copiant à côté la même liste, la première ligne suppprimée.
# calcul de bigrammes
tr " " "\n" < ./DUMP-TEXT/"utf8_$numTable-$compteur".txt | tr -s "\n" | egrep -v "^$" > index1.txt;
tail -n +2 index1.txt > index2.txt; # on efface la 1ère ligne
paste index1.txt index2.txt | sort | uniq -c | sort -r -n -s -k 1,1 -r > ./DUMP-TEXT/"bigrammes_$numTable-$compteur".txt;Il est possible de télécharger sur ce site http://www.tal.univ-paris3.fr/cours/minigrepmultilingue.htm le dossier contenant tout ce dont nous avons besoin pour se servir de "Mini-grep-multilingue".
Vous pouvez voir ici le nouveau script « table_url.sh », et le tableau « tableau_url.html » donné avec nos fichiers d'URLs pour le motif "Helikopter-Eltern|헬리콥터 부모".
votre commentaire -
Pour tokeniser le chinois, j'ai regardé sur le blog des années passées les propositions des élèves. Il y avait deux solutions majeurs : l'utilisation de jieba ou de stanford segmenter. Sur un blog consulté, un étudiant à tester les deux propositions : d'après ce dernier, la tokenization offerte par jieba serait plus efficace et plus en accord avec la tokenization chinoise.
J'ai donc choisi d'utiliser jieba. Pour cela, j'ai préalablement installé jieba sur mon terminal ubuntu avec la commande suivante :
pip3 install jieba En suite, j'ai écris un programme python qui permet d'utiliser jieba :
# encoding=utf-8
#importer l'argument pour le scripte, trouver le bon fichier txt à segmenter
import sys
fichier = sys.argv[1]#ouvrir le texte brut et le mémoriser comme variable
fichier_ouv = open (fichier, "r", encoding="utf-8")
fichier_read = fichier_ouv.read()
fichier_ouv.close()import jieba
#ajouter 真升机父母 au dictionnaire temporairement pour que jieba le considère comme #un seul mot
#jieba.suggest_freq('真升机父母', True)#segmenter le texte avec jieba
seg_list = jieba.cut(fichier_read, cut_all=False)#écrire le résultat dans un nouveau fichier
f = open("fichier_seg.txt", 'w+')
print (" ".join(seg_list), file=f)
f.close()J'ai ensuite intégré ce programme python à mon programme bash.
python3 ./PROGRAMMES/seg.py ./DUMP-TEXT/utf8_"$compteur_tableau-$compteur".txt;
mv fichier_seg.txt ./CORPUS-SEG/"$compteur_tableau-$compteur".txt;Voici le résultat de la tokenization de la première URL:
Un extrait :
五湖四海 近年来 , 直升机 父母 ( Helicopter Parenting ) 这个 形容词 开始 盛传 。 直升机 父母 是 指 过分 介入 儿女 生活 , 保护 或是 干预 其 生活 的 父母 , 他们 就 像 直升机 一般 , 不时 在 儿女 身边 盘旋 。 教育部 几周 前 在 面 簿 上 解释 , 为何 家长 应该 放弃 这 类 教育 方式 。 国专 长老会 小学 、 武吉知 马 小学 , 以及 一些 政府 学校 为了 禁止 父母 过度 关心 孩子 , 甚至 在 校园内 放 置 告示牌 , 劝 请 父母 切勿 帮 孩子 把 忘 了 带 的 东西 送到 学校 。 把 孩子 照顾 得 无微不至 , 不是 错 , 但是 过度 溺爱 、 超过 界限 的 疼爱 , 对 孩子 并 没有 好处 。 天下父母 心 、 望子成龙 、 望女成凤 — — 这些 形容词 都 说明 家长 无不 关心 自己 的 孩子 、 希望 他们 得到 最棒 的 福利 和 待遇 。 然而 在 这个 竞争 越来越 激烈 的 社会 , 一直 保 护 孩子 , 到底 是 利 还是 弊 ? 作为 教育工作者 , 我见 过 不同 类型 的 直升机 父母 — — 孩子 太忙 , 出于 疼惜 而 帮 他们 做 补习 作业 ; 也 有 家长 每周 质问 孩子 受 教育 的 进展 , 连 作业簿 的 说明 少 了 空格 也 要 投诉 。 我们 当然 希望 家长 能 放手 , 不要 做 直升机 父母 , 基于 以下 四个 理由 :
2 commentaires -
Lors de cette séance, nous avons continuer à ajouter des traitements à la suite de ceux existant:
On a extrait des contextes réduits au motif (1 ligne avant et 1 ligne après)
# 1. construire des morceaux de corpus
egrep -C 2 -i "$motif" ./DUMP-TEXT/utf8_"$compteur_tableau-$compteur".txt > ./CONTEXTES/utf8_"$compteur_tableau-$compteur".txt;
# 2. donner à voir ces contextes au format HTML
perl ./PROGRAMMES/minigrepmultilingue-v2.2-regexp/minigrepmultilingue.pl "UTF-8" ./DUMP-TEXT/utf8_"$compteur_tableau-$compteur".txt ./PROGRAMMES/minigrepmultilingue-v2.2-regexp/motif-2020.txt ;
# attention il faut "sauvegarder" le résultat
mv resultat-extraction.html ./CONTEXTES/"$compteur_tableau-$compteur".html;
#
On a crée un index hiérarchique de chaque TEXT-DUMPegrep -i -o "\w+" ./DUMP-TEXT/utf8_"$compteur_tableau-$compteur".txt | sort | uniq -c | sort -r -n -s -k 1,1 > ./DUMP-TEXT/index_"$compteur_tableau-$compteur".txt ;
On a aussi crée un index de digramme:tr " " "\n" < ./DUMP-TEXT/utf8_"$compteur_tableau-$compteur".txt | tr -s "\n" | egrep -v "^$" > index1.txt ;
tail -n +2 index1.txt > index2.txt;
paste index1.txt index2.txt | sort | uniq -c | sort -r -n -s -k 1,1 -r > ./DUMP-TEXT/bigramme_"$compteur_tableau-$compteur".txt ;On remarque que ces traitements additionnels ne marche pas bien pour le chinois. En effet, il faut tokenizer les textes. On verra ça dans un prochain billet de blog.
Cependant, voici déjà un aperçu visuel du tableau:
votre commentaire -
Une partie de notre projet consiste en la récupération des données sur lesquelles nous allons travailler plus tard. L’objectif de cette étape est d’obtenir un corpus de textes à partir de sites internet que nous avons choisis. Nous avons décidé de nous concentrer sur des articles de presse de différentes langues contenant l’expression « parents hélicoptères ». Alexandra s’occupe de sites en chinois et en français, tandis que je travaille sur des sites allemands et coréens. Parmi les journaux en allemand, Die Zeit a par exemple été pris en compte, et le journal Chosun était une source pour le coréen. Les adresses URL des articles que nous avons choisis ont été enregistrés chacun dans un fichier texte, en fonction de la langue. (Disponibles ici : « german.txt » et là : « korean.txt »)
Pour cette étape importante de notre projet, nous écrivons un programme en Bash avec nos enseignants durant les séances de cours. Ce programme nous permet de traiter tous les fichiers énumérant les sites que nous avons choisis, automatiquement et d’une seule traite. Nous ne sommes pas encore arrivés à la version finale du programme, mais nous devrions l’avoir bientôt.
Tout d’abord, nous souhaitons que les progrès du traitement des sites soient enregistrés dans autant de tableaux HTML que de langues – plus précisément de fichiers contenant les listes d’URLs. Pour ce faire, nous définissons des arguments : le dossier contenant les fichiers et le nom du fichier HTML. Pour que nous obtenions réellement un fichier HTML montrant des tableaux, le programme doit écrire des balises pertinentes dans le fichier.
Ensuite, nous passons au traitement des listes d’URLs. Chaque résultat sera inscrit dans les tableaux. La première colonne est le numéro de l’URL – la ligne du fichier pour ce site. La deuxième est l’adresse elle-même. Pour le moment, nous n’avons eu aucun souci pour les sites allemands et coréens en ce qui concerne la récupération de ces deux valeurs.
Nous voulons « aspirer » les sites grâce à la commande curl et savoir si « l’aspiration » c’est correctement passé. On regarde alors le code HTTP produit lors de la commande, et le notons dans le tableau. Si le code est 200, cela s’est bien passé. Sinon, la page n’a pas pu être aspirée. Dans le cas des sites en allemand, 3 sites n’ont pu être récupérés, et 4, des sites en coréen. Leur code HTTP varient entre 400, 302, 403 et 410 (respectivement : syntaxe de la requête erronée, restriction temporaire, accès refusé et ressource plus disponible).
Si les pages sont bien aspirées, nous souhaitons connaître leur encodage, et s’il s’agit de l’UTF-8, le programme doit récupérer le contenu textuel et le sauvegarder dans des fichiers textes. Toutes les pages en allemand qui ont pu être récupérées, ont été encodées en UTF-8, à part une en ISO-8859-1. Quatre pages sont dans le même cas en coréen, mais sur cinq pages, l’encodage n’a pas été reconnu. Quelques pages ont également été encodées en EUC-KR. Il se trouve que la présentation de l’encodage dans le code HTML varie parfois, et il est même possible de trouver plusieurs fois le mot « charset » dans la balise <head> de la page. Ce mot permet d’identifier le système d’encodage.
Finalement, nous voulons savoir combien d’occurrence du motif choisi, « parents hélicoptères » pour nous, apparaît dans chaque article. Nous avons cherché le motif en allemand, « Helikopter-Eltern », mais il existe d’autres façons de l’écrire. Bien évidemment, en ne recherchant seulement ce motif, aucune occurrence n’est observée dans les pages en coréen. Il faudra réfléchir à comment formuler un motif comprenant toutes les variations.
Pour télécharger le programme Bash, cliquer ici, et là pour voir le tableau obtenu sur les fichiers d'URLs en allemand et en coréen.
votre commentaire -
Durant ce cours, on a mis en place dans notre programme deux choses:
1. un traitement pour tester le bon déroulement de la récupération d'une URL par la commande curl
2. un traitement pour récupérer l'encodage d'une URL
Pour cela, on a utilisé des options de la commande curl.
Premièrement, avec l'option -w %{http_code}, on a récupéré la valeur du code HTTP . Les code HTTP sont les résultats des requêtes envoyées par curl aux sites internet. Lorsque la valeur est 200, alors la requête s'est bien passé. En revanche, si le la valeur du code HTTP est autre, alors la requête s'est mal passé.
codeHttp=$(curl -o ./PAGES-ASPIREES/"$compteur_tableau-$compteur".html $ligne -w %{http_code}) Lorsque la récupération s'est bien déroulée, donc que la valeur du code HTTP est 200, on procède à la récupération de l'encodage des sites.
Pour le moment, on s'est intéressé à la récupération des sites encodés en UTF-8, puisque ces derniers ne demanderont pas traitements spécifiques. On récupère donc l'encodage avec l'option -I de la commande curl. Après observation des charset des différents sites, on remarque que l'encodage est soit noté utf-8 soit UTF-8. On fait donc un pipe pour ensuite uniformiser la récupération de l'encodage.
encodageURL=$(curl -I $ligne | egrep -i "charset" | cut -f2 -d= | tr [a-z] [A-Z] | tr -d "\r"); On peut maintenant procéder à la récupération du contenu des sites encodés en UTF-8 où curl à bien récupéré les URLs. Pour cela, on utilise: la commande lynx -dump -nolist.
lynx -dump -nolist -assume_charset="UTF-8" -display_charset="UTF-8" ./PAGES-ASPIREES/"$compteur_tableau-$compteur".html > ./DUMP-TEXT/"$compteur_tableau-$compteur".txt; A la fin de la séance, on a commencé à compter les occurrences d'un motif. Pour cela, on a crée une variable motif dont le contenu sera saisi en argument lors de l'excécution du programme. Puis, on a crée un compteur qui compte les occurrences du motifs trouvés avec la commande egrep (la commande egrep permet de chercher des motifs dans un fichier).
compteurMotif=$(egrep -o -i $motif ./DUMP-TEXT/"$compteur_tableau-$compteur".txt | wc -l); Voici le programme réalisé en cours: Télécharger « projet-2020-11-04.sh »
Il faut également réfléchir à comment traiter les sites non encodés en UTF-8 ou bien aps reconnu comme de l'UTF-8 !
votre commentaire