Text mit Vorlage vergleichen, um Anomalien zu erkennen (reverse template)

8

Ich suche nach einem Algorithmus oder sogar nach einem Algorithmusraum, der sich mit dem Problem der Validierung dieses kurzen Textes (E-Mail) beschäftigt, der mit bekannten Vorlagen übereinstimmt. Die Codierung wird wahrscheinlich Python oder Perl sein, aber das ist flexibel.

Hier ist das Problem:

Server mit Zugriff auf Produktionsdaten müssen in der Lage sein, E-Mails zu senden, die ins Internet gelangen:

%Vor%

Offensichtlich werden einige der E-Mail-Inhalte variieren - die Anrede ("John Smith"), "$ 123.45 am 2/4/13" und die Zeilen mit ausgedruckten Transaktionen. Andere Teile ("Wir haben Ihre letzte Zahlung erhalten") sind sehr statisch. Ich möchte in der Lage sein, die statischen Teile des Textes abzugleichen und zu quantifizieren, dass die dynamischen Teile innerhalb bestimmter vernünftiger Grenzen liegen (ich weiß, dass zum Beispiel die meisten zu druckenden Transaktionszeilen 5 sind).

Da mir die Datenexfiltration Sorgen bereitet, möchte ich sicherstellen, dass E-Mails, die nicht mit dieser Vorlage übereinstimmen, nie gelöscht werden. Ich möchte E-Mails untersuchen und alles in Quarantäne verschieben, das nicht wie erwartet aussieht. Also muss ich dieses Vorlagen-Matching automatisieren und alle E-Mails blockieren, die weit genug vom Matching entfernt sind.

Die Frage ist also: Wo suche ich nach einem Filtermechanismus? Die Bayes'sche Filterung versucht, eine ausreichende Ähnlichkeit zwischen einer spezifischen Nachricht und einem nicht spezifischen Korpus zu verifizieren, was das gegenteilige Problem darstellt. Dinge wie das Template-Modul von Perl sind eine enge Übereinstimmung - aber für die Ausgabe, nicht für die Eingabe oder den Vergleich. Einfache 'Diff'-Typvergleiche werden die begrenzten dynamischen Informationen nicht gut verarbeiten.

Wie überprüfe ich, ob diese ausgehenden E-Mail-Nachrichten "wie eine Ente quaken"?

    
gowenfawr 05.02.2013, 18:14
quelle

3 Antworten

4

Sie könnten Grammatiken für eine enge Übereinstimmung verwenden. Es ist möglich, Regexps in Grammatiken zur einfacheren Abstraktion zu organisieren: Ссылка

Oder Sie könnten eine dedizierte Grammatik-Engine Marpa verwenden.

Wenn Sie einen statistischeren Ansatz bevorzugen, sollten Sie n-grams in Erwägung ziehen. Zuerst wird der Text in Tokens umgewandelt und variable Chunks durch sinnvolle Platzhalter wie CURRENCY und DATE ersetzt. Dann erstellen Sie die N-Gramme . Jetzt können Sie den Jaccard-Index verwenden, um zwei Texte zu vergleichen.

Hier ist eine Pure-Perl-Implementierung, die an Trigrammen arbeitet:

%Vor%

Sie können einen Text als Vorlage verwenden und ihn mit Ihren E-Mails abgleichen. Überprüfen Sie String :: Trigramm auf eine effiziente Implementierung. Google Ngram Viewer ist eine nette Ressource zur Veranschaulichung des n-gram Abgleichs.

    
creaktive 17.02.2013, 16:48
quelle
3

Wenn Sie eine bereits vorhandene Vorlage mit z. Kontrollieren Sie Flow-Elemente wie {% for x in y %} gegen eine angenommene Ausgabe, Sie werden die Template-Sprache parsen müssen - was wie viel Arbeit aussieht.

Andererseits, wenn Sie bereit sind, eine zweite Vorlage für Validierungszwecke zu schreiben - etwa so:

%Vor%

... was nur eine einfache Erweiterung der Regex-Syntax ist, es ist ziemlich einfach, etwas zusammen zu hacken, das dagegen urteilen wird:

%Vor%

Das obige Beispiel ist zwar nicht der größte Python-Code aller Zeiten, aber es ist genug, um die allgemeine Idee zu vermitteln.

    
Zero Piraeus 15.02.2013 17:25
quelle
2

Ich würde für die "längste gemeinsame Subsequenz" gehen. Eine Standardimplementierung finden Sie hier:

Ссылка

Wenn Sie einen besseren Algorithmus und / oder viele zusätzliche Ideen für ungenaues Vergleichen von Strings benötigen, ist die Standardreferenz dieses Buch:

Ссылка

Lassen Sie sich nicht vom Titel täuschen. In der Biologie der Computerwissenschaft geht es hauptsächlich um den Abgleich großer Datenbanken mit langen Strings (auch bekannt als DNA-Sequenzen).

    
Udo Klein 18.02.2013 18:44
quelle