Quais são algumas maneiras padrão de calcular a distância entre documentos?


34

Quando digo "documento", tenho em mente páginas da web como artigos da Wikipedia e notícias. Prefiro respostas que ofereçam métricas de distância lexical de baunilha ou métricas de distância semântica de última geração, com maior preferência por essa última.

Respostas:


48

Há várias maneiras diferentes de fazer isso, dependendo exatamente da quantidade de informações semânticas que você deseja reter e da facilidade com que seus documentos são tokenizados (documentos html provavelmente seriam muito difíceis de serem simbolizados, mas você poderia fazer algo com tags e contexto) .)

Alguns deles foram mencionados pelo ffriend, e os vetores de parágrafos do user1133029 são realmente sólidos, mas imaginei que me aprofundaria um pouco mais sobre os pontos positivos e negativos de diferentes abordagens.

  • Distância cosseno - Tentada uma distância verdadeira, cosseno é provavelmente a métrica de distância mais comum usada genericamente em vários domínios. Com isso dito, há muito pouca informação na distância do cosseno que pode realmente ser mapeada para qualquer coisa semântica, o que parece não ser ideal para essa situação.
  • Distância de Levenshtein - Também conhecida como edit distance, geralmente é usada apenas no nível do token individual (palavras, bigrams, etc ...). Em geral, eu não recomendaria essa métrica, pois ela não apenas descarta qualquer informação semântica, mas também tende a tratar alterações muito diferentes de palavras de maneira semelhante, mas é uma métrica extremamente comum para esse tipo de coisa.
  • LSA - Faz parte de um grande arsenal de técnicas quando se trata de avaliar a similaridade de documentos chamada topic modeling. A LSA saiu de moda recentemente e, na minha experiência, não é a abordagem mais forte para modelagem de tópicos, mas é relativamente simples de implementar e tem algumas implementações de código aberto
  • LDA - Também é uma técnica usada topic modeling, mas é diferente de LSAaprender as representações internas que tendem a ser mais suaves e intuitivas. Em geral, os resultados obtidos LDAsão melhores para modelar a semelhança do documento LSA, mas não tão bons para aprender a discriminar fortemente entre tópicos.
  • Alocação de Pachinko - É uma extensão realmente interessante sobre o LDA. Em geral, esta é apenas uma versão significativamente melhorada LDA, com a única desvantagem de levar um pouco mais de tempo para treinar e as implementações de código aberto são um pouco mais difíceis de encontrar.
  • word2vec - O Google tem trabalhado em uma série de técnicas para reduzir inteligentemente palavras e documentos a vetores mais razoáveis ​​do que os vetores esparsos produzidos por técnicas como Count Vectorizerse TF-IDF. O Word2vec é excelente porque possui várias implementações de código aberto. Depois de ter o vetor, qualquer outra métrica de similaridade (como distância do cosseno) pode ser usada sobre ela com significativamente mais eficácia.
  • doc2vec - Também conhecido como paragraph vectors, este é o mais recente e o melhor de uma série de documentos do Google, analisando representações vetoriais densas de documentos. A gensimbiblioteca em python tem uma implementação word2vecque é direta o suficiente para que possa ser razoavelmente aproveitada para compilar doc2vec, mas lembre-se da licença se você quiser seguir essa rota

Espero que ajude, deixe-me saber se você tiver alguma dúvida.


6

Há várias medidas de distância semântica, cada uma com seus prós e contras. Aqui estão apenas alguns deles:

  • distância do cosseno , produto interno entre os vetores de características do documento;
  • LSA , outro modelo baseado em vetor, mas que utiliza SVD para remover o ruído da matriz termo-documento original;
  • Baseado em WordNet , verificado por humanos, embora dificilmente extensível.

Comece com uma abordagem mais simples e depois avance com base nos problemas do seu caso específico.


11
Observe que, ao executar o LSA, normalmente você usa a distância do cosseno nas projeções do LSA do conjunto de dados original. Só para esclarecer.
Simon

6

Empiricamente, sempre achei o LSA superior ao LDA e em todos os conjuntos de dados em que o experimentei. Eu conversei com outras pessoas que disseram a mesma coisa. Também foi usado para vencer várias competições SemEval para medir semelhanças semânticas entre documentos, geralmente em combinações com uma medida baseada em wordnet, então eu não diria que está fora de moda ou é definitivamente inferior ao LDA, o que é melhor para modelagem de tópicos e não para semelhanças semânticas em minha experiência, ao contrário do que alguns respondentes afirmaram.

