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 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.
- 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 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.
- 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 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 rota
Espero que ajude, deixe-me saber se você tiver alguma dúvida.
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.
fonte
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.
fonte
É ú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.
fonte