Deixe-me abordar isso descrevendo as quatro métricas de semelhança talvez mais comuns para sacos de palavras e vetores de documentos (contagem) em geral, que estão comparando coleções de variáveis discretas.
A similaridade do cosseno é usada com mais frequência em geral, mas você deve sempre medir primeiro e garantir que nenhuma outra similaridade produza melhores resultados para o seu problema, avaliando se você pode usar algumas das medidas mais complexas. Exceto pela similaridade definida por Jaccard, você pode (de fato, pode querer) aplicar alguma forma de ponderação de TF-IDF (ff) às contagens / vetores do documento antes de usar essas medidas. O termo de ponderação de TF pode até ser Okapi-BM25 , e o termo IDF substituído por entropia de corpus , mas no final tem pouco a ver com a pergunta original em questão (medidas de similaridade de BoW).
Observe que a primeira medida, a semelhança de Jaccard, sofre uma desvantagem significativa: é a mais afetada pelas diferenças de comprimento entre os documentos e também não considera as frequências de palavras. Para semelhança cosseno eχ2a distância que você pode (ou melhor, deveria) ajustar os vetores normalizando seus vetores para o comprimento da unidade (ou seja, além da re-ponderação do TF-IDF). Porém, mesmo assim, documentos mais curtos terão contagens mais esparsas (ou seja, mais zeros em seus vetores) em comparação com documentos mais longos, por razões óbvias. (Uma maneira de contornar essa diferença de esparsidade pode ser incluir apenas palavras acima de um limite mínimo, usando um valor de corte dinâmico que aumenta com o comprimento do documento.)
Antes de examinarmos as medidas, deve-se mencionar que essa discussão se concentra apenas em medidas simétricas , enquanto as medidas assimétricas também existem (principalmente a divergência KL ).
Essa é a métrica mais simplista: colete o conjunto de todas as palavras nos dois documentos (tweets, frases, ...), UMA e Be meça a fração de palavras que os dois conjuntos têm em comum:
JA , B=| A ∩ B || A ∪ B |
Essa medida também funciona para palavras (e documentos) coletando conjuntos de caracteres (ou palavras) n-grams, onde nnormalmente é 1, 2 e talvez 3. Observe que a similaridade de Jaccard tem seus limites; Se a sequência deA estava (x,y,z,x,y,z,x,y,z) e o de B eram apenas (x,y,z), sua semelhança com Jaccard é perfeita (ou seja, 1.0), a menos que você use o "truque" n-grama descrito acima.
Finalmente, deve-se notar que o coeficiente de dadosD é uma versão um pouco mais envolvente da semelhança de Jaccard, mas também não leva em conta a contagem de palavras e pode ser facilmente calculada a partir de J Como: D=2J1+J.
A semelhança do cosseno é provavelmente de longe a métrica mais popular. Colete conjuntos ordenados de todas as contagens de palavras dos dois documentos (tweets, frases, ...),A e B, isto é, efetivamente, dois " vetores de documentos "a⃗ e b⃗ e meça o ângulo cosseno entre os dois vetores:
αA,B=a⃗ ⋅b⃗ |a⃗ ||b⃗ |=∑aibi∑a2i−−−−√∑b2i−−−−√
Agora, como você pode normalizar seus vetores para vetores unitários (ou seja, o |z⃗ |partes) antes de fazer esse cálculo, na verdade você só precisa calcular o produto escalar entre os dois vetores para calcular a similaridade - que nada mais é do que a soma dos produtos de todos os pares. O produto escalar pode ser calculado especialmente eficiente em CPUs modernas.
Em vez de usar as contagens de cada palavra, você ordena as palavras de cada documento pelas respectivas contagens e, assim, atribui uma classificação a cada palavra, para qualquer documento,A e B. Isso evita que você precise normalizar os vetores do documento. Vamos usar a nomenclatura da Wikipedia e chamar a função de geração de classificação (que encontra a classificação para uma determinada palavrai de uma lista de tuplas (palavra, contagem) Xou um vetor de documento x⃗ ) rg. Segundo, vamos definir essa distânciad entre a mesma palavra i entre os dois documentos como di=rg(A,i)−rg(B,i). Isso é,da diferença entre as duas fileiras, zero se igual e diferente de zero. Com isso, o coeficiente pode ser calculado a partir de números inteiros como:
ρA,B=1−6−∑d2in(n2−1)
Observe que esta formulação tem um forte requisito: todas as classificações devem ser distintas ; portanto, mesmo para empates (se duas palavras tiverem a mesma contagem no mesmo documento), você precisará atribuir-lhes classificações distintas; Sugiro que você use a ordem alfanumérica nesses casos. E para palavras que ocorrem apenas em um documento, você as coloca na última posição (ões) no outro documento (novamente usando a mesma ordem alfanumérica). Deve-se observar que, ao re-ponderar suas contagens com o TF-IDF antes de calcular essa similaridade, você pode ter muito menos vínculos entre palavras com contagens diferentes de zero.
Se você deseja manter vínculos (ou seja, não deseja "artificialmente" tornar todas as fileiras distintas) ou se estiver usando pontos de corte para remover algumas das tuplas (palavra, contagem) ou selecionar apenas a parte superior, n palavras mais frequentes, no entanto, você deve usar a fórmula padrão para ρ (e defina rgcomo uma função que gera o vetor de classificação completo para todas as tuplas ordenadas alfanumericamente (palavra, contagem) do seu documentoXno vetor de documentox⃗ ):
ρA,B=cov(rg(a⃗ ),rg(b⃗ ))σrgAσrgB
Onde cové a covariância entre as fileiras dos dois documentos eσrgX é o desvio padrão das fileiras (possivelmente cortadas) rg (com laços) do documento X.
Em poucas palavras, você pode ver essa abordagem a meio caminho entre a semelhança de Jaccard e a semelhança de cosseno. Particularmente, é (um pouco mais - veja a próxima medida) robusta contra diferenças de distribuição entre as contagens de palavras entre os documentos, enquanto ainda leva em consideração a frequência geral das palavras. No entanto, na maioria dos trabalhos, a semelhança de cosseno parece superar a correção de classificação de Spearman - mas você deve testar isso e obter bons resultados com TF-IDF e Spearman, enquanto, como dito, essa abordagem não exige que você faça a normalização do comprimento dos seus vetores de documentos.
Até agora, todas as nossas medidas de similaridade assumem a homogeneidade das frequências de palavras, ou seja, as variações de nossa contagem de palavras são iguais entre todos os documentos de uma coleção (um "corpus"), algo que é (esperançosamente, intuitivamente) não o caso . Ou seja, anteriormente, Kilgarriff (1997) demonstrou que oχ2é mais adequado para comparar a contagem de palavras do que as medidas acima. Observe que, se você está seguindo a pesquisa atual, para comparações de corpus hoje (por exemplo, para fazer a seleção de recursos ), no entanto, provavelmente você deve estar usando o teste de Bootstrap em vez deχ2.
Kilgarriff's χ2 a comparação também pode ser aplicada aos documentos (assumindo que existem apenas duas "classes", seus dois documentos e, portanto, d.f.=1) e, devido à sua robustez, pode ser preferível às medidas de similaridade mostradas até agora. Observe que essa abordagem oferece uma distância para converter esse valor em uma semelhança . Você deve tomar o inverso (ou seja, quanto maior essa distância, menor a semelhança do documento). Vamos definir a contagem de todas as palavras em um documentoX Como nX=∑xi e total de ambos os documentos A e B Como n=nA+nB. Então umaχ2distância baseada em estatística para dois documentos (vetores de documentos) pode ser derivada da fórmula base de Pearson∑(Oi−Ei)2Ei Como:
χ2A,B=n[∑a2inA(ai+bi)+∑b2inB(ai+bi)]−n
No entanto, esse cálculo é computacionalmente muito mais caro de executar, provavelmente explicando por que a maioria das abordagens se apega à semelhança do Cosine e, ainda mais, se você pode verificar se seus resultados de classificação / recuperação / agrupamento não obtêm ganhos com essa última medida de distância. Além disso, como mostra o artigo vinculado, essa medida de distância não parece superar a semelhança de Cosine com a ponderação de TF-IDF. Mas observe que o artigo vinculado usa o termo "bruto" de contagem de frequência para calcular essa medida de distância e compara isso à semelhança de Cosine ponderada novamente pelo TF-IDF. Como já discutido, geralmente é uma boa idéia normalizar primeiro os vetores de documentos nas contagens de palavras (ou seja, comprimentos) para obter bons resultados, como transformarX/nX primeiro (e você pode até tentar aplicar a re-ponderação do vetor de documento TF-IDF antes disso também), caso em que a fórmula acima simplifica (um pouco) para:
χ2A,B=2[∑a2iai+bi+∑b2iai+bi]−2