Browse Source

Création

master
Ventricule 2 years ago
parent
commit
9aa1507775
  1. 13
      README.md
  2. 32
      formulaires/configurer_mots_automatiques.html
  3. 36
      formulaires/configurer_mots_automatiques.php
  4. BIN
      images/mots_automatiques.png
  5. 35
      images/mots_automatiques.svg
  6. 20
      lang/mots_automatiques_fr.php
  7. 14
      lang/paquet-mots_automatiques_fr.php
  8. 90
      mots_automatiques_administrations.php
  9. 65
      mots_automatiques_fonctions.php
  10. 91
      mots_automatiques_pipelines.php
  11. 27
      paquet.xml
  12. 7
      prive/squelettes/contenu/configurer_mots_automatiques.html

13
README.md

@ -1,2 +1,15 @@
# spip_mots_automatiques
Un plugin pour extraire automatiquement les mots-clefs des articles
**Toute aide bienvenue pour finaliser ce plugin !**
**Ça fonctionne comme ça :**
- À l’installation ça crée une catégorie de mots-clés dédiés avec des paramètres par défaut.
- La page config permet de choisir le nombres de mots-clés voulus et la méthode d’extraction (on a que l’api Yake pour l’instant, mais c’est facile d’en rajouter).
- Quand on enregistre un article ça vérifie si les mots-clés auto on déjà été recherchés et sinon ça lance l’extraction, ajoute les nouveaux mots et fais les associations.
## Carte routière
**Il y a deux choses sur lesquels je bloque :**
- Je n’arrive pas à utiliser le pipeline post_edition, je suis toujours sur pre_edition et si je change ça ne marche plus.
- J’aimerais lancer la recherche sur tous les articles déjà existant et vu la taille j’aimerais mieux éviter de le faire à la main ! Est-ce qu’il y a une fonction qui permettrait de réenregistrer tous les articles ?

32
formulaires/configurer_mots_automatiques.html

