Respostas:
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.
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.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 abertotopic modeling
, mas é diferente de LSA
aprender as representações internas que tendem a ser mais suaves e intuitivas. Em geral, os resultados obtidos LDA
são melhores para modelar a semelhança do documento LSA
, mas não tão bons para aprender a discriminar fortemente entre tópicos.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.Count Vectorizers
e 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.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 gensim
biblioteca em python tem uma implementação word2vec
que é direta o suficiente para que possa ser razoavelmente aproveitada para compilar doc2vec
, mas lembre-se da licença se você quiser seguir essa rotaEspero que ajude, deixe-me saber se você tiver alguma dúvida.
Há várias medidas de distância semântica, cada uma com seus prós e contras. Aqui estão apenas alguns deles:
Comece com uma abordagem mais simples e depois avance com base nos problemas do seu caso específico.
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.
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.
É ú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.