Dice Tech Jobs - repositório do Dice.com para a construção de um 'Mecanismo de pesquisa conceitual', por Simon Hughes (Dice Data Scientist). Este repositório contém código Python para treinar o modelo Word2Vec de Thomas Mikolov em um conjunto de documentos. A saída desse processo pode então ser incorporada no solr (ou em algum outro mecanismo de pesquisa) usando arquivos de sinônimos combinados com alguns plug-ins do solr para fornecer funcionalidade de pesquisa conceitual dentro do mecanismo de pesquisa. A saída também pode ser usada em outros mecanismos de pesquisa, desde que suportem arquivos de sinônimos. A pesquisa conceitual também é conhecida como pesquisa semântica e aprende a combinar conceitos em um domínio, em vez de palavras-chave, para melhorar a lembrança.
Verifique também meu repositório 'Vectors in Search', que amplia este trabalho. Ele também contém links para os slides e vídeos dessa palestra.
Os scripts incluem código para pré-processar e tokenizar documentos, extrair termos e frases comuns com base na frequência do documento, treinar um modelo word2vec usando a implementação gensim e agrupar os vetores de palavras resultantes usando as bibliotecas de cluster do sci-kit learn. Os scripts python geram uma série de arquivos sinônimos do solr que podem ser usados para ativar a funcionalidade de pesquisa conceitual no solr quando combinados com alguns plug-ins solr de dados personalizados.
Consulte https://github.com/DiceTechJobs/SolrPlugins para plug-ins solr para utilizar os vetores aprendidos e arquivos de sinônimos em um mecanismo de pesquisa Apache Solr
Consulte https://github.com/DiceTechJobs/SolrConfigExamples para obter exemplos de entradas de configuração do solr para configurar a pesquisa conceitual no solr, incluindo a configuração dos plug-ins.
Os scripts estão na forma de notebooks Jupyter python, para serem executados em ordem (1,2,3 e qualquer um dos 4) e como scripts de linha de comando separados (veja abaixo) se você não quiser usar o Jupyter. Os scripts python são mais limpos e compartilham arquivos de configuração comuns com todas as configurações necessárias e são projetados para serem executados a partir do shell, portanto, provavelmente são mais fáceis de começar . Esses cadernos e scripts irão pré-processar os documentos e treinar o modelo Word2Vec. A pasta ./Settings contém exemplos de arquivos de configuração para cada script, com uma descrição de cada configuração nos comentários. Para chamar os scripts de linha de comando, passe o arquivo de configuração relacionado como o único parâmetro, por exemplo
python pre_process_documents.py ./Settings/pre_process_documents.cfg
Os scripts de linha de comando devem ser executados na ordem:
pre_process_documents.py - isso é necessário para remover alguns caracteres de pontuação (vírgulas, hífens, etc.), analisar o HTML, se necessário, e separar as frases no documento. Se desejar pular esta etapa e passar para 2 ou 3, forneça um conjunto de arquivos para as etapas 2 e 3 com qualquer pontuação que você deseja remover removida e com cada nova frase em uma linha separada.
extract_keywords.py - (opcional) Se você não tiver um conjunto bom e extenso de frases-chave de seu domínio (por exemplo, suas 5.000 principais palavras-chave e frases de pesquisa, sendo as frases a parte importante) ou quiser aumentar a cobertura além desta lista, execute este script para extrair todas as palavras-chave e frases acima de um limite de frequência de documento especificado.
train_word2vec_model.py - Treina e salva o modelo Word2Vec nos documentos pré-processados de 1. Usa um conjunto de palavras-chave e frases, como as saídas de 2. Observe - Este modelo é muito rápido, mas requer um compilador C para ser disponível e pré-instalado para fazer uso da versão C nos bastidores, caso contrário, a implementação python muito mais lenta será usada. Se não estiver disponível, você receberá um aviso em tempo de execução quando o modelo for treinado pela primeira vez.
Esta etapa contém vários arquivos dependendo da solução desejada (veja minha palestra):
Saída vetorial - EM BREVE! Consulte Jupyter Notebook 4.a
generate_topn_synonyms_file.py - Gera os n principais sinônimos para cada palavra-chave ou frase alvo. Isso gera 2 arquivos, um arquivo com cargas úteis e um arquivo sem. O caso de uso mais simples é usar o arquivo sem cargas úteis. Melhor desempenho pode ser obtido usando o arquivo de cargas úteis para ponderar os sinônimos por similaridade. Isso pode ser feito no momento da consulta usando o analisador queryboost. Observe que, para fazer isso, você precisa tokenizar vírgulas e espaços em branco no momento da consulta, pois substituímos os espaços em branco por vírgulas para contornar o problema de sinônimos de várias palavras. Alternativamente (e recomendado) use a expansão de sinônimos no momento do índice, junto com o analisador de consulta PayloadEdismax, a classe PayloadAwareDefaultSimilarity (use como similaridade padrão ou use similaridade de esquema para configurar por campo) e certifique-se de que o fieldType para esses campos contenha o termo 'carga útil' ou 'vetor'.
generate_cluster_synonyms_file.py - Gera k clusters a partir dos vetores de palavras gerados nas etapas anteriores. Eles podem ser incorporados diretamente no solr por meio de um arquivo sinônimo - sem necessidade de plug-ins especiais. Eu recomendo gerar vários clusters diferentes de sinônimos de tamanhos variados e configurá-los como campos separados com pesos de campo mais altos aplicados aos clusters pequenos (ou seja, gerados com um valor k maior).
Construído usando python 2.7.10. Não testado com python 3
A implementação do Word2Vec é a do excelente pacote gensim. Contém implementações rápidas de LSA, LDA, Word2Vec e alguns outros algoritmos de aprendizado de máquina.
https://radimrehurek.com/gensim/models/word2vec.html
Este é um ótimo pacote para modelagem de tópicos e aprendizagem de representações semânticas de documentos e palavras.
O Google lançou um conjunto de vetores de palavras pré-treinados, treinados em 100 bilhões de palavras do corpus de notícias do Google. Para aqueles que não estão focados em um domínio especializado, mas em um conjunto muito amplo de documentos, como empresas que criam um mecanismo de busca de notícias (como Reuters, Bloomberg, agências governamentais, etc.), você pode simplesmente usar este modelo pré-treinado em vez de. Em seguida, você pode pular as três primeiras etapas e ir diretamente para o uso de um dos scripts da etapa 4 acima, que usam um modelo pré-treinado e calculam arquivos de sinônimos de saída, e isso é tudo que você precisa. Esta postagem descreve onde obter os vetores pré-treinados: https://groups.google.com/forum/#!topic/gensim/_XLEbmoqVCg. Você pode então usar a funcionalidade model.load do Word2Vec do gensim:
model = Word2Vec . load ( MODEL_FILE )
Se você estiver usando a nuvem Solr, o Zookeeper não gosta que nenhum arquivo de configuração tenha mais de 1 milhão de tamanho. Portanto, se os arquivos de sinônimos resultantes forem maiores que isso, você terá que 1) alterar as configurações padrão do zookeeper, 2) dividir o arquivo de sinônimos em vários arquivos e aplicar filtros de sinônimos em sequência ou 3) carregar sinônimos de um banco de dados usando um plug-in (por exemplo, https://github.com/shopping24/solr-jdbc-synonyms)
Os especialistas em PNL de Stanford desenvolveram um algoritmo de aprendizagem de vetores de palavras concorrente do Word2Vec com precisão semelhante. Se você quiser experimentar isso, este pacote python permitirá que você faça isso: https://github.com/hans/glove.py No entanto, ainda não tentei isso, então não posso garantir isso no momento.
Os scripts iniciais esperam uma pasta contendo arquivos *.txt ou html brutos. Se você tiver conteúdo HTML, há lógica dentro dos scripts para analisar o HTML, mas a sopa bonita pode ser um pouco esquisita, então é melhor pré-analisá-los antes de enviá-los pelo pipeline. Observe que não existe um formato de arquivo especial, o que parece ser o problema que a maioria das pessoas enfrenta ao tentar executar este script. Se houver um erro ao carregar os arquivos, sugiro usar o script python, não o notebook, e abrir o depurador para ver o que está acontecendo. Além disso, certifique-se de definir config.file_mask para corresponder aos arquivos que deseja carregar, em https://github.com/DiceTechJobs/ConceptualSearch/blob/master/Settings/pre_process_documents.cfg. O padrão é .*.txt (é um regex, não um blob de arquivo), então você precisará alterar isso se seus arquivos não forem arquivos .txt.
Poste quaisquer perguntas, bugs ou solicitações de recursos na lista de problemas e inclua uma @menção - @simonhughes22 para que eu receba um e-mail oportuno com suas perguntas. Algumas pessoas me enviaram e-mails diretamente com perguntas sobre este repositório. Embora eu não me importe de responder a e-mails, envie um problema do GitHub e @mencione-me. Dessa forma, todos os outros poderão ver a pergunta e minha resposta para referência futura.
Recentemente dei uma palestra sobre Vector Search, o código está abaixo. Esta é uma extensão natural do trabalho de pesquisa conceitual que fiz
Por favor, verifique nossos plug-ins Solr: