Page 1 sur 2

Insérer mots aléatoirement dans un texte auto généré

Posté : 25 avr. 2016, 10:31
par psik4d3lik
Bonjour,

La semaine dernière, j'ai réussi à créer (grâce a la grande aide de "Spols") un formulaire qui, lorsqu'on le rempli avec des champs variables et que l'on "send", génère toutes les combinaisons possibles (cf : php-debutant/lire-des-tableaux-tableaux ... 75941.html).

Ce qui me donne comme script :
<?php

class spinning {

    public $results = array();
    public function process($text) {
        preg_replace_callback(
                '/\{(((?>[^\{\}]+)|(?R))*)\}/x', array($this, 'combine'), $text
        );
    }
    public function combine($text) {
        $this->results[] = explode('|', $text[1]);
    }
}

if (!empty($_POST)) {
    $spinning = new spinning();
    $string = $_POST['ameliorer'];
    $spinning->process($string);
    $final_tab = $spinning->results;
    $tab = array();

    foreach ($final_tab as $all) {
        $tab[] = sizeof($all);
    }

    for ($i = 0; $i < array_product($tab); $i++) {
        $remplacement = array();
        foreach ($tab as $cle => $taille) {
            $index = array_product(array_slice($tab, $cle + 1));
            $final_index = floor($i / $index) % $taille;
            $remplacement[] = $final_tab[$cle][$final_index];
        }
        $phrase = $remplacement;
        $phrase = implode($phrase, ' ');

        echo $phrase . '<br>';
    }
}

?>

<form method="post" action="seo.php">
    <textarea name="ameliorer" id="ameliorer" rows="5" cols="100"></textarea>
    <input type="submit" value="Envoyer">
</form>
Parfait mais pour la suite de l'exercice je dois maintenant faire en sorte d’intégrer ces combinaisons à l’intérieur d'un texte...

J'ai trouvé sur ce post : php-avance/fonction-rand-sur-tableau-t243541.html, qui, je pense me donne un partie de la solution!

Je l'ai donc adapter a mon cas ce qui me donne :
<?php

class spinning {

    public $results = array();
    public function process($text) {
        preg_replace_callback(
                '/\{(((?>[^\{\}]+)|(?R))*)\}/x', array($this, 'combine'), $text
        );
    }
    public function combine($text) {
        $this->results[] = explode('|', $text[1]);
    }
}

if (!empty($_POST)) {
    $spinning = new spinning();
    $string = $_POST['ameliorer'];
    $spinning->process($string);
    $final_tab = $spinning->results;
    $tab = array();

    foreach ($final_tab as $all) {
        $tab[] = sizeof($all);
    }

    for ($i = 0; $i < array_product($tab); $i++) {
        $remplacement = array();
        foreach ($tab as $cle => $taille) {
            $index = array_product(array_slice($tab, $cle + 1));
            $final_index = floor($i / $index) % $taille;
            $remplacement[] = $final_tab[$cle][$final_index];
        }
        $phrase = $remplacement;
        $phrase = implode($phrase, ' ');

        echo $phrase . '<br>';
    }
------------------------------------------------------------------------------------------------------------------
    $alphabet = range('a', 'z');
    $language = null;

    for ($e = 0, $words = rand(100, 500); $e < $words; $e++) {
        for ($i = 0, $length = rand(2, 10); $i < $length; $i++)
            $language .= $alphabet[array_rand($alphabet)];
        $language .= ' ';
    }

    $tableau = $remplacement;
    $pourcent = round($words * 0.05);
    $dico = array();

    for ($fix = 0; $fix < $pourcent; $fix++) {
        $dico[] = $tableau[array_rand($tableau)];
    }

    $texteEntier_explode = explode(' ', $language);
    $list = array_merge($texteEntier_explode, $dico);
    $texteFinal = implode(' ', $list);

    echo "$texteFinal";
----------------------------------------------------------------------------------------------------------------
}

?>

<form method="post" action="seo.php">
    <textarea name="ameliorer" id="ameliorer" rows="5" cols="100"></textarea>
    <input type="submit" value="Envoyer">
</form>
On se rapproche mais, le problème est qu'il me rajoute seulement des parties de combinaisons a la fin du texte qu'il génère... Aucune à l’intérieur et surtout aucune en entière!

"zbif fgqdwrkz wjzzc enpqbxwzj frhgcps relrkyufns puz hq jkolffm oo Tu as Tu as chez le président le chien Tu as chez le président le chien Tu as fini chez le président Tu as Tu as"

Le petit plus... :cry: Il faudrait que chaque combinaisons soit un lien...

Help me please..!

Re: Insérer mots aléatoirement dans un texte auto généré

Posté : 25 avr. 2016, 12:41
par Spols
Ce que tu cherche à faire n'est pas clair du tout. Réexplique le nous avec quelques exemples peut être.
Je ne vois pas trop l'utilité de mot complètement aléatoire.

