lier les mots d'un texte à un dictionnaire

lier les mots d'un texte à un dictionnaire - PHP - Programmation

Marsh Posté le 08-08-2014 à 12:41:41    

Bonjour,
 
Je cherche comment m'y prendre pour obtenir un texte dont les mots cliquables seraient reliés à un dictionnaire.
Je pense qu'il faudrait utiliser une régex pour retirer la ponctuation du texte, puis faire un explode pour récupérer les mots du texte.
 
Ensuite il faudrait vérifier si chaque mot existe dans le dictionnaire et si oui créer un lien sur le mot vers le dictionnaire.
 
(c'est la partie la plus importante, mais je vois pas trop comment faire...).
La première idée qui me vient à l'esprit serait de faire une boucle sur l'array (qui contient chaque mot) avec des requêtes sql, mais bon ça doit être un peu lourd :/
 
Un peu dans le même ordre d'idées, dans les articles de lemonde.fr, lorsque vous cliquez sur les verbes d'un article, vous êtes redirigé vers un site avec les différentes conjugaisons du verbe sur lequel vous avez cliqué.
 
L'intérêt est ensuite de ne pas avoir à donner la définition de chaque mot à chaque fois de façon statique, mais que ça puisse se faire automatiquement par détection.
 
Pour l'instant il n'y a pas de dictionnaire, je vais le créer après si j'arrive à faire ça.
Voilà et au passage si vous pensez qu'il serait mieux de faire cela dans un autre langage, merci de me l'indiquer.

Reply

Marsh Posté le 08-08-2014 à 12:41:41   

Reply

Marsh Posté le 08-08-2014 à 16:06:49    

J'ai codé un truc similaire en php. $sArticle contient tout le texte à analyser et enrichir.
 
$ArrayWords = preg_split("/[\s,\.\(\)\/:><+]+/", $sArticle, -1, PREG_SPLIT_OFFSET_CAPTURE);
$ArrayWordsToReplace = array();
 
Avec ça, tu obtiens les mots seuls dans un tableau. Pour conserver les mots de manière unique, histoire de pas rechercher le même mot x fois :
$ArrayWords = array_unique($ArrayWords);
 
Ensuite, tu parcours ton tableau de mots. Pour chaque mot, tu le "nettoies" avec un str_replace() afin de retirer les "d'", "n'", "qu'" et "l'" et les guillemets. Après, tu voudras peut-être pas forcément mettre un lien sur tous les mots ayant "peu" de sens comme "ce", "son", "sa", "la", "le", "un", "une", "quel", "quelle", "celui", "celle"...
Là, tu vas avoir le mot dont il faut rechercher le lemme (ex : pour un verbe, sa forme à l'infinitif, pour un nom commun, sa forme masculin singulier). Pour obtenir le lemme associé à un mot, il existe une base sympa pour avoir pleins d'infos sur un mot, dont le lemme : Lexique.org ( http://www.lexique.org/telLexique.php ), la v3.80, que tu pourras facilement transformer en BD Mysql. Par contre, y'a pas la déf, il me semble ;)
 
Une fois le lemme obtenu, il te faudra aller sur un site ou une autre BD afin d'obtenir la déf. Une fois la déf obtenue, tu vas générer le code HTML qui remplacera le mot de l'article par le mot + sa déf représentée en html et tu le stockera dans un buffer, associé au mot à replacer. Ex :

Code :
  1. foreach($ArrayWords as $w => $CurrentWord)
  2. {
  3.    $CurrentWord = strtolower($CurrentWord);
  4.  
  5.    // On fait là tout le traitement de lemnisation et recherche
  6.    if (!in_array($CurrentWord, $ArrayWordsToReplace))
  7.    {
  8.        // On fait le test d'unicité car l'étape de lemnisation peu te donner le même mot
  9.        $ArrayWordsToReplace[$CurrentWord] = "<dfn title=\"$sDefinitionTrouvee\"">$CurrentWord</dfn>";
  10.    }
  11. }


 
A la fin, pour remplacer tous les mots par leur déf, tu feras :
$sArticle = str_ireplace(array_keys($ArrayWordsToReplace), array_values($ArrayWordsToReplace), $sArticle);
 
Voilà en gros la trame de l'algo.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 08-08-2014 à 16:43:24    

Franchement, un grand merci pour toutes ces infos :)
Et j'avais pas pensé à l'unicité, mais c'est cool, ça permet d'éviter les requêtes inutiles.

Reply

Marsh Posté le 08-08-2014 à 16:58:18    

Pas de quoi ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 12-08-2014 à 17:02:40    

Quelles requêtes inutiles? Tu récupères tous tes mots du dictionnaire d'un coup que tu places dans un array, tu ne vas pas consulter ta bdd à chaque mon de ton texte, parce que là oui ça va être un massacre.

Reply

Marsh Posté le 24-08-2014 à 20:47:51    

requête inutile = rechercher x fois le même mot qui apparaîtrait plusieurs fois dans l'article.
Il vaut mieux faire la recherche dans la BD car un dico entier (environ 300000 mots pour Lexique3) dans un array, ça va ramer grave en PHP et faire exploser la RAM.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-08-2014 à 14:14:07    

Évidemment mais je ne vois pas qui aurait besoin de 300000 mots, même s'il veut utiliser une bibliothèque il a intérêt à ne garder que les mots qui l'intéresse. Enfin après je ne connais pas la finalité.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 30-08-2014 à 19:23:57    

Une BD de 300000 comme Lexique3, ça prend seulement qq Mo et très rapide à exploiter quand transformée en BD Mysql. Vu que c'est pour des articles, il y aura un grand nb de mots (avec toutes leurs formes conjuguées ou déclinées). Il va pas s'amuser à virer ce qui ne lui sert pas car bien difficile d'évaluer les mots utilisés par les auteurs et ça serait bien long à faire. En plus, le jour où un auteur va utiliser un mot non présent dans le dico, faudra le remettre.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed