web-dev-qa-db-fra.com

Quels algorithmes puis-je utiliser pour détecter si des articles ou des postes sont des duplicats?

J'essaie de détecter si un article ou un poste de forum est une entrée en double dans la base de données. J'ai donné à cette pensée, en arrivant à la conclusion que quelqu'un qui dupliquait du contenu le fera en utilisant l'un des trois (en descendant difficile à détecter):

  1. copier simple coller tout le texte
  2. copier et coller des parties du texte la fusionner avec leur propre
  3. copier un article d'un site externe et de mascarade comme leur propre

Texte de préparation pour analyse

Fondamentalement des anomalies; L'objectif est de rendre le texte aussi "pur" que possible. Pour des résultats plus précis, le texte est "standardisé" par:

  1. Décapage des espaces blancs en double et une coupe de pointe et de fin.
  2. Les nouvelles lignes sont normalisées pour\n.
  3. Les balises HTML sont supprimées.
  4. L'utilisation d'une regex appelée les URL audacieuses de feu de feu sont dépouillées.
  5. J'utilise le code BB dans mon application afin que cela passe.
  6. (Ä) cleated et étranger (en plus de Enlgish) sont convertis à leur forme non étrangère.

Je stocke des informations sur chaque article dans (1) table de statistiques et dans la table des mots-clés (2).

((((1) Table de statistiques Les statistiques suivantes sont stockées sur le contenu textuel (un peu comme cet article)

  1. longueur du texte
  2. nombre de lettres
  3. Nombre de mots
  4. nombre de phrase
  5. mots moyens par phrase
  6. indice de lisibilité automatisé
  7. score de brouillard minning

Pour les langues européennes, le Coleman-Liau et l'indice de lisibilité automatisé doivent être utilisés car ils n'utilisent pas de comptage syllabe, afin de produire un score raisonnablement précis.

(2) Tableau des mots-clés

Les mots-clés sont générés en excluant une énorme liste de mots d'arrêt (mots communs), par ex., 'Le', 'a', 'de', 'à', etc., etc., etc.

Exemple de données

  • text_length, 3963
  • letter_Count, 3052
  • Word_Count, 684
  • phrase_count, 33
  • Word_per_sentence, 21
  • gunning_fog, 11.5
  • auto_read_index, 9.9
  • mot-clé 1, tué
  • mot-clé 2, Officiers
  • mot-clé 3, police

Il convient de noter qu'une fois qu'un article est mis à jour, toutes les statistiques ci-dessus sont régénérées et pourraient être des valeurs complètement différentes.

Comment puis-je utiliser les informations ci-dessus pour détecter si un article publié pour la première fois est déjà existant dans la base de données?


Je suis conscient de tout ce que je concevrai ne sera pas parfait, le plus grand risque étant (1) le contenu qui n'est pas un duplicatage sera signalé comme duplicata (2) le système permet au contenu dupliquer.

L'algorithme devrait donc générer un numéro d'évaluation des risques de 0 étant donné que le risque en double correspondant à une duplication possible et 10 en double. Tout ce qui précède 5 alors il y a une bonne possibilité que le contenu soit dupliquée. Dans ce cas, le contenu pourrait être signalé et lié à l'article des doublons possibles et un humain pourrait décider de supprimer ou de permettre de supprimer.

Comme je l'ai dit avant que je stocke des mots-clés pour l'ensemble de l'article, mais je me demande si je pouvais faire la même chose au paragraphe; Cela signifierait également séparer davantage mes données dans la DB, mais cela faciliterait également la détection (2) dans mon poste initial.

Je pense que la moyenne pondérée entre les statistiques, mais dans quel ordre et quelles seraient les conséquences ...

17
michael

Il y a de nombreux algorithmes qui traitent de la similarité du document dans la NLP. Voici un papier séminal décrivant divers algorithmes. Aussi Wikipedia a une plus grande collection. Je privilégie la mesure de jaro Winkler et je l'ai utilisée pour les projets scolaires de grades de méthodes de clustering aglomératifs.

4
Candide

Jetez un coup d'œil à la Rabin-Karp Algbolithm . Il utilise un ROLLING HASH un peu comme RSYNC utilise pour minimiser les octets transmis pendant une synchronisation. En ajustant la taille de la fenêtre que vous utilisez pour le hachage, vous pouvez le rendre plus ou moins sensible. R-K est utilisé pour, entre autres choses, la détection de plagiat, qui est essentiellement à la recherche d'une sorte de dupes.

6
Peter Rowell

Une première go à cela peut être de détecter des phrases (ou d'un autre bloc de données raisonnable. Prenez ces blocs et éliminer toutes les données de Mete, l'espace blanc aléatoire HTML, les retours, etc. Prenez un MD5 de résultat et stockez-le dans une table. Vous pouvez Puis faites correspondre contre ces blocs pour essayer de trouver des correspondances.

Si cela ne fonctionne pas, vous pouvez essayer N-grammes. Ici, vous avez besoin d'une entrée de chaque mot sur la page, mais cela devrait être en mesure de vous donner de très bons matchs.

http://fr.wikipedia.org/wiki/n-gram

4
gam3

Pour une mathématique mathématique exacte, je stockais un hasch puis comparer cela.

Je pense que les systèmes utilisés pour les examens mesurent des groupes de mots, puis la fréquence des groupes de chaque taille. Par exemple, une chaîne de 30 mots copiée marquerait 5 points de risque et 5 occurrences de 10 chaînes de mots Wold Score 5 points. Ensuite, vous auriez une hausse de 30 points pour 500 mots.

Vraiment, vous avez besoin d'un algorithme sémantique pour que des mots comme "aussi" et 'et' soient analysés comme les mêmes.

1
Inverted Llama