mais voici les problème que je remarque :
tu a une première boucle qui génère toutes tes possibilités et ensuite une seconde boucle pour ton texte
mais tu utilise une variable (remplacement) de la première boucle dans la seconde. Elle ne peut contenir que la dernière phrase généré.
Tu devrais stocké toutes tes phrases dans un tableau.

Je pense que tu ne réalise pas le contenu des variable que tu utilise et que par conséquent tu n'a pas le résultat escompté.

Pour un lien, renseigne toi sur la structure HTML d'un lien et adapte ton echo en conséquence

Re: Insérer mots aléatoirement dans un texte auto généré

Posté : 25 avr. 2016, 14:12
par psik4d3lik
Idéalement j'aimerais faire en sorte que lorsque je valide mon formulaire mes phrases généré soit inséré aléatoirement dans un texte. (Le générateur de texte me paraissait bien pour tester mais au final c'est peut être pas l'idéal...)

Exemple :
- J'entre dans mon formulaire :
"{J'ai|Tu as} {manger|croquer|jeté|fini} {les gâteaux|les bonbons|la tarte|le chien} {chez moi|chez toi|chez lui|chez nous|chez vous|chez le président}"

- Je valide (le script créer alors les différentes combinaisons possible)

- Le résultat m'affiche alors un texte avec inséré à l’intérieur mes combinaisons (sous forme de lien) :
"Roméo et Juliette (Romeo and Juliet) J'ai manger les gâteaux chez toi est une tragédie-romantique de William Robert Shakespeare. Écrite J'ai manger les gâteaux chez lui vers le début de sa carrière, elle raconte l'histoire de deux J'ai manger les gâteaux chez nous jeunes amants dont la mort réconcilie leurs familles ennemies, les Montaigu et les J'ai manger les gâteaux chez vous Capulet. La pièce s'inscrit J'ai manger les gâteaux chez le président dans une série d'histoires d'amour tragiques remontant à l'Antiquité."


Je suis pas sur que ce soit plus clair... :?

Re: Insérer mots aléatoirement dans un texte auto généré

Posté : 25 avr. 2016, 17:08
par Ryle
C'est plus clair... ce qui ne l'est pas, c'est pourquoi tu veux pas aller manger des gâteaux chez Romeo et Juliette ? :)

A mon avis, il faut découper le problème en deux :
- générer l'ensemble des phrases à coup de regexp, d'explode et de boucles imbriquées et les stocker dans un tableau comme suggéré par Spols
- faire un explode de ton texte sur le caractère espace, insérer aléatoirement tes chaines + liens dans le tableau de mots généré et faire un implode pour tout reconstituer

Re: Insérer mots aléatoirement dans un texte auto généré

Posté : 25 avr. 2016, 17:10
par Spols
Si c'est plus clair.

Génère tes phrases dans un tableaux, génère tes mots dans un autre, fusionne tes tableaux, mélange les et transforme les en une chaine avec implode et un espace comme glu.

Lorsque tu aura ton texte plutot que celui que tu génère, il suffira de lui faire un explode avec l'espace comme séparateur pour remplacer le texte générer.

Edit grillé on propose la même chose mais les explications de l'un seront peut être plus clair alors je laisse.

Re: Insérer mots aléatoirement dans un texte auto généré

Posté : 25 avr. 2016, 17:30
par Ryle
@Spols : :langue:

Par contre ça soulève une question existentielle... ça sert à quoi ? :)

Re: Insérer mots aléatoirement dans un texte auto généré

Posté : 27 avr. 2016, 11:59
par psik4d3lik
Merci de vos réponses!

Désolé mais je commence a saturer... J'arrive a générer mes mots dans un tableau mais après plusieurs essai je n'arrive toujours pas à rassembler mes résultats dans un seul tableau...

Ce qui s'en approche le plus est :

Array
(
[0] => J'ai manger les gâteaux chez moi
)
Array
(
[0] => J'ai manger les gâteaux chez toi
)
Array
(
[0] => J'ai manger les gâteaux chez lui
)
Array
(
[0] => J'ai manger les gâteaux chez nous
)

Que j'ai obtenu en faisant :
for ($i = 0; $i < array_product($tab); $i++) {
    $remplacement = array();
    foreach ($tab as $cle => $taille) {
        $index = array_product(array_slice($tab, $cle + 1));
        $final_index = floor($i / $index) % $taille;
        $remplacement[] = $final_tab[$cle][$final_index];
    }
    $phrase = $remplacement;
    $phrase = implode($phrase, ' ');

    $tab_phrase = explode('<br>', $phrase);

    echo '<pre>';
    print_r($tab_phrase);
    echo '</n>';
}
J'en peux plus de cette exercice :x

Re: Insérer mots aléatoirement dans un texte auto généré

Posté : 27 avr. 2016, 13:26
par Spols
pour stocker toutes tes phrases dans un tableau,
$tab_phrase[] = $phrase sera plus judicieux.

$texte_entier_explode contient un tableau avec tes mots aléatoires
tu peur fusionner ces 2 tableaux avec array_merge
ensuite tu mélange le tout avec shuffle($tableau)
et tu récupère un texte avec implode

Re: Insérer mots aléatoirement dans un texte auto généré

