Page 1 sur 1

chercher les finales des mots pour faire des rimes

Posté : 31 juil. 2013, 11:23
Bonjour,
Dans ma base de données qui contient les mots d'un dictionnaire d'OC,
je souhaite extraire les mots ayant la même terminaison afin de pouvoir les utiliser pour des poésies.
Ma base est MySQL, et j'utilise Php, (mais une ancienne version).

Comment écrire la requête pour sélectionner par exemple les 4 dernières lettres des mots ?
Merci de l'aide que vous pouvez m'apporter.
Voir l'état actuel de mon site :
http://www.ubaye-verdon.net/provence/index.php

Re: chercher les finales des mots pour faire des rimes

Posté : 31 juil. 2013, 20:08
par Iguane
Bon, voici un petit script qui fonctionne normalement, teste-le en modifiant la requête avec tes champs et oublie pas d'initialiser les variables avec ton host, ton utilisateur et ton mot de passe :
<?php
	/* à toi de choisir le nombre de lettres que doit vérifier la rime, 
	   ici 4 lettres (garde le '-' devant , important !'). */
	define("NOMBRE_LETTRES_RIME", -4);

	$ton_host        = "mysql:host=localhost;dbname=nomBdd";
	$ton_utilisateur = "";
	$ton_mdp         = "";
	$requete         = "SELECT champ_mot FROM table_mots ORDER BY champ_mot";
	$tableau_mots    = array();
	$tableau_rimes   = array();

	$bdd             = get_bdd($ton_host,$ton_utilisateur,$ton_mdp);	
	$donnees_brut    = $bdd->query($requete);

	remplir_mots_bdd($donnees_brut, $tableau_mots);
	remplir_rimes($tableau_mots, $tableau_rimes);
	afficher_rimes($tableau_rimes);

	// Fonctions --------------------------------
	
	/**
	 * Remplit le tableau avec les mots de ta bdd
	 * @param  [array] $donnees_brut [Données issues de ta BDD]
	 * @param  [array] $tableau_mots [Tableau final]
	 * @return [rien]               [Tableau envoyé par référence]
	 */
	function remplir_mots_bdd($donnees_brut, &$tableau_mots){
		while($ligne = $donnees_brut->fetch()){
			array_push($tableau_mots, $ligne['champ_mot']);
		}
	}

	/**
	 * Retourne une instance de PDO
	 * @param  [string] $host     [ton hôte]
	 * @param  [string] $user     [ton utilisateur]
	 * @param  [string] $password [ton mot de passe]
	 * @return [PDO object]       [instance de la classe PDO]
	 */
	function get_bdd($host, $user, $password) {
	    try {
	        $bdd = new PDO($host, $user, $password);
	    } catch (Exception $e) {
	        die("Erreur instanciation PDO");
	    }
	    return $bdd;
	}

	/**
	 * Remplit le tableau avec les rimes éventuelles
	 * De la forme array(array(mot1,mot2), array(mot3,mot4), ...)
	 * @param  [array] $tableau_mots  [le tableau avec 
	 *                 tous les mots de ta bdd]
	 * @param  [array] $tableau_rimes [Le tableau 
	 *                 contenant les rimes]
	 * @return [rien]  [Tableau envoyé par référence]
	 */
	function remplir_rimes($tableau_mots, &$tableau_rimes){
		foreach ($tableau_mots as $id => $mot) {
			foreach($tableau_mots as $id2 => $mot2){
				if(($mot!=$mot2) && !in_array($mot, $tableau_rimes)){
					if(verifier_rime($mot, $mot2, NOMBRE_LETTRES_RIME))
						array_push($tableau_rimes, array($mot, $mot2));
				}
			}
		}
	}

	/**
	 * Vérifie l'éventuelle rime entre les 2 mots
	 * @param  [string] $mot             [description]
	 * @param  [string] $mot2            [description]
	 * @param  [int] $nb_lettres_rime [Constante 
	 *                              définissant le nombre 
	 *                              de letres que doit 
	 *                              vérifier la rime]
	 * @return [type]                  [Retourne vrai ou faux]
	 */
	function verifier_rime($mot, $mot2, $nb_lettres_rime){
		if(substr($mot, $nb_lettres_rime) == substr($mot2, $nb_lettres_rime))
			return true;
		return false;
	}

	/**
	 * [Affiche toutes les rimes trouvées]
	 * @param  [array] $tableau_rimes [Tableau des rimes]
	 * @return [rien]                [affichage simple]
	 */
	function afficher_rimes($tableau_rimes){
		foreach ($tableau_rimes as $id => $tab) {
			echo $tab[0].' rime avec '.$tab[1].'<br />';
		}
	}

