Dice Tech Jobs: repositorio de Dice.com para crear un 'motor de búsqueda conceptual', por Simon Hughes (Científico de datos de Dice). Este repositorio contiene código Python para entrenar el modelo Word2Vec de Thomas Mikolov en un conjunto de documentos. El resultado de este proceso se puede incrustar en solr (o algún otro motor de búsqueda) utilizando archivos de sinónimos combinados con algunos complementos de solr para proporcionar una funcionalidad de búsqueda conceptual dentro del motor de búsqueda. El resultado también podría usarse en otros motores de búsqueda, siempre que admitan archivos de sinónimos. La búsqueda conceptual también se conoce como búsqueda semántica y aprende a hacer coincidir conceptos en un dominio en lugar de palabras clave para mejorar la recuperación.
Consulte también mi repositorio 'Vectores en búsqueda', que amplía este trabajo. También contiene enlaces a las diapositivas y al vídeo de esa charla.
Los scripts incluyen código para preprocesar y tokenizar documentos, extraer términos y frases comunes según la frecuencia de los documentos, entrenar un modelo word2vec utilizando la implementación gensim y agrupar los vectores de palabras resultantes utilizando las bibliotecas de agrupación de sci-kit learn. Los scripts de Python generan una serie de archivos de sinónimos de solr que se pueden usar para habilitar la funcionalidad de búsqueda conceptual dentro de solr cuando se combinan con algunos complementos personalizados de dice solr.
Consulte https://github.com/DiceTechJobs/SolrPlugins para conocer los complementos de Solr para utilizar los vectores aprendidos y los archivos de sinónimos dentro de un motor de búsqueda Apache Solr.
Consulte https://github.com/DiceTechJobs/SolrConfigExamples para ver ejemplos de entradas de configuración de solr para configurar la búsqueda conceptual dentro de solr, incluida la configuración de los complementos.
Los scripts tienen la forma de cuadernos de Jupyter Python, que se ejecutarán en orden (1,2,3 y cualquiera de los 4) y como scripts de línea de comando separados (ver más abajo) si no desea utilizar Jupyter. Los scripts de Python son más limpios, comparten archivos de configuración comunes con todas las configuraciones requeridas y están diseñados para ejecutarse desde el shell, por lo que probablemente sea más fácil comenzar con ellos . Estos cuadernos y scripts preprocesarán los documentos y entrenarán el modelo Word2Vec. La carpeta ./Settings contiene archivos de configuración de ejemplo para cada script, con una descripción de cada configuración en los comentarios. Para llamar a los scripts de la línea de comandos, pase el archivo de configuración relacionado como único parámetro, por ejemplo
python pre_process_documents.py ./Settings/pre_process_documents.cfg
Los scripts de la línea de comando deben ejecutarse en orden:
pre_process_documents.py: esto es necesario para eliminar algunos caracteres de puntuación (comas, guiones, etc.), analizar html si es necesario y separar las oraciones en el documento. Si desea omitir este paso y pasar al 2 o 3, proporcione un conjunto de archivos a los pasos 2 y 3 con cualquier puntuación que desee eliminar eliminada y con cada oración nueva en una línea separada.
extract_keywords.py - (opcional) Si no tiene un conjunto bueno y extenso de frases clave de su dominio (por ejemplo, sus 5000 palabras clave y frases de búsqueda principales, siendo las frases la parte importante) o desea aumentar la cobertura más allá de esta lista, ejecute este script para extraer todas las palabras clave y frases por encima de un umbral de frecuencia de documento específico.
train_word2vec_model.py: entrena y guarda el modelo Word2Vec en los documentos preprocesados de 1. Utiliza un conjunto de palabras clave y frases, como las que aparecen en 2. Tenga en cuenta : este modelo es muy rápido, pero requiere un compilador de C para ser disponible y preinstalado para hacer uso de la versión C bajo las sábanas; de lo contrario, se utiliza la implementación de Python, mucho más lenta. Si esto no está disponible, recibirá una advertencia de tiempo de ejecución cuando el modelo se entrene por primera vez.
Este paso contiene varios archivos según la solución deseada (consulte mi charla):
Salida vectorial - ¡MUY PRONTO! Consulte Jupyter Notebook 4.a.
generate_topn_synonyms_file.py: genera los n sinónimos principales para cada frase o palabra clave de destino. Esto genera 2 archivos, un archivo con cargas útiles y un archivo sin ellas. El caso de uso más sencillo es utilizar el archivo sin cargas útiles. Se puede obtener un mejor rendimiento utilizando el archivo payloads para ponderar los sinónimos por similitud. Esto se puede hacer en el momento de la consulta utilizando el analizador queryboost. Tenga en cuenta que para hacer esto necesita tokenizar comas y espacios en blanco en el momento de la consulta, ya que reemplazamos los espacios en blanco con comas para solucionar el problema de sinónimos de varias palabras. Alternativamente (y recomendado) use la expansión de sinónimos en el momento del índice, junto con el analizador de consultas PayloadEdismax, la clase PayloadAwareDefaultSimilarity (use como similitud predeterminada o use similitud de esquema para configurar por campo) y asegúrese de que el tipo de campo para estos campos contenga el término 'carga útil' o 'vector'.
generate_cluster_synonyms_file.py: genera k grupos a partir de los vectores de palabras generados en los pasos anteriores. Estos se pueden incrustar directamente en solr a través de un archivo de sinónimos; no se necesitan complementos especiales. Recomendaría generar varios grupos diferentes de sinónimos de diferentes tamaños y configurarlos como campos separados con pesos de campo más altos aplicados a los grupos pequeños (es decir, generados con un valor k mayor).
Construido con Python 2.7.10. No probado con Python 3
La implementación de Word2Vec es la del excelente paquete gensim. Contiene implementaciones rápidas de LSA, LDA, Word2Vec y algunos otros algoritmos de aprendizaje automático.
https://radimrehurek.com/gensim/models/word2vec.html
Este es un gran paquete para modelar temas y aprender representaciones semánticas de documentos y palabras.
Google lanzó un conjunto de vectores de palabras previamente entrenados, entrenados en 100 mil millones de palabras del corpus de noticias de Google. Para aquellos de ustedes que no se centran en un dominio especializado sino en un conjunto muy amplio de documentos, como empresas que crean un motor de búsqueda de noticias (como Reuters, Bloomberg, agencias gubernamentales, etc.), pueden utilizar este modelo previamente entrenado. en cambio. Luego puede omitir los primeros 3 pasos e ir directamente a usar uno de los scripts del paso 4 anteriores que toman un modelo previamente entrenado y calculan archivos de sinónimos de salida, y eso es todo lo que necesita. Esta publicación describe dónde obtener los vectores previamente entrenados: https://groups.google.com/forum/#!topic/gensim/_XLEbmoqVCg. Luego puede usar la funcionalidad model.load de Word2Vec de gensim:
model = Word2Vec . load ( MODEL_FILE )
Si está utilizando la nube Solr, a Zookeeper no le gusta que ningún archivo de configuración tenga un tamaño superior a 1 M. Entonces, si los archivos de sinónimos resultantes son más grandes que esto, tendrá que 1) cambiar la configuración predeterminada del cuidador del zoológico, 2) dividir el archivo de sinónimos en varios archivos y aplicar filtros de sinónimos en secuencia, o 3) cargar sinónimos desde una base de datos usando un complemento (por ejemplo, https://github.com/shopping24/solr-jdbc-synonyms)
Los expertos en PNL de Stanford desarrollaron un algoritmo de aprendizaje de vectores de palabras que compite con Word2Vec con una precisión similar. Si desea experimentar con eso, este paquete de Python le permitirá hacerlo: https://github.com/hans/glove.py. Sin embargo, no lo he probado, así que no puedo garantizarlo en este momento.
Los scripts iniciales esperan una carpeta que contenga archivos *.txt o html sin formato. Si tiene contenido html, hay lógica dentro de los scripts para analizar el html, pero la sopa hermosa puede ser un poco inestable, por lo que es mejor que los analice previamente antes de enviarlos a través del proceso. Tenga en cuenta que no existe un formato de archivo especial, lo que parece ser el problema que tiene la mayoría de las personas al intentar ejecutar este script. Si se produce un error al cargar los archivos, sugeriría usar el script de Python, no el cuaderno, y abrir el depurador para ver qué sucede. Además, asegúrese de configurar config.file_mask para que coincida con los archivos que desea cargar, en https://github.com/DiceTechJobs/ConceptualSearch/blob/master/Settings/pre_process_documents.cfg. El valor predeterminado es .*.txt (es una expresión regular, no un blob de archivos), por lo que deberá cambiar esto si sus archivos no son archivos .txt.
Publique cualquier pregunta, error o solicitud de funciones en la lista de problemas e incluya una @mención: @simonhughes22 para recibir un correo electrónico oportuno con sus preguntas. Algunas personas me enviaron correos electrónicos directamente con preguntas sobre este repositorio. Si bien no me importa responder correos electrónicos, envíe un problema de GitHub y mencióneme. De esa manera, todos los demás podrán ver la pregunta y mi respuesta para referencia futura.
Recientemente di una charla sobre búsqueda de vectores, el código se encuentra a continuación. Esta es una extensión natural del trabajo de búsqueda conceptual que hice.
Consulte nuestros complementos de Solr: