Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1216 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Trouver une chaine dans une phrase

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL] Trouver une chaine dans une phrase

n°2358511
tomware
Moteur à eau
Posté le 23-07-2020 à 00:11:34  profilanswer
 

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
mood
Publicité
Posté le 23-07-2020 à 00:11:34  profilanswer
 

n°2358531
rufo
Pas me confondre avec Lycos!
Posté le 23-07-2020 à 13:02:53  profilanswer
 

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 Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2358549
pluj
Posté le 23-07-2020 à 21:37:17  profilanswer
 

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
n°2358550
rufo
Pas me confondre avec Lycos!
Posté le 23-07-2020 à 22:11:32  profilanswer
 

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 Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2358556
tomware
Moteur à eau
Posté le 24-07-2020 à 08:08:22  profilanswer
 

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
n°2358560
rufo
Pas me confondre avec Lycos!
Posté le 24-07-2020 à 08:54:11  profilanswer
 

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 Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2358573
tomware
Moteur à eau
Posté le 24-07-2020 à 13:15:26  profilanswer
 

cela reste intéressant malgré tout merci


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Trouver une chaine dans une phrase

 

Sujets relatifs
Proposition playlist Youtube SQL/Powershell/Postgres[SQL] Comment passer de lignes par dates à des lignes par période
Créer et gérer des EditText "à la chaine" [résolu]requête SQL en php
SQL DISTINCT requete spéciale (POSTGRESQL)Sql Server Jointure entre table sur 2 BDD
Extraire un mot entre deuxvirgules dans une chaineméthode pour trouver les répertoires qui ne contiennent pas
[SQL][SGBD] Base sur le SGBD ?SQL: Bonnes pratiques et conventions
Plus de sujets relatifs à : [SQL] Trouver une chaine dans une phrase


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR