[SQL] Trouver une chaine dans une phrase

Trouver une chaine dans une phrase [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 23-07-2020 à 00:11:34    

Bonjour a tous  :hello:  
 
J'ai un petit site codé a la main qui permet aux visiteurs de poster ce qu'ils veulent.
 [:lolo_78] Je souhaite qu'a chaque post, la chaine soit analysée et comparée a une liste de chaines dans une base de donnée, et attribuer ainsi une catégorie au post.
 
Voici ma structure de tables :
 
Table : categorie
categorie_id | categorie_denomination

1 | blagues de toto a la plage  
2 | blagues de toto a la montagne

 
Table : post_prediction
post_prediction_id | post_prediction_chaine | post_prediction_categorie_id

1 | mets son maillot de bain | 1
2 | regarde la montagne | 2

Table : post
post_id | post | post_categorie_id

1 | on est lundi, c'est toto qui mets son maillot de bain et qui plonge dans l'eau | Null
2 | quelle belle journée pour toto il regarde la montagne | Null

 
L'utilisateur va donc poster la chaine suivante : "on est lundi, c'est toto qui mets son maillot de bain et qui plonge dans l'eau". Et ainsi j'aimerai automatiquement le classer dans "toto a la plage".  
 
Mon fichier php va recupérer le post et faire une requette SQL
SELECT * FROM `post_prediction` WHERE `post_prediction_chaine` LIKE '%on est lundi, c'est toto qui mets son maillot de bain et qui plonge dans l'eau%'
 
Sauf que je me rends compte que l'operateur like ne trouve pas de résultat.  
 
D'où ma question, comment trouver une chaine dans une phrase via mysql :)
 
 En vous remerciant par avance  :jap:
 
ps : ca ne me dérange pas d'avoir dans post_prediction des chaines avec des tirets si cela est plus simple pour la recherche. exemple : mets-son-maillot-de-bain car je renverai mon post avec des tirets si necessaire.


Message édité par tomware le 23-07-2020 à 00:27:24
Reply

Marsh Posté le 23-07-2020 à 00:11:34   

Reply

Marsh Posté le 23-07-2020 à 13:02:53    

Je te recommande d'implémenter un algo de type LSA : https://fr.wikipedia.org/wiki/Analy [...] ue_latente
 
Pour la phase de lemnisation, tu peux utiliser la BD Lexique3.org.
 
Moi, j'ai codé cet algo pour détecter des tickets identiques, similaires ou corrélés pour mon outil de help-desk Astres (cf ma signature). Par contre, mon implémentation n'est pas sous licence GPL. Tu ne la trouveras donc pas dans mon projet.


---------------
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 23-07-2020 à 21:37:17    

Salut,
 

Code :
  1. SELECT * FROM `post_prediction` WHERE `post_prediction_chaine` LIKE '%on est lundi, c'est toto qui mets son maillot de bain et qui plonge dans l'eau%'


Ce serait plutôt l'inverse :

Code :
  1. SELECT * FROM `post_prediction` WHERE "on est lundi, c'est toto qui mets son maillot de bain et qui plonge dans l'eau" LIKE CONCAT('%', post_prediction_chaine, '%')


Non ?
 
Par contre, niveau pertinence, ça ne va pas casser des briques :

  • des % dans les prédictions vont tout fausser
  • la sous-chaîne doit exactement matcher (les mots je veux dire, les mêmes et dans le même ordre - tu peux toujours ignorer casse/accent - et rien qu'une faute d'orthographe et "ça marche pu" )
  • plus la phrase à chercher est courte moins ce sera probant


Sans aller jusqu'à "réinventer la roue", il n'y a pas moyen de se baser sur un fulltext search ? Faire un MATCH AGAINT post_prediction_chaine et prendre la ligne avec le plus gros score de pertinence (si celui-ci dépasse un score minimal pré-établi) ? Je ne dis pas que ce sera 100 % accurate non plus mais je pense que ce serait déjà au moins 1000 fois mieux qu'une solution à base de LIKE (autant pour les performances que pour la pertinence).


Message édité par pluj le 23-07-2020 à 21:45:31
Reply

Marsh Posté le 23-07-2020 à 22:11:32    

D'où ma proposition d'une implémentation de l'algo LSA. Lemnisation des textes, normalisation des valeurs avec un TF-Idf puis un calcul de la matrice des covariances pour avoir le taux de corrélation entre chacun des vecteurs.
C'est 1000 fois mieux que le Like et moins hasardeux que le match against ;)


---------------
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 24-07-2020 à 08:08:22    

Bonjour a tous,
 
@rufo : ok, je vais regarder tout ca de plus près merci pour l'idée :)
 
@pluj : La requette fonctionne bien merci !  
Je n'ai pas le niveau, je pense ecrire dans la bdd les phrases avec les fautes d'orthographe a la main s'il le faut.  
 

Citation :

Sans aller jusqu'à "réinventer la roue", il n'y a pas moyen de se baser sur un fulltext search ? Faire un MATCH AGAINT post_prediction_chaine et prendre la ligne avec le plus gros score de pertinence (si celui-ci dépasse un score minimal pré-établi) ? Je ne dis pas que ce sera 100 % accurate non plus mais je pense que ce serait déjà au moins 1000 fois mieux qu'une solution à base de LIKE (autant pour les performances que pour la pertinence).


 
Je vais regarder cela en profondeur. Comme mon niveau n'est pas élevé, je n'y ai pas pensé.
 
Merci de m'avoir aidé :)


Message édité par tomware le 24-07-2020 à 08:08:46
Reply

Marsh Posté le 24-07-2020 à 08:54:11    

C'est sûr que match against est à privilégier par rapport au LIKE ou dès qu'une seule différence de caractères va être présente, la requête renverra rien.
L'algo LSA est une sorte de match against en beaucoup plus élaboré. En plus, il permet si on le souhaite de supprimer les stop-words (petits mots de liaison qui ont peu d'importance, genre les le, la, les, l', n', d', à...). Mais si ton niveau en BD et dév est faible, ça risque d'être hors de ta portée :/


---------------
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 24-07-2020 à 13:15:26    

cela reste intéressant malgré tout merci

Reply

Sujets relatifs:

Leave a Replay

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