Este post espero pueda servir para los que están participando en el concurso de Chuiso #tp21challenge

Sea que quieras hacer un experimento SEO, crear contenido para un e-commerce o algún que otro proyecto que tengas en mente estoy seguro que te puede interesar tener un generador de contenidos Spintax, pero…. [si desconoces qué es el SEO puedes revisar para entender mi tesis de maestría]

¿Qué es un contenido Spintax?

La palabra Spintax proviene de la frase en inglés “spinning syntax”, que aproximadamente significa sintaxis giratoria. Es una nueva técnica en la creación de contenido, ya que permite a los escritores producir una gran cantidad de artículos a partir de un solo texto.

El principio es básicamente el siguiente:

Tenemos un texto => Hola, este es un texto random.

Y la idea es generar variantes de este texto palabra por palabra o frase por frase usando una pleca “|” entre llaves “{}” de la siguiente forma:

{Hola|Buenos días|Buenas noches}, este es un {texto|comentario} random.

El spintax generado sería el siguiente:

Algo que es importante darse cuenta en este punto es la cantidad de textos que se puede generar, en el texto de arriba con dos segmentos que tienen variantes de spintax, el primer segmento tiene 3 variantes {Hola|Buenos días|Buenas noches} y el segundo segmento tiene 2 {texto|comentario}. Por tanto, la cantidad de combinaciones es 3×2 = 6. ¿Qué pasaría si fueran 3 segmentos en donde el primero sea 3 variantes, el segundo 4 y el tercero 7? Sería, nuevamente 3x4x7 = 84. Con esto ya nos damos cuenta de un patrón: la cantidad total y las variantes las obtenemos de un producto cartesiano entre todas las variantes. Recordemos este concepto que será el core del programa en Python que te compartiré.

Código

Primero, se recomienda instalar Python en tu computadora, dado que uso Mac tengo el Python2 por defecto, por tanto si usas Windows u otro sistema operativo te recomiendo sigas estas instrucciones para instalar Python.

Ahora, para que este programa funcione adecuadamente debes instalar Python3, nuevamente te dejo este tutorial para lograrlo.

Finalmente, este programa lo puedes ejecutar en tu consola de comandos preferida de Python, te dejo algunas para tu gusto.

Generador del texto base para los miles artículos spintax

El objetivo aquí es cambiar las palabras por sus sinónimos, la cantidad de palabras cambiadas dependerá de cuántas palabras tienes sus variantes, en este caso con un pequeño ejemplo se vería como sigue (para hacer tener la mayor cantidad de variantes se puede usar un thesaurus, prometo tenerlo para la versión 2):

# coding=utf-8
# Read in the file
with open('spintax.txt', 'r') as file :
     filedata = file.read()
# Replace the target string
filedata = filedata.replace('comprar','{comprar|adquirir|conseguir|mercar|obtener|sobornar|untar}')
filedata = filedata.replace('encontrar','{encontrar|conseguir|dar|hallar|localizarhallarse}')
filedata = filedata.replace('cuerpo','{cuerpo|cosa|elemento|masa|materia|sustancia|sólidosección}')
filedata = filedata.replace('tiempo','{tiempo|duración|era|periodo|época|estación|temporada|edad|circunstancia|coyuntura|momento|ocasiónmovimiento|tempo}')
# Write the file out again
     with open('spintax.txt', 'w') as file:
file.write(filedata)

En el código anterior la explicación es la siguiente (por partes)

 # coding=utf-8 

Sirve para generar un texto que soporte las grafías propias del español.

with open('spintax.txt', 'r') as file :
filedata = file.read()

Esta parte sirve para abrir el archivo spintax.txt en donde pondrás el texto que buscas convertir en plecas y llaves, los comandos with y open sirven para abrir el documento, seguidamente el contenido leído se guarda en la variable file de la cual se llama a la función leer que en este caso es read y se entrega a la variable filedata.

Si se dan cuenta, en la parte de generar los sinónimos tienen el mismo patrón.

filedata = filedata.replace('comprar','{comprar|adquirir|conseguir|mercar|obtener|sobornar|untar}')

En la variable filedata se reemplaza el texto comprar (usando la función replace) con {comprar|adquirir|conseguir|mercar|obtener|sobornar|untar}.

Como ven, no es muy complicado comprender esta parte.

Finalmente, los cambios hechos en la variable filedata se sobre escriben sobre el texto original en el archivo spintax.txt . Eso lo podemos ver en este parte del código:

with open('spintax.txt', 'w') as file:
file.write(filedata)

Si quieres que te pase el código completo que tengo para cambiar todas las variantes y sinónimos que tengo en el programa puedes escribirme por LinkedIn.

Recuerde poner el código de esta primera parte en un archivo .py, digamos spintax.py y ejecutarlo en tu terminal favorito. Sólo para recordar, si estás en Mac, abre el Terminal, con el comando cd ubícate en el folder en donde está instalado el Python (donde se espera hayas guardado el programa). Finalmente, cuando ejecutes el programa no olvides poner: Python3 spintax.py , es decir invoca al Python3 en la ejecución. La ejecución del programa tomará segundos, este es un punto importante por lo que este programa está planteando en este lenguaje, dado que existen varios programas por ahí que hacen esta primera parte o la siguiente, pero que cuando pones un texto spintax con digamos 100 palabras con cada una teniendo 30 sinónimos el programa explota ^_^ , básicamente por se loquea con los 30^100 variantes!!! Así que Make Python Great Again!

Generador de los productos cartesianos de las del texto spintax

En este caso vamos a generar una cantidad definida de texto spintax.

