Mit welchen Algorithmen kann ich feststellen, ob Artikel oder Posts Duplikate sind?

17

Ich versuche festzustellen, ob ein Artikel oder ein Forumsbeitrag ein doppelter Eintrag in der Datenbank ist. Ich habe darüber nachgedacht und bin zu dem Schluss gekommen, dass jemand, der Inhalte dupliziert, dies mithilfe einer der drei folgenden Methoden tun wird (in absteigender Reihenfolge schwer zu erkennen):

  1. Kopieren Sie einfach den gesamten Text
  2. Kopieren Sie Textteile, und fügen Sie sie in ihre eigenen Teile ein
  3. Kopiere einen Artikel von einer externen Seite und maskiere ihn als ihren eigenen

Text zur Analyse vorbereiten

Grundsätzlich keine Anomalien; Ziel ist es, den Text so "rein" wie möglich zu gestalten. Für genauere Ergebnisse ist der Text "standardisiert" durch:

  1. Entfernen doppelter Leerzeichen und Trimmen von führenden und nachfolgenden Leerzeichen.
  2. Zeilenumbrüche sind standardisiert auf \ n.
  3. HTML-Tags werden entfernt.
  4. Mit einem RegEx namens Daring Fireball werden URLs entfernt.
  5. Ich benutze BB-Code in meiner Bewerbung, damit geht.
  6. (ä) Cented und Foreign (außer Enlgish) werden in ihre nicht fremde Form umgewandelt.

Ich speichere Informationen zu jedem Artikel in (1) Statistiktabelle und in (2) Keyword-Tabelle.

(1) Statistiktabelle Die folgenden Statistiken werden über den Textinhalt gespeichert (ähnlich wie in diesem Beitrag).

  1. Textlänge
  2. Anzahl der Buchstaben
  3. Wortzahl
  4. Satzanzahl
  5. durchschnittliche Wörter pro Satz
  6. automatisierter Lesbarkeitsindex
  7. Sprühnebel Punktzahl

Für europäische Sprachen sollten Coleman-Liau und Automated Readability Index verwendet werden, da sie keine Silbenzählung verwenden und daher eine einigermaßen genaue Punktzahl ergeben sollten.

(2) Schlüsselworttabelle

Die Schlüsselwörter werden durch Ausschließen einer großen Liste von Stoppwörtern (gebräuchlichen Wörtern) generiert, z. B. 'the', 'a', 'of', 'to' usw. usw.

Beispieldaten

  • text_length, 3963
  • letter_count, 3052
  • word_count, 684
  • sentence_count, 33
  • word_per_sentence, 21
  • gunning_fog, 11.5
  • auto_read_index, 9.9
  • Stichwort 1, getötet
  • Schlüsselwort 2, Offiziere
  • Stichwort 3, Polizei

Es ist zu beachten, dass nach der Aktualisierung eines Artikels alle oben genannten Statistiken neu generiert werden und völlig andere Werte annehmen können.

Wie kann ich anhand der obigen Informationen feststellen, ob ein Artikel, der zum ersten Mal veröffentlicht wird, bereits in der Datenbank vorhanden ist?


Mir ist bewusst, dass alles, was ich entwerfen werde, nicht perfekt sein wird. Das größte Risiko besteht darin, dass (1) Inhalte, die keine Duplikate sind, als Duplikate gekennzeichnet werden. (2) Das System lässt die Duplikate durch.

Der Algorithmus sollte daher eine Risikobewertungsnummer aus 0 (kein Duplikat), 5 (mögliches Duplikat) und 10 (Duplikat) generieren. Bei mehr als 5 besteht die gute Möglichkeit, dass der Inhalt doppelt vorhanden ist. In diesem Fall könnte der Inhalt markiert und mit den Artikeln verlinkt werden, bei denen es sich möglicherweise um Duplikate handelt, und ein Mensch könnte entscheiden, ob er sie löscht oder zulässt.

Wie ich bereits sagte, speichere ich Schlüsselwörter für den gesamten Artikel. Ich frage mich jedoch, ob ich das auch auf Absatzbasis tun kann. Dies würde auch bedeuten, meine Daten in der Datenbank weiter zu trennen, würde aber auch das Erkennen von (2) in meinem ersten Beitrag erleichtern.

Ich denke gewichteter Durchschnitt zwischen den Statistiken, aber in welcher Reihenfolge und was wären die Konsequenzen ...

