Pergunta

Estou procurando uma classe Java simples que possa calcular o cálculo TF-IDF. Eu quero fazer testes de similaridade em 2 documentos. Encontrei tantas grandes API que usaram a classe TF-IDF. Não quero usar um grande arquivo JAR, apenas para fazer meu teste simples. Por favor ajude ! Ou o mais se alguém pode me dizer como encontrar TF? e IDF? Vou calcular os resultados :) ou se você puder me dizer um bom tutorial de Java para isso. Por favor, não me diga por procurar o Google, eu já fiz por 3 dias e não consegui encontrar nada :( Por favor, também não me referam ao Lucene :(

Foi útil?

Solução

A frequência de termo é a raiz quadrada do número de vezes que ocorre um termo em um documento específico.

A frequência inversa do documento é (o registro de (o número total de documentos divididos pelo número de documentos que contêm o termo)) mais um, caso o termo ocorra zero vezes - se isso acontecer, obviamente não tente se dividir por zero.

Se não estiver claro nessa resposta, há um TF por termo por documento e um IDF por termo.

E então tf-idf (termo, documento) = tf (termo, documento) * iDF (termo)

Por fim, você usa o modelo de espaço vetorial para comparar documentos, onde cada termo é uma nova dimensão e o "comprimento" da parte do vetor apontando nessa dimensão é o cálculo TF-IDF. Cada documento é um vetor, então calcule os dois vetores e calcule a distância entre eles.

Então, para fazer isso em Java, leia o arquivo em uma linha de cada vez com um FileReader ou algo assim e divida -se em espaços ou quaisquer outros delimitadores que você deseja usar - cada palavra é um termo. Conte o número de vezes que cada termo aparece em cada arquivo e o número de arquivos em que cada termo aparece. Então você tem tudo o que precisa para fazer os cálculos acima.

E como não tenho mais nada a fazer, procurei a fórmula de distância do vetor. Aqui está:

D=sqrt((x2-x1)^2+(y2-y1)^2+...+(n2-n1)^2)

Para esse fim, o X1 é o TF-IDF para o termo X no documento 1.

Editar: em resposta à sua pergunta sobre como contar as palavras em um documento:

  1. Leia o arquivo alinhado por linha com um leitor, como new BufferedReader(new FileReader(filename)) - você pode ligar BufferedReader.readLine() Em um tempo, o loop, verificando a nulo de cada vez.
  2. Para cada linha, ligue line.split("\\s") - Isso dividirá sua linha no espaço em branco e fornecerá uma variedade de todas as palavras.
  3. Para cada palavra, adicione 1 à contagem da palavra para o documento atual. Isso pode ser feito usando um HashMap.

Agora, após a computação d para cada documento, você terá X valores em que x é o número de documentos. Comparar todos os documentos um contra o outro é fazer apenas x^2 comparações - isso não deve demorar muito por 10.000. Lembre -se de que dois documentos são mais semelhantes se o valor absoluto da diferença entre seus valores d for menor. Portanto, você pode calcular a diferença entre o DS de cada par de documentos e armazenar que em uma fila de prioridade ou alguma outra estrutura classificada, de modo que os documentos mais semelhantes borbulham até o topo. Faz sentido?

Outras dicas

AGAZERBOY, Postagem do blog de Sujit Pal fornece uma descrição completa do cálculo do TF e IDF. WRT Verificando os resultados, sugiro que você comece com um pequeno corpus (digamos 100 documentos) para que você possa ver facilmente se está correto. Para 10000 documentos, o uso do Lucene começa a parecer uma escolha realmente racional.

Enquanto você pediu especificamente para não se referir ao Lucene, permita -me apontar para você a classe exata. A aula que você está procurando é Padrão de similaridade. Possui uma API extremamente simples para calcular TF e IDF. Veja o código Java aqui. Ou você pode apenas se implementar conforme especificado na documentação padrão da finalidade.

          TF = sqrt(freq)

e

          IDF = log(numDocs/(docFreq+1)) + 1.

As funções de log e SQRT são usadas para úmido os valores reais. O uso dos valores brutos pode distorcer os resultados drasticamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top