Hay mucho trabajo en torno a los mecanismos de entrenamiento y demás. ¿Tendría un resumen de los mecanismos mediante los cuales realizaría el entrenamiento? ¿Qué modelos exactos recomendaría usar?
Las herramientas actuales que utiliza mi equipo provienen de gensim. Tiene una interfaz estándar de módulo de Python. Ha sido bastante bien probado durante muchos años.
La configuración que me viene a la mente sería:
- Primero: elegir el conjunto de documentos: podrían ser todas las raíces de temas, o todas las publicaciones.
De vez en cuando (por ejemplo, una vez por semana, una vez al mes, dependiendo del tráfico del foro), construir el modelo doc2vec:
- extraer los temas de Discourse a un archivo (o archivos) de texto en md, con título + cuerpo del tema. Ahora pensando en cada tema como un documento, o “documento” para los algoritmos de gensim.
- ejecutar herramientas estándar de PLN para procesar los documentos, aplicar lematización a las palabras, etc.
- usar
doc2vec (de la implementación de gensim) para construir un modelo que mapee cada documento en un vector en un espacio de dimensión d. Debe elegir el parámetro meta d mediante experimentación; Google utiliza d=40 para sus modelos de patentes; no estoy seguro de qué valor de d utiliza Google Scholar. Yo normalmente uso d=200. Cada dimensión del espacio puede considerarse como una “característica” relacionada con el contenido semántico.
- (Nota: el algoritmo doc2vec construye el espacio de características entrenando una red neuronal diseñada para aprender secuencias de palabras; la red neuronal tiene una capa oculta de dimensión d; las salidas de la capa oculta forman el espacio latente de características)
- Construir el modelo es la tarea más pesada, dependiendo de cuántos documentos tenga. 38 años de patentes = 5 millones de documentos; el modelo doc2vec tarda una noche en una máquina antigua con 8 núcleos.
- Tarea adicional opcional interesante: agrupar la nube de documentos en el espacio de características de dimensión d.
- Se pueden usar herramientas listas para usar para la agrupación, por ejemplo, de la biblioteca sklearn de Python.
- La agrupación proporciona una clasificación emergente; las preguntas de investigación interesantes incluyen cómo estas clasificaciones se superponen con las categorías de palabras clave (o etiquetas de Discourse).
Esto ocurriría de forma offline. Luego, en línea:
- El modelo se cargaría.
- Una vez cargado el modelo, una tarea bastante ligera es analizar un nuevo documento y consultar el modelo para obtener su ubicación en el espacio de características de dimensión d.
- tenga en cuenta que este nuevo documento no desencadenaría una reconstrucción del modelo. El modelo sería estático para las consultas en línea. El nuevo documento se incorporaría en la siguiente construcción (por ejemplo, semanal) del modelo.
- Luego, la última tarea ligera es preguntar cuáles son los documentos cercanos en el espacio de características. Hay herramientas de gensim para obtener una lista de documentos cercanos, pero también puede usar numpy directamente para cargar todos los vectores de documentos en una estructura como un árbol kd que permite consultas rápidas de puntos cercanos directamente.
¿Qué sucede cuando un tema tiene 100 publicaciones? ¿1000 publicaciones?
La parte offline escala más o menos linealmente con el número de documentos, pero debería ser muy manejable para 10k-100k documentos. Incluso 1 millón de documentos está bien para un lote semanal.
¿Qué usaría para la señal y qué fuerza le daría a cada cosa (vistas/categoría/etiqueta, etc.)?
En este contexto, la “fuerza de la señal” para un nuevo tema se interpreta directamente como la distancia (inversa) entre la incrustación del espacio vectorial del nuevo tema y los vectores de documentos existentes. Se podría embellecer esta señal con otras consideraciones (me gusta, vistas, etc.), pero estos son adornos adicionales al algoritmo básico que estoy describiendo.
Una vez que yo (o alguien) logre que la extracción funcione, la parte offline descrita anteriormente es bastante fácil y mecánica.
La parte difícil (para mí) sería la parte en línea, que requeriría una interfaz entre Rails de Discourse y un puñado de llamadas de Python (por ejemplo, a las herramientas de gensim). Cualquier ejemplo de este tipo de interfaz me sería útil para verlo.