Se você usa o gensim (uma biblioteca python), ele possui LSA, LDA e word2vec, para que você possa comparar facilmente o 3. doc2vec é uma boa idéia, mas não escala muito bem e provavelmente será necessário implementá-lo como eu sou. desconhecem quaisquer implementações de código aberto. Ele não escala bem como para cada documento, um modelo novo e separado deve ser construído usando o SGD, um algoritmo de aprendizado de máquina lento. Mas provavelmente fornecerá os resultados mais precisos. O LSA e o LDA também não se adaptam bem (o word2vec, no entanto), o LDA piora em geral. No entanto, as implementações do Gensim são muito rápidas, pois usam SVD iterativo.

Outra observação: se você usar o word2vec, ainda precisará determinar uma maneira de compor vetores de documentos, pois ele fornece um vetor diferente por palavra. A maneira mais simples de fazer isso é normalizar cada vetor e determinar a média sobre todos os vetores de palavras no documento ou obter uma média ponderada pelo peso idf de cada palavra. Portanto, não é tão simples como 'use word2vec', você precisará fazer algo mais para calcular a semelhança do documento.

Eu pessoalmente iria com a LSA, como a vi funcionar bem empiricamente, e a biblioteca do gensim é muito bem dimensionada. No entanto, não há almoço grátis; portanto, tente cada método e veja qual funciona melhor para seus dados.


Como exatamente você usou o LSA? Vale a pena notar que o LDA é realmente um invólucro bastante fino em torno do LSA (é pLSA com um dirichlet anterior) que foi demonstrado empiricamente para aumentar significativamente a generalização. Você quase certamente veria melhores precisões com o LSA, mas isso geralmente é resultado de sobreajuste, o que é um problema muito notável com o LSA. Além disso, o que exatamente você quer dizer com dimensionamento aqui? O doc2vec na verdade não exige um novo modelo para cada documento e, para o cálculo, não há diferença notável entre o LSA e o LDA, sendo ambos muito escalonáveis.
Slater Victoroff

Eu não observei o excesso de adequação ao LSA e, como eu disse, conheci várias outras pessoas que tiveram melhor desempenho em relação ao LDA. Além disso, eu vi o LSA usado em muitas entradas vencedoras em competições semestrais, nunca vi o LDA usado em uma entrada vencedora. Essa é a conferência acadêmica para comparar semelhanças semânticas entre documentos, portanto, presumo que eles saibam o que estão fazendo. O Doc2vec, se você estiver se referindo à implementação do vetor de parágrafos de Mikolov, realiza SGD em cada documento separadamente. Então é muito lento.
Simon

@SlaterVictoroff Eu acho que acabou de expor as coisas para dizer que é demais. Sabe-se que o LDA é ruim para os casos de pesquisa / recuperação e recomendação de informações, empiricamente foi demonstrado que o LSA funciona muito melhor e combina com minha própria experiência, pois gosto de validar essas descobertas com nossos próprios dados. As versões do Doc2Vec fazem uma descida gradual por documento, isso depende do algoritmo usado no Doc2Vec, pois geralmente se refere a muitos algoritmos diferentes.
21718 Simon

3

O estado da técnica parece ser "vetores de parágrafos" introduzidos em um artigo recente: http://cs.stanford.edu/~quocle/paragraph_vector.pdf . A distância cosseno / euclidiana entre os vetores de parágrafos provavelmente funcionaria melhor do que qualquer outra abordagem. Provavelmente isso ainda não é viável devido à falta de implementações de código aberto.

A melhor coisa a seguir é a distância de cosseno entre vetores LSA ou distância de cosseno entre vetores brutos da BOW. Às vezes, funciona melhor escolher diferentes esquemas de ponderação, como TF-IDF.


Observe meus comentários abaixo sobre a escalabilidade do vetor de parágrafo. Esta técnica parece muito promissor, mas é difícil de implementar, e não escala bem em tudo, como você está fazendo um SGD separado para cada documento, que é muito caro, se me lembro o papel corretamente
Simon

1

É útil ter em sua mochila de ferramentas a família de algoritmos de hash sensíveis à localidade . Esta família não é semântica. Na verdade é considerar o texto como uma sequência de bits. Acho útil em conjuntos de dados sujos quando o mesmo texto aparece muitas vezes com pequenas diferenças.

Você pode usar o ssdeep (que é baseado no hash Nilsimsa ) para identificar esses documentos. O Ssdeep foi originalmente planejado para o domínio do spam. Os spammers geralmente fazem pequenas alterações na mensagem (adicione um espaço) para impedir a detecção por assinatura exata (por exemplo, md5 ).

Como muitas versões do mesmo documento no mesmo conjunto de dados causam estragos nos métodos estatísticos que serão aplicados a ele, fazer essa limpeza pode ser muito benéfico.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.