Prüfung auf Dokumentduplikate und ähnliche Dokumente in einer Dokumentenverwaltungsanwendung

8

Update: Ich habe jetzt eine PHP-Erweiterung namens php_ssdeep für die ssdeep C-API, um fuzzy-Hashing und Hash-Vergleiche in PHP nativ zu ermöglichen. Weitere Informationen finden Sie bei meinem Blog . Ich hoffe, das ist hilfreich für die Menschen.

Ich bin an der Erstellung einer benutzerdefinierten Dokumentenverwaltungsanwendung in PHP auf einer Linux-Box beteiligt, die verschiedene Dateiformate (möglicherweise 1000er Dateien) speichern wird. Außerdem müssen wir prüfen können, ob ein Textdokument bereits hochgeladen wurde, um eine Duplizierung zu verhindern in der Datenbank.

Im Wesentlichen, wenn ein Benutzer eine neue Datei hochlädt, möchten wir in der Lage sein, sie mit einer Liste von Dateien zu präsentieren, die entweder Duplikate sind oder ähnlichen Inhalt enthalten. Dies würde ihnen dann erlauben, eines der bereits vorhandenen Dokumente auszuwählen oder mit dem Hochladen eines eigenen Dokuments fortzufahren.

Ähnliche Dokumente würden bestimmt, indem man durch ihren Inhalt nach ähnlichen Empfindungen und vielleicht einer dynamisch generierten Liste von Schlüsselwörtern sucht. Wir können dann eine prozentuale Übereinstimmung für den Benutzer anzeigen, um ihnen zu helfen, die Duplikate zu finden.

Können Sie irgendwelche Pakete für diesen Prozess empfehlen und irgendwelche Ideen, wie Sie das in der Vergangenheit gemacht haben könnten?

Das direkte Duplikat, denke ich, kann gemacht werden, indem man den ganzen Textinhalt bekommt und

  • Leerzeichen entfernen
  • Entfernen der Interpunktion
  • In Klein- oder Großbuchstaben umwandeln

Bilden Sie dann einen MD5-Hash, um ihn mit neuen Dokumenten zu vergleichen. Das Entfernen dieser Elemente verhindert, dass Duplikate nicht gefunden werden, wenn der Benutzer ein Dokument bearbeitet, um beispielsweise zusätzliche Absatzpausen hinzuzufügen. Irgendwelche Gedanken?

Dieser Prozess könnte auch als nächtlicher Job ausgeführt werden und wir könnten den Benutzer bei der nächsten Anmeldung über alle Duplikate informieren, wenn die Rechenanforderungen zu groß sind, um in Echtzeit ausgeführt werden zu können. Echtzeit wäre jedoch bevorzugt.

    
Treffynnon 13.11.2009, 12:36
quelle

2 Antworten

5

Update: Ich habe jetzt eine PHP-Erweiterung namens php_ssdeep geschrieben für die ssdeep C-API, um Fuzzy-Hashing und Hash-Vergleiche in PHP nativ zu ermöglichen. Weitere Informationen finden Sie bei meinem Blog . Ich hoffe, das ist hilfreich für die Menschen.

Ich habe ein Programm gefunden, das tut, was sein Schöpfer, Jesse Kornblum, "Fuzzy Hashing" nennt. Im Grunde macht es Hashes einer Datei, die verwendet werden kann, um ähnliche Dateien oder identische Übereinstimmungen zu erkennen.

Die Theorie dahinter ist hier dokumentiert: Identifizieren fast identischer Dateien mit Kontext-getriggertem stückweise Hashing

ssdeep ist der Name des Programms und kann unter Windows oder Linux ausgeführt werden. Es war für den Einsatz in der Forensik gedacht, aber es scheint für unsere Zwecke geeignet zu sein. Ich habe einen kurzen Test auf einem alten Pentium 4-Rechner gemacht und es dauert etwa 3 Sekunden, um eine Hash-Datei von 23 MB (Hashes für knapp 135.000 Dateien) zu durchsuchen, die nach Übereinstimmungen mit zwei Dateien sucht. Diese Zeit beinhaltet das Erstellen von Hashes für die beiden Dateien, nach denen ich gesucht habe.

    
Treffynnon 13.11.2009, 16:23
quelle
1

Ich arbeite an einem ähnlichen Problem in web2project und nachdem ich geforscht und gegraben habe, kam ich zu dem Schluss, dass "der Benutzer sich nicht darum kümmert". Das Vorhandensein doppelter Dokumente ist für den Benutzer nicht wichtig, solange sie ihr eigenes Dokument unter ihrem eigenen Namen finden können.

Davon abgesehen, hier ist der Ansatz, den ich nehme:

  • Einem Benutzer erlauben, ein Dokument hochzuladen, das es mit den gewünschten Projekten / Aufgaben verknüpft;
  • Die Datei sollte umbenannt werden, um zu verhindern, dass jemand über http .. oder besser außerhalb des Webstamms darauf zugreift. Der Benutzer wird immer noch seinen Dateinamen im System sehen und wenn sie es herunterladen, können Sie die Header mit dem "richtigen" Dateinamen;
  • setzen
  • Verarbeiten Sie irgendwann zu einem späteren Zeitpunkt das Dokument, um zu sehen, ob es Duplikate gibt. An dieser Stelle ändern wir das Dokument jedoch nicht . Schließlich könnte es wichtige Gründe dafür geben, dass das Leerzeichen oder die Großschreibung geändert wird;
  • Wenn Duplikate vorhanden sind, lösche die neue Datei und verlinke dann auf die alte;
  • Wenn es keine Betrogenen gibt, dann tu nichts;
  • Indexieren Sie die Datei für Suchbegriffe - abhängig vom Dateiformat gibt es viele Optionen, sogar für Word-Dokumente;

Währenddessen erzählen wir dem Benutzer nicht, dass es ein Duplikat war ... es interessiert sie nicht. Es sind uns (Entwickler, Datenbankadministratoren, usw.), die sich interessieren.

Und das funktioniert auch, wenn Sie später eine neue Version der Datei hochladen. Zuerst löschen Sie den Verweis auf die Datei, dann - genau wie in der Garbage Collection - löschen Sie nur die alte Datei, wenn es keine Referenzen darauf gibt.

    
CaseySoftware 13.11.2009 13:31
quelle