Estou tentando detectar se uma postagem de artigo ou fórum é uma entrada duplicada no banco de dados. Pensei um pouco sobre isso, chegando à conclusão de que alguém que duplicou o conteúdo o faria usando um dos três (em descendente difícil de detectar):
- cópia simples cole o texto inteiro
- copiar e colar partes do texto, mesclando-o com seus próprios
- copie um artigo de um site externo e disfarce como seu
Preparando o texto para análise
Basicamente qualquer anomalia; o objetivo é tornar o texto o mais "puro" possível. Para resultados mais precisos, o texto é "padronizado" por:
- Retirar espaços em branco duplicados e aparar à esquerda e à direita.
- Novas linhas são padronizadas para \ n.
- Tags HTML são removidas.
- Usando um RegEx chamado Daring Fireball, os URLs são removidos.
- Eu uso o código BB no meu aplicativo para que vá para.
- (ä) cêntricos e estrangeiros (além do inglês) são convertidos para sua forma não estrangeira.
Eu armazeno informações sobre cada artigo na (1) tabela de estatísticas e na (2) tabela de palavras-chave.
(1) Tabela de estatísticas As estatísticas a seguir são armazenadas sobre o conteúdo textual (muito parecido com este post)
- comprimento do texto
- contagem de letras
- contagem de palavras
- contagem de sentenças
- média de palavras por frase
- índice de legibilidade automatizado
- pontuação de nevoeiro
Para os idiomas europeus, Coleman-Liau e o Índice de Legibilidade Automatizada devem ser usados, pois não usam contagem de sílabas; portanto, devem produzir uma pontuação razoavelmente precisa.
(2) Tabela de palavras-chave
As palavras-chave são geradas pela exclusão de uma lista enorme de palavras de parada (palavras comuns), por exemplo, 'the', 'a', 'of', 'to', etc., etc.
Dados de amostra
- text_length, 3963
- letter_count, 3052
- word_count, 684
- frase_contagem, 33
- word_per_sentence, 21
- gunning_fog, 11.5
- auto_read_index, 9.9
- palavra-chave 1, morta
- palavra-chave 2, oficiais
- palavra chave 3, polícia
Deve-se observar que, depois que um artigo é atualizado, todas as estatísticas acima são regeneradas e podem ter valores completamente diferentes.
Como eu poderia usar as informações acima para detectar se um artigo publicado pela primeira vez já existe no banco de dados?
Sei que tudo o que projetar não será perfeito, o maior risco é (1) O conteúdo que não é duplicado será sinalizado como duplicado (2) O sistema permite a passagem do conteúdo duplicado.
Portanto, o algoritmo deve gerar um número de avaliação de risco de 0, sem risco duplicado 5, sendo possível duplicado e 10 sendo duplicado. Qualquer coisa acima de 5, há uma boa possibilidade de o conteúdo ser duplicado. Nesse caso, o conteúdo pode ser sinalizado e vinculado às possíveis duplicatas do artigo, e um humano pode decidir se deseja excluir ou permitir.
Como eu disse antes, estou armazenando palavras-chave para todo o artigo, mas gostaria de saber se poderia fazer o mesmo com base em parágrafos; isso também significaria separar ainda mais meus dados no banco de dados, mas também facilitaria a detecção (2) no meu post inicial.
Estou pensando em média ponderada entre as estatísticas, mas em que ordem e quais seriam as consequências ...
fonte
Respostas:
Existem muitos algoritmos que lidam com a similaridade de documentos na PNL. Aqui está um artigo seminal descrevendo vários algoritmos. A wikipedia também possui uma coleção maior. Sou a favor da medida de Jaro Winkler e a usei para projetos de pós-graduação em métodos aglomerativos de agrupamento.
fonte
Dê uma olhada no algboritmo de Rabin-Karp . Ele usa um hash rotativo, como o rsync usa para minimizar os bytes transmitidos durante uma sincronização. Ao ajustar o tamanho da janela que você usa para o hash, você pode torná-lo mais ou menos sensível. O RK é usado para, entre outras coisas, a detecção de plágio, que está basicamente procurando uma espécie de fraude.
fonte
Um primeiro passo para isso pode ser detectar sentenças (ou algum outro bloco de dados razoável. Pegue esses blocos e retire quaisquer dados mete, espaço em branco aleatório em html, retornos etc. Pegue um MD5 de resultado e armazene-o em uma tabela. então combine contra esses blocos para tentar encontrar combinações.
Se isso não funcionar, você pode tentar n-gramas. Aqui você precisa de uma entrada de cada palavra na página, mas ela deve oferecer boas correspondências.
http://en.wikipedia.org/wiki/N-gram
fonte
Para uma matemática matemática exata, eu armazenaria um hash e depois o compararia.
Penso que os sistemas utilizados nos exames medem grupos de palavras e depois a frequência de grupos de cada tamanho. Por exemplo, uma cadeia de 30 palavras copiadas terá 5 pontos de risco e 5 ocorrências de 10 cadeias de palavras terão 5 pontos. Em seguida, você terá uma limitação de 30 pontos por 500 palavras.
Você realmente precisa de um algoritmo semântico para que palavras como 'also' e 'e' sejam analisadas da mesma forma.
fonte