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):
- Kopieren Sie einfach den gesamten Text
- Kopieren Sie Textteile, und fügen Sie sie in ihre eigenen Teile ein
- 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:
- Entfernen doppelter Leerzeichen und Trimmen von führenden und nachfolgenden Leerzeichen.
- Zeilenumbrüche sind standardisiert auf \ n.
- HTML-Tags werden entfernt.
- Mit einem RegEx namens Daring Fireball werden URLs entfernt.
- Ich benutze BB-Code in meiner Bewerbung, damit geht.
- (ä) 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).
- Textlänge
- Anzahl der Buchstaben
- Wortzahl
- Satzanzahl
- durchschnittliche Wörter pro Satz
- automatisierter Lesbarkeitsindex
- 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 ...
quelle
Antworten:
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.
quelle
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.
quelle
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
quelle
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.
quelle