michael
quelle
Wenn es sich um eine exakte Übereinstimmung handelt, können Sie einfach ein Feld als eindeutig festlegen. Wenn nicht, müssen Sie entscheiden, wann ein Text als Kopie oder als eng abgeleitetes Werk betrachtet werden kann.
James P.
2
Es gibt viele Richtungen, in die diese Art der Analyse gehen kann. Menschen schreiben ganze Bücher über diese Art von Thema. Wenn es Ihr Ziel ist, "relative Nähe" zu bestimmen, haben Sie wirklich keine andere Wahl, als sich mit dem zu befassen, was als Verarbeitung natürlicher Sprachen und maschinelles Lernen bezeichnet wird . So nennen es Informatiker, aber es ist wirklich nur eine fortgeschrittene statistische Analyse. Ein guter Ausgangspunkt könnte darin bestehen, nach Abständen zu suchen, aber "dumme" Statistiken wie Wort- / Satzzählungen werden wahrscheinlich nur sehr wenig für Sie tun.
Rdlowrey
1
Auch bevor es von SO migriert wurde, wurde dieses mit [php] markiert, so dass Sie die native levenshtein- Funktion von php überprüfen können
rdlowrey
Tolle Idee, einen menschlichen Scheck wahrscheinlich duplizieren zu lassen! Möglicherweise können Sie automatisch feststellen, dass> 7 ein Duplikat und <6 ein anderes ist und nur Menschen Punkte von 6 oder 7 prüfen lassen. kennt keine Kategorie; Ein grauer Bereich zwischen einem fast doppelten und einem Originalwerk, in dem das Beste, was Sie tun können, darin besteht, ein willkürliches Urteil zu fällen.
GlenPeterson
@rdlowrey - Levenshtein Algorithmen sind das, was ich in einem ähnlichen Projekt verwendet habe, das ich in C # gemacht habe. Ich stimme zu, es ist ein guter Anfang und kann genug sein.
Jfrankcarr

Antworten:

4

Es gibt viele Algorithmen, die sich mit der Ähnlichkeit von Dokumenten in NLP befassen. Hier ist eine wegweisende Arbeit , die verschiedene Algorithmen beschreibt. Auch Wikipedia hat eine größere Sammlung. Ich bevorzuge die Maßnahme von Jaro Winkler und habe sie für Projekte an Graduiertenschulen in aglomerativen Clustering-Methoden verwendet.

Candide
quelle
6

Schauen Sie sich den Rabin-Karp-Algorithmus an . Es wird ein fortlaufender Hash verwendet, ähnlich wie bei rsync, um die während einer Synchronisierung übertragenen Bytes zu minimieren. Durch Anpassen der Größe des Fensters, das Sie für den Hash verwenden, können Sie ihn mehr oder weniger empfindlich machen. RK wird unter anderem zur Erkennung von Plagiaten eingesetzt, bei denen grundsätzlich nach Dupes gesucht wird.

Peter Rowell
quelle
4
Das Problem, das das OP beschreibt, scheint genau wie die Erkennung von Plagiaten zu sein , und ich würde vorschlagen, dass Sie als Erstes nach Hilfe suchen. (Bitte geben Sie unbedingt Ihre Quellen an!)
Caleb
4

Ein erster Versuch könnte darin bestehen, Sätze (oder einen anderen vernünftigen Datenblock) zu erkennen. Nehmen Sie diese Blöcke und entfernen Sie alle mete-Daten, HTML-Leerzeichen, Rückgaben usw. Nehmen Sie ein MD5-Ergebnis und speichern Sie es in einer Tabelle Stelle dann eine Übereinstimmung mit diesen Blöcken her, um Übereinstimmungen zu finden.

Wenn dies nicht funktioniert, versuchen Sie es mit n-Gramm. Hier brauchen Sie einen Eintrag für jedes Wort auf der Seite, aber es sollte in der Lage sein, Ihnen ziemlich gute Übereinstimmungen zu geben.

http://en.wikipedia.org/wiki/N-gram

gam3
quelle
Auf n-Gramm basierende Messwerte sind viel besser als MD5-Hashes, insbesondere für semi-strukturierte Daten wie HTML.
Candide
1

Für eine genaue mathematische Berechnung würde ich einen Hash speichern und diesen dann vergleichen.

Ich denke, die Systeme, die für Prüfungen verwendet werden, messen Gruppen von Wörtern und dann die Häufigkeit von Gruppen jeder Größe. Zum Beispiel würde eine Kette von 30 Wörtern, die kopiert werden, 5 Risikopunkte und 5 Vorkommen von 10 Wortketten 5 Punkte erzielen. Dann hätten Sie einen Grenzwert von 30 Punkten pro 500 Wörter.

Wirklich, Sie brauchen einen semantischen Algorithmus, damit Wörter wie 'also' und 'and' als dasselbe analysiert werden.

Umgekehrtes Lama
quelle