Primero debemos entender lo siguiente, que si tenemos un texto con grandes cantidad de spins, la cantidad de posibles versiones crece exponencialmente, no olvidemos en la sección inicial del artículo sobre el producto cartesiano. Entonces queda claro que no tendría mucho sentido conseguir todas las versiones, con un thesaurus de tamaño mediano tranquilamente se generarían más de 100 millones de combinaciones (lo he intentado), por otro lado tenemos un punto también importante. Cuando generamos un contenido spintax queremos que sea lo más diverso y diferente. Entonces aquí viene una idea, del universo total de combinaciones podríamos tomarlos azarosamente para evitar -en lo posible- el parecido entre los textos generados.

El código es el siguiente:


import random, os, re

def spinner(s):
    
    while True:
        s, n = re.subn('{([^{}]*)}',
                    lambda m: random.choice(m.group(1).split("|")),
                    s)
        if n == 0: break
    return s.strip()

with open('cartesiano.txt', 'r') as file :
     cartesiano = file.read()

with open('keywords.txt', 'r') as file :
     filedata = file.read()

a = filedata.split('\n')

s = cartesiano

for i in range(len(a)):
     texto = spinner(s)
     save_path = '/Users/username/Python/'
     file_name = a[i].replace(" ", "-") + '.php'
     completeName = os.path.join(save_path, file_name)
     with open(completeName, 'w+') as file:
          file.write(texto)

Ahora vamos a explicar de qué trata el código para que tú mismo puedas modificarlo y sacarle el máximo provecho.

 import random, os, re 

Esta parte del código se invoca a los recursos de Python pre desarrollados que usaremos en el código.

Ahora veamos la siguiente parte del código:

def spinner(s):
    while True:
        s, n = re.subn('{([^{}]*)}',
                    lambda m: random.choice(m.group(1).split("|")),
                    s)
        if n == 0: break
    return s.strip()

En este caso se define -con el def- una función llamada spinner de argumento s el cual nos servirá para generar los textos spineados. Seguidamente tenemos un condicional que funcionará para generar los textos spineados y random. Dentro del condicional se utiliza una funcion la subn del paquete re para cortar el texto en llaves -tomar en cuenta que en este caso se usa una versión anidada, algo que normalmente muchos códigos no toman en cuenta- seguidamente se usa una función lambda que nos permite gestionar una función de uso rápido en donde se elige azarosamente uno de los textos generados para luego cortar en plecas. Finalmente, este proceso se hace tantas veces hasta que uno de los valores – n – queda en cero y se devuelve el texto generado y se le aplica la función strip para quitar todo espacio antes o al final del texto.

Veamos qué sigue:

with open('cartesiano.txt', 'r') as file :
     cartesiano = file.read()

with open('keywords.txt', 'r') as file :
     filedata = file.read()

En este caso se leen dos documentos, en el primero le llamé cartesiano ^_^ básicamente lo que hace es leer el texto spineado que generamos en la primera parte. Seguidamente, aquí viene un punto interesante, es un toquecito le diría yo, lo que estamos agregando aquí es una lista de palabras clave o nombres si gustas con los que vamos a usar para crear el nombre de los archivos que generaremos.

a = filedata.split('\n')

s = cartesiano

En esta parte del código estamos cortando el texto leído según los saltos de línea, esto para tener un objeto en donde sus componentes son los nombres o palabras claves con lo nombraremos a los textos generados. Por otro lado lo leído del texto cartesiano lo ponemos en s sólo por un tema estético.

for i in range(len(a)):
     texto = spinner(s)
     save_path = '/Users/username/Python/'
     file_name = a[i].replace(" ", "-") + '.php'
     completeName = os.path.join(save_path, file_name)
     with open(completeName, 'w+') as file:
          file.write(texto)

Ahora vamos por el siguiente pedazo de código. Veamos línea por línea.

  1. En la primera línea definimos el for, recordemos que el for en Python funciona iterando sobre objetos, adicionalmente, dado que vamos a generar el contenido spineado en función de la lista que leímos previamente el for iterará en función de la cantidad de elementos de a, para ello sacamos su tamaño con la función len.
  2. En la segunda línea generamos el texto spineado guardado en s con la función previamente definida llamada spinner y lo guardamos en la variable texto.
  3. En la tercera línea vamos a definir dónde vamos a guardar los textos generados, en este caso se pone la ruta absoluta y la guardamos en save_path. No olvidar que esta ruta absoluta depende únicamente de tu computadora.
  4. En la cuarta línea vamos a crear el nombre del archivo, en esta ocasión llamamos el nombre que vamos a usar con el a[i] y reemplazamos los espacios en blanco con un guión para estar acorde a lo que nos sugiere el SEO. Finalmente se agrega la extensión del archivo, puede que uses esto para php , html ,asp , etc. Aquí lo modificas a tu gusto.
  5. En la quinta línea se genera el nombre del archivo agregando la ruta inicial con el nombre nombre, ahora en esta parte se usa os.path.join para generar la ruta final.
  6. En la sexta y sétima línea estamos creando y escribiendo el archivo llamado completeName -previamente definido- y estamos escribiendo el texto spinneado.

Y eso es todo.

Puedes llamar a este código multiplicador.py, vas a tu terminal favorito y ejecutas Python3 multiplicador.py y ya está.

Como comentaba anteriormente, este programa corre en pocos segundos y rápidamente, no tomará horas y tampoco hará que tu computadora se cuelgue. Es muy eficiente y te será sumamente útil. Además con la explicación línea por línea, tú mismo serás capaz de personalizarlo a tu gusto y medida.

Finalmente, si encuentras alguna forma más eficiente de hacer el desarrollo estaré muy agradecido que lo compartas, y si lo puedes explicar mejor también.

Deja un comentario