@ -0,0 +1,32 @@
<div class="formulaire_spip formulaire_configurer formulaire_#FORM">
<h3 class="titrem"><:mots_automatiques:cfg_titre_parametrages:></h3>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
<form method="post" action="#ENV{action}">
<div>
#ACTION_FORMULAIRE{#ENV{action}}
<label>Nombre de mots-clés à extraire automatiquement :</label><br/>
[<span class='erreur'>(#ENV**{erreurs}|table_valeur{nombre_mots_automatiques})</span>]
<div style="display:flex">
<output name="result" style="padding:1rem;">#ENV{nombre_mots_automatiques}</output>
<input type="range" style="flex:1;" name="nombre_mots_automatiques" min="0" max="30" step="1" value="#ENV{nombre_mots_automatiques}" oninput="result.value=parseInt(nombre_mots_automatiques.value)"/>
</div>
<br/>
<label>Méthode d'extraction des mots-clés :</label><br/>
[<span class='erreur'>(#ENV**{erreurs}|table_valeur{extracteur})</span>]
<select name="extracteur" style="margin: 1rem 0;">
<option value="api_yake" [(#ENV{extracteur}|match{api_yake}|oui)selected]>API Yake</option>
</select>
<br/>
<br/>
<input type="hidden" name="_meta_casier" value="mots_automatiques" />
<p class="boutons"><span class="image_loading">&nbsp;</span><input type="submit" class="submit" value="<:bouton_enregistrer:>" /></p>
</div>
</form>
</div>

36
formulaires/configurer_mots_automatiques.php

@ -0,0 +1,36 @@
<?php
function formulaires_configurer_mots_automatiques_charger_dist(){
$valeurs['nombre_mots_automatiques'] = lire_config('mots_automatiques/nombre_mots_automatiques');
$valeurs['extracteur'] = lire_config('mots_automatiques/extracteur');
$valeurs['id_groupe'] = lire_config('mots_automatiques/id_groupe');
return $valeurs;
}
function formulaires_configurer_mots_automatiques_verifier_dist(){
$erreurs = array();
// verifie que les champs obligatoires sont bien la :
foreach(array('nombre_mots_automatiques', 'extracteur') as $obligatoire)
if (!_request($obligatoire)) $erreurs[$obligatoire] = 'Ce champ est obligatoire';
// verifie que le nombre de mots-clés automatique est valide :
$nombre_mots_automatiques = intval(_request('nombre_mots_automatiques'));
if ($nombre_mots_automatiques < 0 || $nombre_mots_automatiques > 30)
$erreurs['nombre_mots_automatiques'] = 'Veuillez choisir un chiffre entre 0 et 30';
// verifie qu'un extracteur valide a été selectionné' :
$extracteur = _request('extracteur');
$extracteurs = array('api_yake');
if (!in_array($extracteur, $extracteurs))
$erreurs['extracteur'] = "L'extracteur choisi n'est pas valide.";
if (count($erreurs))
$erreurs['message_erreur'] = 'Votre saisie contient des erreurs !';
return $erreurs;
}
function formulaires_configurer_mots_automatiques_traiter_dist(){
ecrire_config('mots_automatiques/nombre_mots_automatiques', _request('nombre_mots_automatiques'));
ecrire_config('mots_automatiques/extracteur', _request('extracteur'));
return array('message_ok'=>'La nouvelle configuration a été enregistrée');
}

BIN
images/mots_automatiques.png

After

Width: 64  |  Height: 64  |  Size: 2.2 KiB

35
images/mots_automatiques.svg

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F2F2F2;}
.st1{fill:none;stroke:#B22BA4;stroke-width:6;stroke-miterlimit:10;}
.st2{opacity:0.7;fill:none;stroke:#B22BA4;stroke-width:3;stroke-miterlimit:10;}
.st3{fill:none;stroke:#FBB03B;stroke-width:6;stroke-miterlimit:10;}
.st4{fill:none;stroke:#FBB03B;stroke-width:6;stroke-linecap:round;stroke-miterlimit:10;}
.st5{opacity:0.4;fill:#FFFFFF;}
.st6{fill:#FFFFFF;}
</style>
<g id="Calque_3">
<path class="st0" d="M44,64H20C8.95,64,0,55.05,0,44V20C0,8.95,8.95,0,20,0h24c11.05,0,20,8.95,20,20v24C64,55.05,55.05,64,44,64z"
/>
</g>
<g id="Calque_1">
<g>
<line class="st1" x1="12" y1="15.25" x2="52" y2="15.25"/>
<line class="st2" x1="12" y1="25.88" x2="52" y2="25.88"/>
<line class="st2" x1="12" y1="32.5" x2="52" y2="32.5"/>
<line class="st2" x1="12" y1="39.13" x2="52" y2="39.13"/>
<line class="st2" x1="12" y1="45.75" x2="52" y2="45.75"/>
<line class="st2" x1="12" y1="52.75" x2="52" y2="52.75"/>
</g>
</g>
<g id="Calque_2">
<circle class="st3" cx="36" cy="27" r="19"/>
<line class="st4" x1="23" y1="41" x2="4" y2="60"/>
<line class="st4" x1="18" y1="42" x2="22" y2="46"/>
<circle class="st5" cx="38" cy="29" r="11"/>
<circle class="st6" cx="43.5" cy="32.5" r="4.5"/>
</g>
</svg>

20
lang/mots_automatiques_fr.php

@ -0,0 +1,20 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// M
'mots_automatiques_titre' => 'Mots Automatiques',
// C
'cfg_exemple' => 'Exemple',
'cfg_exemple_explication' => 'Explication de cet exemple',
'cfg_titre_parametrages' => 'Paramétrages',
// T
'titre_page_configurer_mots_automatiques' => 'Mots Automatiques',
);

14
lang/paquet-mots_automatiques_fr.php

@ -0,0 +1,14 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// M
'mots_automatiques_description' => '',
'mots_automatiques_nom' => 'Mots Automatiques',
'mots_automatiques_slogan' => '',
);

90
mots_automatiques_administrations.php

@ -0,0 +1,90 @@
<?php
/**
* Fichier gérant l'installation et désinstallation du plugin Mots Automatiques
*
* @plugin Mots Automatiques
* @copyright 2020
* @author Pierre Tandille
* @licence GNU/GPL
* @package SPIP\Mots_automatiques\Installation
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function mots_automatiques_create() {
}
/**
* Fonction d'installation et de mise à jour du plugin Mots Automatiques.
*
* @param string $nom_meta_base_version
* Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
* @param string $version_cible
* Version du schéma de données dans ce plugin (déclaré dans paquet.xml)
* @return void
**/
function mots_automatiques_upgrade($nom_meta_base_version, $version_cible) {
include_spip('inc/config');
include_spip('action/editer_groupe_mots');
// Vérifier la présence d'un groupe de mots-clés pour Mots Automatiques
if( $sql = sql_fetsel("id_groupe", "spip_groupes_mots", "titre='Mots Automatiques'") ):
$id_groupe = $sql['id_groupe'];
// Sinon créer un groupe de mots-clés
else:
$id_groupe = lire_config('mots_automatiques/id_groupe') ;
if( !$id_groupe || !sql_countsel("spip_groupe_mots", "id_groupe=$id_groupe")) :
$set = array(
'titre' => 'Mots Automatiques',
'unseul' => 'non',
'obligatoire' => 'non',
'tables_liees' => 'articles',
'minirezo' => 'non',
'comite' => 'non',
'forum' => 'non',
'technique' => 'oui'
);
$id_groupe = groupe_mots_inserer('articles', $set);
endif;
endif;
$maj = array();
$maj['create'] = array(
array('ecrire_config', 'mots_automatiques/id_groupe', $id_groupe),
array('ecrire_config', 'mots_automatiques/nombre_mots_automatiques', 20),
array('ecrire_config', 'mots_automatiques/extracteur', 'api_yake'),
);
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}
/**
* Fonction de désinstallation du plugin Mots Automatiques.
*
* @param string $nom_meta_base_version
* Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
* @return void
**/
function mots_automatiques_vider_tables($nom_meta_base_version) {
/* Option : supprimer les mots clés au moment de désinstaller -> bloqué par le système d'autorisations
include_spip('action/supprimer_groupe_mots');
action_supprimer_groupe_mots_dist(lire_config('mots_automatiques/id_groupe'));
*/
include_spip('inc/config');
effacer_config('mots_automatiques/nombre_mots_automatiques');
effacer_config('mots_automatiques/id_groupe');
effacer_meta($nom_meta_base_version);
}

65
mots_automatiques_fonctions.php

@ -0,0 +1,65 @@
<?php
/**
* Déclarations de balises pour les squelettes
*
* @package SPIP\Cextras\Fonctions
**/
// sécurité
if (!defined("_ECRIRE_INC_VERSION")) return;
/**
* Retourne les mots clefs extrais avec l'API Yake
*
*
* @param String $texte
* Le texte à analyser
* @param String $nombre
* Le nombre de mots à retourner
* @param String $extracteur
* Le nom de l'extracteur
* @return Array
* Les mots-clés sous forme de tableau
**/
function mots_automatiques_extraire($texte, $nombre, $extracteur) {
switch ($extracteur) :
case "api_yake" :
// Appel de l'API YAKE
$curl = curl_init();
$params = array(
'content' => $texte
);
$params_string = http_build_query($params);
$opts = [
CURLOPT_URL => "http://yake.inesctec.pt/yake/v2/extract_keywords?max_ngram_size=2&number_of_keywords=$nombre",
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $params_string,
CURLOPT_RETURNTRANSFER => true,
];
curl_setopt_array($curl, $opts);
$curl_response = curl_exec($curl);
$response = json_decode($curl_response, true);
$http_status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if($http_status == 200 && is_array($response)) :
// Créer un tableaux de mot-clés automatiques
$mots = array();
$keywords = $response['keywords'];
foreach($keywords as $keyword):
$mots[] = $keyword['ngram'];
endforeach;
return $mots;
endif;
break;
endswitch;
}

91
mots_automatiques_pipelines.php

@ -0,0 +1,91 @@
<?php
/**
* Utilisations de pipelines par Mots Automatiques
*
* @plugin Mots Automatiques
* @copyright 2020
* @author Pierre Tandille
* @licence GNU/GPL
* @package SPIP\Mots_automatiques\Pipelines
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function mots_automatiques_pre_edition($flux) {
if (is_array($flux) and isset($flux['args']['type']) && $flux['args']['type'] == 'article') :
include_spip('inc/filtres');
include_spip('inc/config');
include_spip('action/editer_liens');
// ID de l'article en cours d'édition
$id_article = $flux['args']['id_objet'];
// ID du groupe mots automatiques
$id_groupe = lire_config('mots_automatiques/id_groupe');
// Nombre de mot-clés voulu
$nombre_mots_automatiques = lire_config('mots_automatiques/nombre_mots_automatiques');
// Extracteur choisi
$extracteur = lire_config('mots_automatiques/extracteur');
// Sélectionner tous les mots automatiques attribués à l'article
$result = sql_select('liens.id_mot', 'spip_mots_liens AS liens JOIN spip_mots AS mots ON liens.id_mot=mots.id_mot', array("liens.id_objet=$id_article", "mots.id_groupe=$id_groupe"));
$mots_automatiques = sql_fetch($result);
// Si le nombre de mots automatiques est différent du nombre voulu, refaire l'extration
if(sizeof($mots_automatiques) != $nombre_mots_automatiques) :
// Supprime le lien avec les anciens mots automatiques
$mots_groupe = sql_allfetsel('id_mot', 'spip_mots', "id_groupe=$id_groupe");
$mots_groupe = array_map('reset', $mots_groupe);
objet_dissocier(array('mot' => $mots_groupe), array('article' => $id_article));
// Extraire les mots-clés
$texte = supprimer_tags(propre($flux['data']['texte']));
$mots = mots_automatiques_extraire($texte, $nombre_mots_automatiques, $extracteur);
// Ajouter et/ou associer les mots
foreach ($mots as $mot) :
// Cherche si le mot existe déjà
$row = sql_fetsel('id_mot', 'spip_mots', array("id_groupe=$id_groupe", "titre='$mot'"));
if($row) :
// Associer le mot
objet_associer(array('mot' => $row['id_mot']), array('article' => $id_article));
else:
// Trouver le nom du groupe (type)
$row = sql_fetsel('titre', 'spip_groupes_mots', "id_groupe=$id_groupe");
if ($row) :
// Ajouter le mot
$champs = array(
'id_groupe' => $id_groupe,
'type' => $row['titre'],
'titre' => $mot
);
$id_mot = sql_insertq('spip_mots', $champs);
// Associer le mot
objet_associer(['mot' => $id_mot], ['article' => $id_article]);
endif;
endif;
endforeach;
endif;
endif;
return $flux;
}

27
paquet.xml

@ -0,0 +1,27 @@
<paquet
prefix="mots_automatiques"
categorie="navigation"
version="1.0.0"
etat="dev"
compatibilite="[3.2.4;3.2.*]"
logo="images/mots_automatiques.png"
documentation=""
schema="1.0.0"
>
<!--
Paquet généré le 2020-01-16 22:22:40
-->
<nom>Mots Automatiques</nom>
<auteur>Pierre Tandille</auteur>
<licence>GNU/GPL</licence>
<necessite nom="mots_techniques" compatibilite="[1.0.0;[" />
<necessite nom="mots" compatibilite="[2.4.6;[" />
<pipeline nom="pre_edition" inclure="mots_automatiques_pipelines.php" />
</paquet>

7
prive/squelettes/contenu/configurer_mots_automatiques.html

@ -0,0 +1,7 @@
[(#AUTORISER{configurer,_mots_automatiques}|sinon_interdire_acces)]
<h1 class="grostitre"><:mots_automatiques:titre_page_configurer_mots_automatiques:></h1>
<div class="ajax">
#FORMULAIRE_CONFIGURER_MOTS_AUTOMATIQUES
</div>
Loading…
Cancel
Save