?>
Je sais pas comment tu veux afficher tout ça donc je t'ai fait un truc tout simple à toi de choisir ensuite.

Re: chercher les finales des mots pour faire des rimes

Posté : 01 août 2013, 08:05
par sirakawa
$terminaison = "able";
$requete = "select * from mots where mot like '**terminaison';"

Re: chercher les finales des mots pour faire des rimes

Posté : 18 nov. 2013, 00:25
par lavercq
Merci, c'est très aimable, mais,
je crains de ne pouvoir utiliser ce script qui me paraît être du php objet...
Or, mon serveur tourne sur une version plus ancienne de php.
Je pensais plutôt à une expression régulière ou perl ...?
Qu'en dites-vous ?

Re: chercher les finales des mots pour faire des rimes

Posté : 18 nov. 2013, 01:00
par lavercq
$terminaison = "able";
$requete = "select * from mots where mot like '**terminaison';"
Je vous remercie, oui, mais, comment définir ou préciser "terminaison"...?
à la fois dans la demande, et ensuite, pour sélectionner des mots dans la base...!
Je crois qu'il faut utiliser une expression régulière...

Re: chercher les finales des mots pour faire des rimes

Posté : 19 nov. 2013, 12:53
par sirakawa
Saisie.html
<html>
<form metnod = 'post' action= 'chercher.php'>
<label for='rime'>Rime cherchée</label>
<input type = 'text'  required = 'required' />
<button type = 'submit'>Chercher des rimes</button>
</form>
chercher.php
<?PHP
/*on suppose la connexion faite*/
/*valeur bidon et introuvable au cas où il n'y aurait rien dans $_POST*/
$rime_cherchee = isset($_POST['rime']) ? $_POST['rime']: "9999";
/*si tu mets %$rime_cherchee% tu auras des rimes intérieures aussi; tu peux mettre %$rime_cherchee# pour une seule lettre apès la rime
$requete = "SELECT mot from mots where mot like '%$rime_cherchee'";
$resultat = mysqli_query($requete);
?>

Re: chercher les finales des mots pour faire des rimes

Posté : 20 nov. 2013, 22:44
par lavercq
Merci infiniment ! =D>
C'est bon, ça marche, voici la ligne :
$requete = "SELECT * FROM Table WHERE mots like '%$rime' order by mots ";}

Re: chercher les finales des mots pour faire des rimes

Posté : 21 nov. 2013, 13:49
par sirakawa
Tu devrais pouvoir t'amuser avec ÷
rime surabondante et compagnie
si tu as des accents dans ta base de données sers-toi de mb

<?PHP
mb_internal_encoding( 'UTF-8'); //gère correctement les accents
$mysqli = new mysqli("localhost", "root", "", "lexique");
//$rime = $_POST['rime'];
$rime = "toit";
$longueur = mb_strlen($rime);
$rimes = array();
switch ($longueur)
{
case "4":
$rimes []= mb_substr($rime, -1);
$rimes []= mb_substr($rime, -2);
$rimes []= mb_substr($rime, -3);
$rimes []= mb_substr($rime, -4);
break;
case "3":
$rimes []= mb_substr($rime, -1);
$rimes []= mb_substr($rime, -2);
$rimes []= mb_substr($rime, -3);
break;
case "2":
$rimes []= mb_substr($rime, -1);
$rimes []= mb_substr($rime, -2);
break;
case "1":
$rimes []= mb_substr($rime, -1);
break;
}
$forces = array(
"pauvre",
"suffisante",
"riche",
"surabondante",
);




for ($i = 0; $i < $longueur; $i++)
{
$la_force = $forces[$i];
$la_rime = $rimes[$i];
$requete = "select mot from mots where mot like '%$la_rime' limit 100";
print "<br>$requete<br>";
print "<h2>$la_force</h1>";
$res = $mysqli->query($requete);
$res->data_seek(0);
while ($row = $res->fetch_assoc())
{
echo $row['mot'] . "<br />";
}

}


?>