On peut vraiment tout faire avec ruby et grâce à sa communauté ! Il est toujours utile de le rappeler !
Alors voilà, vous avez besoin pour un projet X ou Y de générer une série de texte dont le sens doit être le même, mais dont le contenu doit être suffisamment différent pour ne pas être détecté comme identique ou trop similaire par les outils anti-spam.. allez, au hasard, pour faire du mass-msg sur yt 😉
il vous faudra trois choses pour réaliser cette tâche :
– un certain talent d’écriture pour réaliser le master spin
– le gem content_spin
– des gems d’analyse syntaxiques pour trouver les textes suffisamment différents
1) le master spin , qu’est-ce donc ?
c’est un texte formaté avec des symboles ‘pipe’ | et des accolades {}, chacun servant à délimiter les différentes phrases possibles :
"Hi {there|you}! I'm {efficient|productive}."
Les rotations possibles de ce texte sont
[ "Hi there! I'm efficient.", "Hi there! I'm productive.", "Hi you! I'm efficient.", "Hi you! I'm productive." ]
à vous de réaliser le master spin, à l’aide de ces petits articles en français : http://www.effi10.com/tutoriel-redaction-content-spinning-masterspin/ et https://spinwave.com/combien-darticles-a-partir-dun-spin/
2) vous avez votre master spin ready !
il existe des outils en ligne de content spinning, vous pourriez éventuellement réaliser un petit bot qui utilise ces outils, mais quand on a déjà un gem prêt à l’usage, pourquoi se priver ?
require 'content_spin'
compte le nombre de tirage possible avec votre master spin
ContentSpinning.new("Hi {there|you}! I'm {efficient|productive}.").count
génère les tirages possibles sous forme d’un tableau de chaînes de caractères
res_spin = ContentSpinning.new("Hi {there|you}! I'm {efficient|productive}.").spin
vous avez donc généré tous les tirages possibles pour votre master spin, mais il va maintenant falloir trier et comparer un peu tout ca pour ne conserver que les tirages suffisamment éloignés.
3) comparons nos tirages
on compare chacun de nos éléments de référence à chacun des autres tirages pour déterminer une matrice de similarité
require 'similarity' corpus = Corpus.new reference = [] res_spin.map do |x| tmp = Document.new(:content => x) corpus << tmp reference << tmp end reference.each do |elt| corpus.similar_documents(elt).each do |doc, similarity| puts "Similarity between doc #{elt} and doc #{doc} is #{similarity}" end end
et voilà, ne vous reste qu’à mettre un seuil de similarité max et de garder les tirages en dessous.. Il existe d’autres algos de distance entre deux textes (Levenstein, …) et pour plus d’info sur ces algo, je vous invite à consulter cet excellent post
Vous voilà appareillés pour vous générer du texte à la demande grâce au content spinning 🙂