tuto – ruby – content_spin et génération de textes non identique

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 :)