Posté : 27 avr. 2016, 14:58
par psik4d3lik
Merci encore une fois!
Je bloqué plus que sur le tableau des phrases! MERCI

Par contre avec un texte écrit le shuffle mélange aussi le texte, mais je pense qu'on ne peut pas tout avoir? :|

Mais je ne vois toujours pas comment faire en sorte que mes phrases soit des liens...

Re: Insérer mots aléatoirement dans un texte auto généré

Posté : 27 avr. 2016, 15:27
par Spols
for ($i = 0; $i < array_product($tab); $i++) {
    $remplacement = array();
    foreach ($tab as $cle => $taille) {
        $index = array_product(array_slice($tab, $cle + 1));
        $final_index = floor($i / $index) % $taille;
        $remplacement[] = $final_tab[$cle][$final_index];
    }
    $phrase = $remplacement;
    $phrase = implode($phrase, ' ');

    $tab_phrase[] =  $phrase;
}

    echo '<pre>';
    print_r($tab_phrase);
    echo '</n>';
ca devrait donner ce que tu cherches

si le texte n'est plus aléatoire, il faudra alors tirer au hasard un nombre entre 0 et la taille de ton tableau texte (le nombre de mot) pour chaque phrase et l'insérer à l'endroit voulu avec
array_merge(array_slice($texte,0,$i),$phrase,array_slice($texte,$i));
où $i est ton nombre tirer au hasard.

Si tu veux que ta phrase soit un lien, c'est au moment de la concaténer qu'il faut agir
$tab_phrase[] = '<a href="'.$lien.'">".$phrase.'</a>';

Re: Insérer mots aléatoirement dans un texte auto généré

Posté : 27 avr. 2016, 16:46
par psik4d3lik
J'ai même pas pensé à ça pour les liens... #-o

Par contre
array_merge(array_slice($texte,0,$i),$phrase,array_slice($texte,$i));
me renvoie une erreur : "array_merge(): Argument #2 is not an array in ..."

Si je le remplace par $tab_phrase, par contre, il m'insère le tableau entier a l'endroit que je lui indique ce qui est normal.

Re: Insérer mots aléatoirement dans un texte auto généré

Posté : 28 avr. 2016, 08:27
par Spols
Tu dois être dans un foreach($tab_phrase => $phrase) afin d'insérer les phrases une à une

Il vaut mieux tirer tes nombres au hasard avant les insertions et les faire dans l'ordre croissant pour éviter l'insertion d'une phrase dans une phrase

Re: Insérer mots aléatoirement dans un texte auto généré

Posté : 28 avr. 2016, 09:24
par Ryle
A mon avis, il faut que tu constitues :
- un tableau contenant tes chaines générées à insérer
Array (
  [0] => J'ai manger les gâteaux chez moi
  [1] => J'ai manger les gâteaux chez toi
  [2] => J'ai manger les gâteaux chez lui
  [3] => J'ai manger les gâteaux chez nous
  ...
)
- constituer un tableau avec les mots de ton texte obtenu avec un explode(' ', $tonTexte)
Array (
  [0] => Roméo
  [1] => et
  [2] => Juliette
  [3] => (Romeo
  [4] => and
  [5] => Juliet)
  [6] => est
  [7] => une
  [8] => tragédie-romantique
  ...
A partir de là, tu génères aléatoirement avec rand() X nombres (correspondant à ton nombre de phrases à insérer) compris entre 0 et le nombre de mots de ton texte (Ex : 1 4 12 ...) (ou pour faire plus simple tu peux considérer qu'il faut inclure une de tes phrases tous les 12 mots :))

Enfin, tu parcours le second tableau mot à mot avec un for($i...) pour reconstituer ta chaine en ajoutant les mots les uns après les autres (avec les espaces qu'on a supprimé) et à chaque fois que $i est égal à l'un des nombres généré aléatoirement (ou à un multiple de 12 ;)), tu intègres une des phrases.

Et si tu as besoin d'avoir un lien, il suffira d'inclure celui-ci dans ton tableau de phrases...


...

Mais pourquoi tu veux manger des gâteaux dans du Shakespeare ??? :)

Re: Insérer mots aléatoirement dans un texte auto généré

Posté : 28 avr. 2016, 09:46
par zork
@Ryle : Je m'avance peut-être un chouillat, mais je pense que nous sommes face ici à une tentative de création d'un générateur de "content spinning" ;)

Re: Insérer mots aléatoirement dans un texte auto généré

Posté : 29 avr. 2016, 10:47
par psik4d3lik
Merci pour vos réponses!

Désolé mais je n'arrive pas a bien comprendre le cheminement et trouver la syntaxe... Un exemple peut être?

J'ai bien mon tableau $tab_phrase et mon tableau $texte.
Il n'est pas possible de faire en sorte que, tous les X mots la boucle récupère une phrase grâce a sa $key et l'insère dans le texte?

Je suis actuellement en stage et c'est pour le besoin d'un exercice, mais effectivement la première partie de mon code utilise un script de content spinning.
Mais je pense qu'ils on un peu surestimer mon niveau...