In der letzten Zeit haben uns Kunden immer wieder gefragt, ob es, jenseits von der Suche nach Kriterien wie Kontonummern oder spezifischen Begriffen, eine Möglichkeit gibt, die Übermittlung von Code zu blockieren. Je nach Tätigkeitsfeld kann Code geistiges Eigentum eines Unternehmens sein und zu den Informationen gehören, die es vor Verlust und Diebstahl schützen will. Wir haben uns also an die Arbeit gemacht und uns diese neue Herausforderung näher angeschaut.
Vorausgeschickt werden muss, dass leistungsfähige Bibliotheken ziemlich in die Tiefe gehen müssen, damit die Sprachen voneinander abgegrenzt werden können. Das Ergebnis sind sehr komplexe, umfangreiche Datenbanken, die die Leistungsfähigkeit und Geschwindigkeit der Software, die sie benutzt, empfindlich beeinträchtigen können.
Außerdem wussten wir von einigen Anwendungsfällen, in denen N-Gramm-Kategorisierung erfolgreich natürliche Sprachen in Texten ermittelt hat. Das hat uns zur Annahme geführt, dass dieses Verfahren auch auf Programmiersprachen angewendet werden könnte.
Programmbibliothek versus N-Gramme
Text-Kategorisierung auf der Grundlage von N-Grammen ist nicht neu. In jüngster Zeit wird sie als praktikable Alternative zu umfangreichen Bibliotheken für das Aufspüren von natürlicher Sprache eingesetzt.
Libraries basieren auf großen Wörterbüchern und tun im Grund nichts anderes, als Muster zu erkennen. Sie brauchen Zeit und Leistung dafür, und je komplexer sie sind, desto größer ist die Datei: Manche überschreiten schon mal die 50-MB-Marke. Das Ergebnis sind zeitaufwendige Scans und unter Umständen das eher unbefriedigende Ergebnis, dass man, unabhängig von der Menge der Begriffe in den Bibliotheken, mit Testdatensätzen zu tun hat, die keinen einzigen der Begriffe dort enthalten.
Die N-Gramm-basierte Kategorisierung hingegen erbrachte Ergebnisse mit einer Genauigkeit von 99,8 Prozent über acht Sprachen hinweg in einer Studie. Als Trainingssets wurden kleine Samples mit 20 bis 120 KB verwendet und 3.478 unterschiedlich lange Textabschnitte als Testsets.
Was sind N-Gramme, und wie können sie verwendet werden?
N-Gramme sind Fragmente einer Zeichenkette. Die Teilstücke können aus den einzelnen Zeichen in einem Wort bestehen, aber für die Spracherkennung werden „N“ benachbarte Zeichen zusammengefasst mitsamt den Leerzeichen davor und danach.
Das Wort GRAMM beispielsweise kann in die folgenden N-Gramme zerlegt werden:
Bigramme (N = 2): _G, GR, RA, AM, MM, M_
Trigramme (N = 3): _GR, GRA, RAM, AMM, MM_, M__
Quadrigramme (N = 4): _GRA, GRAM, RAMM, AMM_, MM__, M___
Aufgrund der Möglichkeit, Zeichenketten zu zerlegen, hat sich N-Gramm-basierte Kategorisierung insbesondere bei der Fehlererkennung in Texten als erfolgreich herausgestellt oder auch bei Schwierigkeiten der Zeichenerkennung, wenn Dateien mittels OCR erstellt werden. Da diese Fehler meist nur Teile eines Wortes betreffen, kann es beispielsweise durch die Verwendung von Bigrammen immer noch identifiziert werden.
Bei der N-Gramm-basierten Kategorisierung berechnet und vergleicht das System Profile, die anhand der N-Gramm-Häufigkeit erstellt werden. Als Ausgangswert werden Trainingssets verwendet, mit denen für bestimmte Sprachen oder Themen Kategorie-Profile erstellt werden. Das System erzeugt dann Profile für das Dokument, das kategorisiert werden muss, und erfasst den Abstand zwischen dem Profil der Kategorie und dem des Textes. Dann wählt es die Profil-Kategorie mit der geringsten Abweichung von Profil des Textes aus. Diese Profile sind mit oftmals nur 10 KB erheblich kleiner als Bibliotheken.
Anwendungsfall Programmiersprachen
Um unsere Hypothese zu prüfen, haben wir eine schnelle, schlanke Implementierung der N-Gramm-basierten Textkategorisierung verwendet. Dann haben wir Kategorie-Profile für einige Programmiersprachen erstellt sowie Profile für die Testsets.
Bei unseren ersten Versuchen wurden 65 Prozent der Datensätze zutreffend kategorisiert, der Rest wurde meist Kategorien von Programmiersprachen zugewiesen, die Übereinstimmungen mit der korrekten Sprache haben. Das heißt, dass beispielsweise aus einem Stapel Java-Files einige wegen der ähnlichen Syntax versehentlich als C # identifiziert wurden.
Um diese Ergebnisse weiter zu verbessern, haben wir verschiedene Abwandlungen vorgenommen. Beispielsweise wurden die Kommentierungen in den Files entfernt, mit denen die Profile für die Programmiersprache erstellt werden sollten. Damit ließ sich verhindern, dass Copyright-Angaben die Genauigkeit des Profils verwässern. Damit Klartext nicht mit Programmiersprachen vermischt wird, wurden Profile für natürliche Sprachen ergänzt. Diese Modifikationen verbesserten die Ergebnisse enorm und steigerten die Genauigkeit in manchen Fällen auf 80 Prozent oder mehr.
Während unser Team mit den Kunden weiter an der Verbesserung der Ergebnisse arbeitet, zeigen die Tests und die Anwendung des Verfahrens, dass N-Gramm-basierte Textkategorisierung erfolgreich für das Aufspüren von Programmiersprachen genutzt werden kann. Das eröffnet, so hoffen wir, die Möglichkeit, N-Gramme auf neuartige, kreative Art in DLP- und eDiscovery-Lösungen einzusetzen.