J’espère que vous avez lu les précédentes parties, parce que sinon, vous allez être un peu perdu. Vous récup, ça commence ici, puis là
On en était donc rester au fait que générer des tableaux de suites de mots était une bonne solution pour générer des contenus.
On en était également rester au fait qu’il faut un gros fichier de contenu d’entrainement pour sortir des phrases différentes… faire quelques probabilités pour tirer au sort des suites cohérentes, mais pas toujours la même non plus (sinon, c’est inutile) … et choisir adroitement sa config selon plusieurs critères:
- Le nombres de mots par suite: 2 mots pour un bigram laisse des tonnes de possibilités, 5 mots réduisent le champ des possibles si vous n’avez pas tous les articles Wikipédia dans un fichier txt
- La taille du fichier. Plus vous aurez de texte dans vos données d’entrainement, plus vous pourrez augmenter le nombre de Ngrams et sortir des phrases cohérentes, sans pour autant recopier mot pour mot tout un paragraphe d’un de vos textes d’entrainement.
- L' »aprentissage » … c’est un bien grand mot, tout ce qu’on fait c’est ranger des mots dans un tableau. Mais on peut tout de même faire des choses qui permettent d’optimiser un peu tout ça, surtout avec un petit fichier d’entrainement.
Alors le code pour tokenizer (mettre tous les termes d’un texte dans un tableau) est dans la partie 2.
Une fois le texte tokenizé, on range les suites, vous vous souvenez ?
Très grossièrement, on entre dans la fonction 4 paramètres.
- Le tableau de tokens
- le nombre de Ngrams qu’on souhaite (2, 3, 5, 10, 50 etc…) pour plus de flexibilité
- Un séparateur. Parce qu’ici on a des mots, on demande des espaces… mais un ngram ne se définit pas par des mots, ça peut être aussi des caractères, et dans ce cas, on pourrait décomposer le mot référencement en Trigrams par [réf,ére,nce,men,t]. L’utilisation est pareil, sauf qu’au lieux de mots, on joue avec des caractères, et ça peut vite partir dans des trucs plutôt amusants. Il suffit juste de penser à tokeniser sur un nombre X de caractères à couper au lieu des espaces. On remplace /\S+/gim par /.{0,5}/gim dans la fonction tokenizer ou 5 est le nombre de caractères.
- Et une boucle d’entrainement. Parce qu’il est possible d’avoir de petits textes d’entrainement ou de vouloir beaucoup plus de possibilités, on peut faire un truc sympa: faire une boucle sur les tokens de départ et en enlever un au départ de chaque boucle. Au premier tour, on va prendre par exemple les 2 premiers mots de la phrases et le 2ème et le troisième pour le premier bigrams. Au tour suivant, on prend le 2ème mot et le troisième, puis le troisième et le quatrième pour le premier bigram. En décalent ainsi sur les tokens, on se créé beacoup plus de possibilités avec les ngrams. Ici on a définit à trois le nombre de tours.
La fonction en elle-même va d’abord créer le tableau de sortie des Ngrams et enregistrer chaque possibilité dedans, avec ou sans boucle.
Une fois le tableau créé, elle va regrouper tous les ngrams dont la première valeur (2 mots) sont identique et faire un calcul de probabilités.
Par exemple pour la phrase suivante:
Je suis tout mouillé, mais je suis content d’être au sec sous mon k-way. Je suis content d’être capable de choisir le bon manteau pour sortir
On va avoir ici un regroupement de je suis avec deux valeurs: tout mouillé (1 fois) et content d’être (2 fois)
Pour générer du texte en piochant dans les meilleurs probabilités, on aura plus de chance de tirer content d’être plutôt que tout mouillé.
Aussi simple que ça. Vous avez donc en sortie un tableau tout prêt pour générer du texte.
Yapuka… et je vais vous laisser chercher un peu cette fonction qui va générer le texte, sans tirer la première suite de chaque Ngram bien entendu, sinon vous allez reproduire le texte exacte d’un de vos textes d’entrainement.
On voit ça sinon dans la prochaine partie 😉
Eh bien, je crois avoir compris la logique de la création de texte, il me semble avoir reconnu au passage des principes de spinning, mais rien à faire, le code m’est aussi hermétique que du serbo-croate médiéval…. Chacun son truc et ce n’est pas le mien. Et toi, comme codeur, tu ne dois pas faire partie des plus mauvais, même sans être de la partie, je le subodore…