El enfoque más fácil, supongo, sería:
- Cree dos tablas nuevas:
keywords
(id, palabra) ykeywords_comments
(keyword_id, comment_id, cuenta)keywords
guarda una identificación única y la palabra clave que encontró en un textokeywords_comments
almacena una fila para cada conexión entre cada comentario que contiene esa palabra clave. Encount
guardará la cantidad de veces que se produjo esta palabra clave en el comentario. Las dos columnas keyword_id + comment_id juntas forman una clave principal única o directamente.
- Recuperar todos los comentarios de la base de datos
- Analice todos los comentarios y divídalos por elementos que no sean caracteres (u otros límites)
- Escribe estas entradas en tus tablas
Ejemplo
Tiene los siguientes dos comentarios:
Ahora iteraría sobre ambos y los dividiría por no caracteres. Esto daría como resultado las siguientes palabras en minúsculas para cada texto:- Primer texto:hola, cómo, eres, tú- Segundo texto:wow, hola, mi, nombre, es, stefan
Tan pronto como haya analizado uno de estos textos, ya puede volver a insertarlo en la base de datos. Supongo que no quieres cargar 100.000 comentarios en RAM.
Entonces sería así:
- Analice el primer texto y obtenga las palabras clave anteriores
- Escriba cada palabra clave en la pestaña
keywords
si aún no está allí - Establecer una referencia de la palabra clave al comentario (
keywords_comments
) y configure el conteo correctamente (en nuestro ejemplo, cada palabra aparece solo una vez en cada texto, debe contar eso). - Analizar segundo texto
- …
Mejora menor
Una mejora muy fácil que probablemente tenga que usar para 100.000 comentarios es usar una variable de conteo o agregue un nuevo campo has_been_analyzed a cada comentario. Luego puede leerlos comentario por comentario de la base de datos.
Por lo general, uso variables de conteo cuando leo datos por partes y sé que los datos no pueden cambiar de la dirección en la que estoy comenzando (es decir, se mantendrá constante hasta el punto en el que estoy actualmente). Entonces hago algo como:
SELECT * FROM table ORDER BY created ASC LIMIT 0, 100
SELECT * FROM table ORDER BY created ASC LIMIT 100, 100
SELECT * FROM table ORDER BY created ASC LIMIT 200, 100
…
Considere que esto solo funciona si sabemos con certeza que no hay fechas para agregar en un lugar que creemos que ya leímos. P.ej. usando DESC
no funcionaría, ya que podría haber datos insertados. Entonces todo el desplazamiento se rompería y leeríamos un artículo dos veces y nunca leeríamos el artículo nuevo.
Si no puede asegurarse de que la variable de conteo externa se mantenga consistente, puede agregar un nuevo campo analizado que establece en verdadero tan pronto como haya leído el comentario. Entonces siempre puedes ver qué comentarios ya se han leído y cuáles no. Una consulta SQL se vería así:
SELECT * FROM table WHERE analyzed = 0 LIMIT 100 /* Reading chunks of 100 */
Esto funciona siempre que no paralelice la carga de trabajo (con varios clientes o subprocesos). De lo contrario, debe asegurarse de que la lectura + la configuración verdadera sea atomar (sincronizada).