Feat: ajout d'une vue Gamutable pour les contenus récupérées du JSONL
This commit is contained in:
parent
cdeb5f0b61
commit
20663f23ff
6 changed files with 265 additions and 5 deletions
101
content/contenu_jsonl.html
Normal file
101
content/contenu_jsonl.html
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
[(#REM)
|
||||||
|
affichage en boucle DATA des premières et dernières lignes des fichiers JSONL stockés dans un répertoire corpus
|
||||||
|
on fait tout un tas de traitements en fonction du type de donnée par champ pour essayer d'afficher qq chose de "lisible par un humain"
|
||||||
|
|
||||||
|
]
|
||||||
|
<h1>Extraction des contenus d'un lot de fichiers JSONL</h1>
|
||||||
|
<p>Chargement des fichiers Jsonl après leur décompaction et récupération de "contenus significatifs"
|
||||||
|
<br>Nombre de lignes configuré par le "pas" de l'itération dans les pages : ici <strong>#CONFIG{corpus_web/pas_corpus, 10}</strong> (1 = toutes les pages, 10 = 1 page sur 10...)
|
||||||
|
<br><small>pour mémoire : 1 ligne du fichier JSONL = 1 page HTML du site aspiré/archivé</small>
|
||||||
|
</p>
|
||||||
|
<div class="la_une">
|
||||||
|
<ul>
|
||||||
|
<BOUCLE_corpus(DATA){source ls, #CHEMIN{tmp}/#CONFIG{corpus_web/repertoire_corpus,corpus_jsonl}/*}{par basename}>
|
||||||
|
<li>
|
||||||
|
#SET{liste_lignes,#LISTE{1}} #SET{trop_gros,#CONFIG{corpus_web/taille_max}|mult{1000000}} [(#REM) trop gros = 100Mo ]
|
||||||
|
#SET{nb_lignes, #FILE|nombre_ligne} [(#GET{nb_lignes}|!={1}|oui) #SET{liste_lignes,#LISTE{1,#GET{nb_lignes}}}]
|
||||||
|
<h3 class="spip[ (#SIZE|>{#GET{trop_gros}}|oui)non_traite]">
|
||||||
|
[(#FILE|basename)] ([(#FILE|basename|recup_site)] / [(#FILE|basename|recup_aspi)]): [(#GET{nb_lignes}) [(#GET{nb_lignes}|singulier_ou_pluriel{page,pages})]] <small>([(#SIZE|human_filesize)o])</small>
|
||||||
|
[ (#SIZE|>{#GET{trop_gros}}|oui)<div>fichier trop gros pour traitement basique</div>]
|
||||||
|
</h3>
|
||||||
|
[(#REM)
|
||||||
|
{liste #GET{liste_lignes}}
|
||||||
|
]
|
||||||
|
<BOUCLE_2lignes(DATA){enum 1, #GET{nb_lignes}, #CONFIG{corpus_web/pas_corpus, 10}}{si #SIZE|<{#GET{trop_gros}}}>
|
||||||
|
[(#SET{num_ligne,[(#COMPTEUR_BOUCLE|=={1}|?{1,#GET{nb_lignes}})]})]
|
||||||
|
<div>
|
||||||
|
<h4 class="aff_masq">Page #VALEUR :</h4>
|
||||||
|
<div class="details">
|
||||||
|
[(#SET{content,[(#FILE|affiche_ligne{#GET{num_ligne}}|json_decode{true})]})]
|
||||||
|
<ul>
|
||||||
|
<BOUCLE_content(DATA){source table, #GET{content}}>
|
||||||
|
[(#CLE|=={htmlBytes}|oui)
|
||||||
|
[(#REM)
|
||||||
|
<li>
|
||||||
|
<div class=""><span class="aff_masq_">Title :</span> [(#VALEUR|base64_decode|affiche_title)]</div>
|
||||||
|
</li>
|
||||||
|
]
|
||||||
|
<li>
|
||||||
|
<div class="aff_masq">[(#CLE)] = HTML de la page (clic pour visualiser) </div>
|
||||||
|
<div class="details">
|
||||||
|
<textarea class="details">[(#VALEUR|base64_decode|replace{<,<}|replace{>,>})]</textarea>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div class="aff_masq_">Titres :</div>
|
||||||
|
<div class="details_">[(#VALEUR|base64_decode|recup_titres)]</div>
|
||||||
|
</li>
|
||||||
|
]
|
||||||
|
[(#CLE|=={extractionContent}|oui)
|
||||||
|
<BOUCLE_ss(DATA){source table, #VALEUR}>
|
||||||
|
[(#CLE|in_array{#LISTE{boilerpipe:text, htmlmeta:head:title, htmlmeta:head:keywords, htmlmeta:head:description}}|oui)
|
||||||
|
<li>
|
||||||
|
<div class="aff_masq_">[(#CLE|replace{htmlmeta:head:, meta }|replace{boilerpipe:, ''}|ucfirst)] : </div>
|
||||||
|
<div class="details_">
|
||||||
|
[(#VALEUR|print|replace{<br>,§§}|replace{<br />,§§}|replace{<,<}|replace{>,>}|replace{§§,<br>}|replace{"\n", <br>})]
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
]
|
||||||
|
</BOUCLE_ss>
|
||||||
|
]
|
||||||
|
</BOUCLE_content>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</BOUCLE_2lignes>
|
||||||
|
</li>
|
||||||
|
</BOUCLE_corpus>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(function () {
|
||||||
|
$('.aff_masq').each(function() {
|
||||||
|
$(this).siblings('.details').toggleClass('js-hidden');
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.aff_masq').on('click', function() {
|
||||||
|
$(this).siblings('.details').toggleClass('js-hidden');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style type="text/css" media="screen">
|
||||||
|
.aff_masq, .aff_masq_ {
|
||||||
|
cursor: pointer;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.aff_masq:hover {
|
||||||
|
background-color: #DDD;
|
||||||
|
}
|
||||||
|
.details br:first-of-type {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
textarea {
|
||||||
|
width: 100%;
|
||||||
|
height: 200px;
|
||||||
|
}
|
||||||
|
.non_traite {
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -3,8 +3,9 @@
|
||||||
on fait tout un tas de traitements en fonction du type de donnée par champ pour essayer d'afficher qq chose de "lisible par un humain"
|
on fait tout un tas de traitements en fonction du type de donnée par champ pour essayer d'afficher qq chose de "lisible par un humain"
|
||||||
|
|
||||||
]
|
]
|
||||||
<h1>Contenus d'un lot de fichiers JSONL</h1>
|
<h1>Exploration des contenus d'un lot de fichiers JSONL</h1>
|
||||||
<p>Chargement des fichiers Jsonl après leur décompaction et affichage du contenu de toutes leurs lignes
|
<p>Chargement des fichiers Jsonl après leur décompaction et affichage du contenu des lignes
|
||||||
|
<br>Nombre de lignes configuré par le "pas" de l'itération dans les pages : ici <strong>#CONFIG{corpus_web/pas_corpus, 10}</strong> (1 = toutes les pages, 10 = 1 page sur 10...)
|
||||||
<br><small>pour mémoire : 1 ligne du fichier JSONL = 1 page HTML du site aspiré/archivé</small>
|
<br><small>pour mémoire : 1 ligne du fichier JSONL = 1 page HTML du site aspiré/archivé</small>
|
||||||
</p>
|
</p>
|
||||||
<div class="la_une">
|
<div class="la_une">
|
||||||
|
@ -20,7 +21,7 @@
|
||||||
[(#REM)
|
[(#REM)
|
||||||
{liste #GET{liste_lignes}}
|
{liste #GET{liste_lignes}}
|
||||||
]
|
]
|
||||||
<BOUCLE_2lignes(DATA){enum 1, #GET{nb_lignes}}{si #SIZE|<{#GET{trop_gros}}}>
|
<BOUCLE_2lignes(DATA){enum 1, #GET{nb_lignes}, #CONFIG{corpus_web/pas_corpus, 10}}{si #SIZE|<{#GET{trop_gros}}}>
|
||||||
[(#SET{num_ligne,[(#COMPTEUR_BOUCLE|=={1}|?{1,#GET{nb_lignes}})]})]
|
[(#SET{num_ligne,[(#COMPTEUR_BOUCLE|=={1}|?{1,#GET{nb_lignes}})]})]
|
||||||
<div>
|
<div>
|
||||||
<h4 class="aff_masq">Page #VALEUR :</h4>
|
<h4 class="aff_masq">Page #VALEUR :</h4>
|
||||||
|
|
54
content/synthese_jsonl.html
Normal file
54
content/synthese_jsonl.html
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
[(#REM)
|
||||||
|
affichage en boucle DATA des premières et dernières lignes des fichiers JSONL stockés dans un répertoire corpus
|
||||||
|
on fait tout un tas de traitements en fonction du type de donnée par champ pour essayer d'afficher qq chose de "lisible par un humain"
|
||||||
|
|
||||||
|
]
|
||||||
|
<h1>Synthèse des contenus extraits d'un lot de fichiers JSONL</h1>
|
||||||
|
<p>Chargement des fichiers Jsonl après leur décompaction et récupération de "contenus significatifs" puis mise en tableau pour filtrages/tris/extractions CSV
|
||||||
|
<br>Nombre de lignes configuré par le "pas" de l'itération dans les pages : ici <strong>#CONFIG{corpus_web/pas_corpus, 10}</strong> (1 = toutes les pages, 10 = 1 page sur 10...)
|
||||||
|
<br><small>pour mémoire : 1 ligne du fichier JSONL = 1 page HTML du site aspiré/archivé</small>
|
||||||
|
</p>
|
||||||
|
</div></div>
|
||||||
|
<div class="la_une">
|
||||||
|
<INCLURE{fond=inclure/gamutable,
|
||||||
|
apiuri="spip.php?page=json_affiche_corpus.json",
|
||||||
|
tparpage=[15,25,50,'Tous'],
|
||||||
|
champcsv="search",
|
||||||
|
delimitercsv=";",
|
||||||
|
vueblocdefaut='tableau',
|
||||||
|
namecsv="extractions_corpus.csv",
|
||||||
|
env
|
||||||
|
}>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(function () {
|
||||||
|
$('.aff_masq').each(function() {
|
||||||
|
$(this).siblings('.details').toggleClass('js-hidden');
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.aff_masq').on('click', function() {
|
||||||
|
$(this).siblings('.details').toggleClass('js-hidden');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style type="text/css" media="screen">
|
||||||
|
.aff_masq, .aff_masq_ {
|
||||||
|
cursor: pointer;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.aff_masq:hover {
|
||||||
|
background-color: #DDD;
|
||||||
|
}
|
||||||
|
.details br:first-of-type {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
textarea {
|
||||||
|
width: 100%;
|
||||||
|
height: 200px;
|
||||||
|
}
|
||||||
|
.non_traite {
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -145,7 +145,6 @@ function affiche_titraille($html) {
|
||||||
$titraille[] = '<h'.$h.'>'.$m[2].'</h'.$h.'>';
|
$titraille[] = '<h'.$h.'>'.$m[2].'</h'.$h.'>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return join("\r\n", $titraille);
|
return join("\r\n", $titraille);
|
||||||
|
@ -166,3 +165,30 @@ function human_filesize($bytes, $decimals = 2) {
|
||||||
$factor = floor((strlen($bytes) - 1) / 3);
|
$factor = floor((strlen($bytes) - 1) / 3);
|
||||||
return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
|
return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function recup_titres($html) {
|
||||||
|
// regexp : class="(titre|field-content)
|
||||||
|
// class="(titre|field-content)">(<[^>]*>)?([^<>]*)
|
||||||
|
$titres = [];
|
||||||
|
$html = str_replace(['<em>','</em>'], '', $html);
|
||||||
|
preg_match_all('/class="(titre|field-content|nodeTitle nobreak)">(<[^>]*>)?([^<>]*)/si', $html, $match, PREG_SET_ORDER);
|
||||||
|
if ($match) {
|
||||||
|
foreach($match as $m) {
|
||||||
|
if ($m[3] !== '') {
|
||||||
|
$titres[] = $m[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return count($titres) ? "<ul><li>".join("</li><li>", $titres)."</li></ul>" : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function recup_site($nom_fichier_jsonl) {
|
||||||
|
return explode('_', $nom_fichier_jsonl)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
function recup_aspi($nom_fichier_jsonl) {
|
||||||
|
$T = explode('_', $nom_fichier_jsonl)[1];
|
||||||
|
$T = explode('-', $T);
|
||||||
|
return $T[0].'-'.$T[1].'-'.$T[2];
|
||||||
|
}
|
|
@ -13,6 +13,7 @@
|
||||||
<legend>Configuration traitement JSONL</legend>
|
<legend>Configuration traitement JSONL</legend>
|
||||||
#SAISIE{input, repertoire_apercu, label=repertoire_apercu, explication=nom du répertoire des fichiers JSONL pour l'aperçu (dans tmp/) }
|
#SAISIE{input, repertoire_apercu, label=repertoire_apercu, explication=nom du répertoire des fichiers JSONL pour l'aperçu (dans tmp/) }
|
||||||
#SAISIE{input, repertoire_corpus, label=repertoire_corpus, explication=nom du répertoire des fichiers JSONL pour le corpus (dans tmp/) }
|
#SAISIE{input, repertoire_corpus, label=repertoire_corpus, explication=nom du répertoire des fichiers JSONL pour le corpus (dans tmp/) }
|
||||||
|
#SAISIE{input, pas_corpus, label=pas_corpus, explication=pour le corpus "pas" de l'itération dans les pages <br><small>(1 = toutes les pages, 10 = 1 page sur 10)</small> }
|
||||||
#SAISIE{input, taille_max, label=taille_max, explication=taille maximum des fichiers à traiter (en Mo) }
|
#SAISIE{input, taille_max, label=taille_max, explication=taille maximum des fichiers à traiter (en Mo) }
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
|
|
77
json_affiche_corpus.json.html
Normal file
77
json_affiche_corpus.json.html
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
#HTTP_HEADER{Content-Type: application/json; charset=#CHARSET}
|
||||||
|
[(#ENV{id}|setenv{id_jsonl})]
|
||||||
|
[{
|
||||||
|
"header":{
|
||||||
|
"id": "id jsonl",
|
||||||
|
"site": "Site",
|
||||||
|
"date_aspi": "Date archive",
|
||||||
|
"num_page": "Numéro page",
|
||||||
|
"title": "Meta title",
|
||||||
|
"desc": "Meta description",
|
||||||
|
"keywords": "Meta keywords",
|
||||||
|
"titres": "titres",
|
||||||
|
"text": "Texte"
|
||||||
|
},
|
||||||
|
"filtreCol" : {
|
||||||
|
"site" : "select",
|
||||||
|
"date_aspi": "select",
|
||||||
|
"num_page": "input",
|
||||||
|
"title": "input",
|
||||||
|
"desc": "input",
|
||||||
|
"keywords": "input",
|
||||||
|
"titres": "input",
|
||||||
|
"text": "input"
|
||||||
|
},
|
||||||
|
"classes":{
|
||||||
|
}
|
||||||
|
} #SET{id_jsonl,1}
|
||||||
|
<BOUCLE_corpus(DATA){source ls, #CHEMIN{tmp}/#CONFIG{corpus_web/repertoire_corpus,corpus_jsonl}/*}{par basename}>
|
||||||
|
[(#SET{site,#FILE|basename|recup_site})] [(#SET{date_aspi,#FILE|basename|recup_aspi})]
|
||||||
|
#SET{liste_lignes,#LISTE{1}} #SET{trop_gros,#CONFIG{corpus_web/taille_max}|mult{1000000}}
|
||||||
|
#SET{nb_lignes, #FILE|nombre_ligne} [(#GET{nb_lignes}|!={1}|oui) #SET{liste_lignes,#LISTE{1,#GET{nb_lignes}}}]
|
||||||
|
<BOUCLE_2lignes(DATA){enum 1, #GET{nb_lignes}, #CONFIG{corpus_web/pas_corpus, 10}}{si #SIZE|<{#GET{trop_gros}}}>
|
||||||
|
[(#SET{num_ligne,[(#COMPTEUR_BOUCLE|=={1}|?{1,#GET{nb_lignes}})]})]
|
||||||
|
[(#SET{content,[(#FILE|affiche_ligne{#GET{num_ligne}}|json_decode{true})]})]
|
||||||
|
#SET{num_page,Page #VALEUR} #SET{title,''} #SET{keywords,''} #SET{description,''} #SET{titres,''}
|
||||||
|
<BOUCLE_content(DATA){source table, #GET{content}}>
|
||||||
|
[(#CLE|=={extractionContent}|oui)
|
||||||
|
<BOUCLE_ss(DATA){source table, #VALEUR}>
|
||||||
|
[(#CLE|=={boilerpipe:text}|oui) [(#SET{text, text: [(#VALEUR|print|replace{<br>,§§}|replace{<br />,§§}|replace{<,<}|replace{>,>}|replace{§§,<br>}|replace{"\n", <br>})]})] ]
|
||||||
|
[(#CLE|=={htmlmeta:head:title}|oui) [(#SET{title, title: [(#VALEUR|print|replace{<br>,§§}|replace{<br />,§§}|replace{<,<}|replace{>,>}|replace{§§,<br>}|replace{"\n", <br>})]})] ]
|
||||||
|
[(#CLE|=={htmlmeta:head:keywords}|oui) [(#SET{keywords, keywords: [(#VALEUR|print|replace{<br>,§§}|replace{<br />,§§}|replace{<,<}|replace{>,>}|replace{§§,<br>}|replace{"\n", <br>})]})] ]
|
||||||
|
[(#CLE|=={htmlmeta:head:description}|oui) [(#SET{description, desc: [(#VALEUR|print|replace{<br>,§§}|replace{<br />,§§}|replace{<,<}|replace{>,>}|replace{§§,<br>}|replace{"\n", <br>})]})] ]
|
||||||
|
</BOUCLE_ss>
|
||||||
|
][(#CLE|=={htmlBytes}|oui)
|
||||||
|
[(#SET{titres, [(#VALEUR|base64_decode|recup_titres)]})]
|
||||||
|
]
|
||||||
|
</BOUCLE_content>
|
||||||
|
,{
|
||||||
|
"html": {
|
||||||
|
"id": [(#GET{id_jsonl})],
|
||||||
|
"site" : [(#GET{site}|json_encode)],
|
||||||
|
"date_aspi": [(#GET{date_aspi}|json_encode)],
|
||||||
|
"num_page": [(#GET{num_page}|json_encode)],
|
||||||
|
"title": [(#GET{title}|json_encode)],
|
||||||
|
"desc": [(#GET{description}|json_encode)],
|
||||||
|
"keywords": [(#GET{keywords}|json_encode)],
|
||||||
|
"titres": [(#GET{titres}|json_encode)],
|
||||||
|
"text": [(#GET{text}|json_encode)]
|
||||||
|
},
|
||||||
|
"classes": {
|
||||||
|
"titre":"transcription"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"id": [(#GET{id_jsonl})],
|
||||||
|
"site" : [(#GET{site}|json_encode)],
|
||||||
|
"date_aspi": [(#GET{date_aspi}|json_encode)],
|
||||||
|
"num_page": [(#GET{num_page}|json_encode)],
|
||||||
|
"title": [(#GET{title}|json_encode)],
|
||||||
|
"desc": [(#GET{description}|json_encode)],
|
||||||
|
"keywords": [(#GET{keywords}|json_encode)],
|
||||||
|
"titres": [(#GET{titres}|json_encode)],
|
||||||
|
"text": [(#GET{text}|json_encode)]
|
||||||
|
}
|
||||||
|
} [(#SET{id_jsonl, #GET{id_jsonl}|plus{1}})]
|
||||||
|
</BOUCLE_2lignes>
|
||||||
|
</BOUCLE_corpus>
|
||||||
|
]
|
Loading…
Add table
Reference in a new issue