function generer_types_entites($nb_mots = "multi") { // Générer des catégories d'entités à partir de l'arborescence de fichiers du répertoire listes_lexicales. include_spip('iterateur/data'); $types_entites_repertoires = inc_ls_to_array_dist(_DIR_RACINE . 'plugins/entites_nommees/listes_lexicales/*'); /* define des entités connues à partir des listes texte. */ foreach ($types_entites_repertoires as $type) { $entites_multi = array(); $entites_mono = array(); $ajout_entites = array(); $entites_regexp = ""; // pour chaque repertoire $t_entite = $type['file']; // var_dump($t_entite); // on liste les fichiers $sous_categories = inc_ls_to_array_dist(_DIR_RACINE . "plugins/entites_nommees/listes_lexicales/{$t_entite}/*.txt"); /**/ // creer un type d'entite si le répertoire contient des recettes au format txt. if (sizeof($sous_categories) >= 1) { //var_dump(strtoupper($t_entite)); // pour chaque fichier foreach ($sous_categories as $sous_categorie) { $sous_categorie_type = $sous_categorie['file']; // var_dump("<hr />-- $t_entite /" . $sous_categorie_type); //exit ; $sous_cat_ent = file_get_contents(_DIR_RACINE . "plugins/entites_nommees/listes_lexicales/{$t_entite}/{$sous_categorie_type}"); $sous_cat_entites = inc_file_to_array_dist(trim($sous_cat_ent)); foreach ($sous_cat_entites as $k => $ligne) { $ligne = trim($ligne); //pas de ligne vides ou de // commentaires if (preg_match(",^\\/\\/|^\$,", $ligne) || $ligne == "") { continue; } // entites multi-mots if (strpos($ligne, " ")) { $entites_multi[] = $ligne; } else { $entites_mono[] = $ligne; } } //exit ; } // Mono ou multi mots ? if ($nb_mots == "mono") { $ajout_entites = $entites_mono; } else { $ajout_entites = $entites_multi; } //var_dump($ajout_entites); // si on a des lignes dans un fichier texte bien rangé if (sizeof($ajout_entites) >= 1) { foreach ($ajout_entites as $entite_unique) { // nettoyer $entite_unique = preg_quote($entite_unique); // gérer les accents $entite_unique = preg_replace("/E|É/u", "(?:É|E)", $entite_unique); // forme développée ou pas //$entite_unique = preg_replace("/\(\)/", "", $entite_unique); $entites_regexp .= "\\P{L}" . $entite_unique . "\\P{L}|"; // ne doit pas etre trop long car les regexp ont une limite à 1000000. } } // pas de | final ni de / $entites_regexp = preg_replace("/\\|\$|\\//", "", $entites_regexp); // on fait des paquets de maximum 10000 de long. $longueur = strlen($entites_regexp); if ($longueur > 10000) { $nb = ceil($longueur / 10000); // echo $t_entite . "est $nb fois trop long : " . strlen($entites_regexp) . "<br>" ; // position du dernier | avant 40000 char $i = 1; $chaine = $entites_regexp; $sous_chaine = array(); while ($i <= $nb) { $pos = strrpos(substr($chaine, 0, 10000), "\\P{L}|"); //echo "dernier | du paquet $i à la pos : $pos" ; $s_chaine = substr($chaine, 0, $pos); $types_entites[$t_entite . $i] = $s_chaine . "\\P{L}"; //echo $type_entite.$i ." = " . $types_entites[$type_entite.$i] ; $chaine = str_replace($s_chaine . "\\P{L}|", "", $chaine); $i++; } } else { $types_entites[$t_entite] = $entites_regexp; } } } return $types_entites; }
protected function execute(InputInterface $input, OutputInterface $output) { global $spip_racine; global $spip_loaded; global $spip_version_branche; $restart = $input->getOption('restart'); $requalifier = $input->getOption('maj'); include_spip("base/abstract_sql"); if ($spip_loaded) { chdir($spip_racine); if (!function_exists('passthru')) { $output->writeln("<error>Votre installation de PHP doit pouvoir exécuter des commandes externes avec la fonction passthru().</error>"); } else { // requalifier les types d'apres les fichier du repertoire a_ajouter ? if ($requalifier !== "non") { passthru("clear"); $output->writeln("<info>Requalification des données</info>"); // recaler apres coup // prevoir aussi des : update entites_nommees set entite='Pays basque', type_entite='Pays' where entite='Pays' and extrait like '%Pays basque%' and type_entite='INDETERMINE' ; lire_fichier('plugins/entites_nommees/recaler.txt', $recale); $entites_a_revoir = explode("\n", $recale); if (sizeof($entites_a_revoir) > 1) { foreach ($entites_a_revoir as $e) { if (preg_match(",^//,", $e) or preg_match(",^\$,", $e)) { /**/ continue; } list($entite_actuelle, $entite_dans_extrait, $type_entite, $entite) = explode("\t", $e); //var_dump($entite_actuelle,$entite_dans_extrait, $type_entite, $entite); $sel = "select * from entites_nommees where (type_entite = 'INDETERMINE' or type_entite='Personnalités' or type_entite='Institutions automatiques') and entite= " . sql_quote($entite_actuelle) . " and extrait like '%" . addslashes($entite_dans_extrait) . "%'"; $q = sql_query($sel); $nb = sql_count($q); if ($nb > 0) { echo "{$nb} {$entite_actuelle} ({$entite_dans_extrait}) => {$entite}\n"; $up = "update entites_nommees set entite=" . sql_quote($entite) . ", type_entite=" . sql_quote($type_entite) . " where (type_entite = 'INDETERMINE' or type_entite='Personnalités' or type_entite='Institutions automatiques') and entite= " . sql_quote($entite_actuelle) . " and extrait like '%" . addslashes($entite_dans_extrait) . "%'"; echo $up . "\n"; sql_query($up); } echo "\n"; } } include_spip('iterateur/data'); $types_requalif = inc_ls_to_array_dist(_DIR_RACINE . 'plugins/entites_nommees/listes_lexicales/a_ajouter/*'); /**/ foreach ($types_requalif as $t) { if ($t['filename'] == "a_ajouter") { continue; } $entites_a_revoir = $freq = array(); lire_fichier($t['dirname'] . "/" . $t['file'], $freq); //echo $t['file'] . "\n" ; $entites_a_revoir = explode("\n", $freq); if (sizeof($entites_a_revoir) > 1) { foreach ($entites_a_revoir as $e) { $ent = sql_query("select * from entites_nommees where (type_entite = 'INDETERMINE' or type_entite='Personnalités') and entite= " . sql_quote($e)); $nb = sql_count($ent); if ($nb > 0) { echo $nb . " entites " . $e . " de statut INDETERMINE => " . $t['filename'] . "\n"; $up = "update entites_nommees set type_entite=" . str_replace("_", " ", sql_quote($t['filename'])) . " where (type_entite = 'INDETERMINE' or type_entite='Personnalités') and entite=" . sql_quote($e) . "\n"; echo $up . "\n"; sql_query($up); echo "\n\n"; } } } } exit; } if ($restart !== "non") { $output->writeln("<info>On efface tout et on recommence.</info>"); sql_query("truncate table entites_nommees"); } // articles deja faits $articles_faits = array("0"); $articles_sql = sql_allfetsel("id_article", "entites_nommees", "", "id_article"); foreach ($articles_sql as $a) { $articles_faits[] = $a['id_article']; } // chopper les articles non déjà faits ; $articles = sql_query("select a.id_article from spip_articles a where a.statut !='prepa' and a.id_secteur=" . _SECTEUR_ENTITES . " and a.id_article not in(" . implode(",", $articles_faits) . ") order by a.date_redac desc limit 0,1000"); $res = sql_fetch_all($articles); // start and displays the progress bar $progress = new ProgressBar($output, sizeof($res)); $progress->setBarWidth(100); $progress->setRedrawFrequency(1); $progress->setMessage("Génération des entités nommées...", 'message'); /**/ $progress->start(); foreach ($res as $a) { $art = sql_fetsel("id_article, titre, chapo, texte, date_redac", "spip_articles", "id_article=" . $a['id_article']); $m = substr(" Traitement de l'article " . $art['id_article'] . " (" . $art['date_redac'] . ")", 0, 100); $progress->setMessage($m, 'message'); // Trouver et enregistrer les entites nommées include_spip("entites_fonctions"); $texte = preparer_texte($art['titre'] . " // \n" . $art['chapo'] . " // \n" . $art['texte'] . "\n"); $fragments = trouver_entites($texte, $art['id_article']); enregistrer_entites($fragments, $art['id_article']); // Si tout s'est bien passé, on avance la barre $progress->setFormat("<fg=white;bg=blue>%message%</>\n" . '%current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%' . "\n\n"); $progress->advance(); } ## FIN $output->writeln("<info>Check des entités : done.</info>"); $output->writeln("\n\nMerci bien.\n"); } } else { $output->writeln('<error>Vous n’êtes pas dans une installation de SPIP. Impossible de convertir le texte.</error>'); } }