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;
}
示例#2
0
 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>');
     }
 }