Wie extrahiere ich Funktionen und klassifiziere Warn-E-Mails, die von Überwachungstools stammen, in die richtige Kategorie?

7

Mein Unternehmen bietet vielen seiner Kunden Managed Services an. Unsere Kunden verwenden normalerweise die folgenden Überwachungstools, um ihre Server / Webanwendungen zu überwachen:

  1. OpsView
  2. Nagios
  3. Pingdom
  4. Benutzerdefinierte Shell-Skripte

Immer wenn ein Problem gefunden wird, geht eine Benachrichtigungsmail an unser Ops-Team, damit es das Problem beheben kann.

Da wir Tausende von Servern verwalten, wird der Posteingang unserer Ops-Teams ständig mit E-Mail-Benachrichtigungen überflutet. Selbst ein einzelnes Problem, das einen Kaskadeneffekt hat, kann 20 bis 30 E-Mails auslösen.

Jetzt möchte ich ein System implementieren, das in der Lage ist, wichtige Funktionen aus einer Warn-E-Mail zu extrahieren - wie Server-IP-Adresse, Art des Problems, Schweregrad des Problems usw. - und die E-Mails auch in die richtige Kategorie zu klassifizieren, wie z CPU-Load-Customer1-Server2, MySQL-Replication-Customer2-DBServer3usw. Wir haben dann eine vordefinierte Reihe von Debugging-Schritten für jede Kategorie, um dem Ops-Team zu helfen, das Problem schneller zu beheben. Außerdem stellt der Feature-Extraktor dem Team Eingabedaten für ein Problem zur Verfügung.

Bisher war ich in der Lage, NaiveBayesClassifier mit überwachten Lerntechniken, dh gekennzeichneten Trainingsdaten ( Clusterdaten ), zu trainieren und neue unsichtbare E-Mails in den richtigen Cluster / die richtige Kategorie zu klassifizieren. Da die E-Mails auf bestimmten Vorlagen basieren, ist die Genauigkeit des Klassifikators sehr hoch. Wir erhalten aber auch Benachrichtigungs-E-Mails von benutzerdefinierten Skripten, die möglicherweise nicht den Vorlagen entsprechen. Anstatt also überwachtes Lernen zu betreiben, möchte ich unbeaufsichtigtes Lernen ausprobieren. Ich beschäftige mich mit KMeans Clustering . Das Problem ist jedoch, dass wir die Anzahl der Cluster nicht im Voraus kennen. Welcher Algorithmus ist für diesen Anwendungsfall am besten geeignet? Im Moment verwende ich Pythons TextBlob-Bibliothek zur Klassifizierung.

Zum Extrahieren von Funktionen aus einer Warn-E-Mail schaue ich in die NLTK- Bibliothek ( http://www.nltk.org/book/ch07.html ). Ich habe es ausprobiert, aber es scheint gut mit richtigen englischen Absätzen / Texten zu funktionieren. Für Benachrichtigungs-E-Mails wurden jedoch viele unnötige Funktionen extrahiert. Gibt es dafür bereits eine Lösung? Wenn nicht, wie lässt sich das am besten umsetzen? Welche Bibliothek, welcher Algorithmus?

PS: Ich bin kein Data Scientist.

Beispiel-E-Mails:

PROBLEM: CRITICAL - Customer1_PROD - Customer1_PROD_SLAVE_DB_01 -  CPU Load Avg     Service: CPU Load Avg  Host: Customer1_PROD_SLAVE_DB_01  Alias: Customer1_PROD_SLAVE_DB_01  Address: 10.10.0.100  Host Group Hierarchy: Opsview > Customer1  - BIG C > Customer1_PROD  State: CRITICAL  Date & Time: Sat Oct 4 07:02:06 UTC 2014    Additional Information:     CRITICAL - load average: 41.46, 40.69, 37.91
RECOVERY: OK - Customer1_PROD - Customer1_PROD_SLAVE_DB_01 -  CPU Load Avg     Service: CPU Load Avg  Host: Customer1_PROD_SLAVE_DB_01  Alias: Customer1_PROD_SLAVE_DB_01  Address: 10.1.1.100  Host Group Hierarchy: Opsview > Customer1  - BIG C > Customer1_PROD  State: OK  Date & Time: Sat Oct 4 07:52:05 UTC 2014    Additional Information:     OK - load average: 0.36, 0.23, 4.83
PROBLEM: CRITICAL - Customer1_PROD - Customer1_PROD_SLAVE_DB_01 -  CPU Load Avg     Service: CPU Load Avg  Host: Customer1_PROD_SLAVE_DB_01  Alias: Customer1_PROD_SLAVE_DB_01  Address: 10.100.10.10  Host Group Hierarchy: Opsview > Customer1  - BIG C > Customer1_PROD  State: CRITICAL  Date & Time: Sat Oct 4 09:29:05 UTC 2014    Additional Information:     CRITICAL - load average: 29.59, 26.50, 18.49

Klassifikatorcode: (Format von csv - email, <disk / cpu / memory / mysql>)

from textblob import TextBlob
from textblob.classifiers import NaiveBayesClassifier
import csv
train = []
with open('cpu.txt', 'r') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in reader:
        tup = unicode(row[0], "ISO-8859-1"), row[1]
        train.append(tup)
// this can be done in a loop, but for the time being let it be
with open('memory.txt', 'r') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in reader:
        tup = unicode(row[0], "ISO-8859-1"), row[1]
        train.append(tup)

with open('disk.txt', 'r') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in reader:
        tup = unicode(row[0], "ISO-8859-1"), row[1]
        train.append(tup)

with open('mysql.txt', 'r') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in reader:
        tup = unicode(row[0], "ISO-8859-1"), row[1]
        train.append(tup)

cl = NaiveBayesClassifier(train)
cl.classify(email)

Feature-Extraktor-Code entnommen aus: https://gist.github.com/shlomibabluki/5539628

Bitte lassen Sie mich wissen, wenn hier weitere Informationen erforderlich sind.

Danke im Voraus.

Kartikeya Sinha
quelle
Sie können mit der Konvertierung jeder E-Mail in den tf-idf-Vektor scikit-learn.org/stable/modules/feature_extraction.html beginnen . Das Finden der richtigen Anzahl von K ist ein schwieriges Problem. Dies könnte helfen, stackoverflow.com/questions/1793532/…
Saurabh Saxena
Sehr schöner Anwendungsfall. Aber ich denke, Sie mischen "Merkmalsextraktion", "Klassifizierungsgenauigkeit" und "überwachtes Lernen". Ich meine, wenn Sie eine E-Mail nicht einfach analysieren können, bedeutet dies nicht, dass Sie kein überwachtes Lernen durchführen können. Es geht darum, die Klassen im Voraus zu kennen und Zugdaten klassifiziert zu haben, und beide können in Ihrem Fall gesammelt werden.
Amir Ali Akbari
@SaurabhSaxena Das Ausführen von TF-IDF in Echtzeit, sobald wir eine neue Benachrichtigungs-E-Mail erhalten, ist nicht möglich, da TF-IDF auf dem gesamten Dokumentenkorpus und nicht nur auf der einzelnen neuen E-Mail ausgeführt werden muss. Danke für die Links und Infos.
Kartikeya Sinha
@AmirAliAkbari Ich verstehe nicht. Der Anwendungsfall, den ich habe, muss die Mischung aus "Feature-Extraktion" wichtiger Informationen aus der E-Mail, "überwachtem Clustering" von E-Mails in Gruppen für das E-Mail-Routing und "Klassifizierung" neuer E-Mails in richtigen Cluster mit Genauigkeit enthalten. Die Genauigkeit ist hier wichtig, da eine Benachrichtigungs-E-Mail mit CPU-Auslastung auf dem App-Server als Benachrichtigungsmail für den Speicherplatz auf dem MySQL DB-Server klassifiziert werden sollte. :)
Kartikeya Sinha

Antworten:

3

Ich möchte das unbeaufsichtigte Lernen dafür ausprobieren. Ich beschäftige mich mit KMeans Clustering. Das Problem ist jedoch, dass wir die Anzahl der Cluster nicht im Voraus kennen. Welcher Algorithmus ist für diesen Anwendungsfall am besten geeignet?

Wenn Sie die Anzahl der Cluster im Voraus nicht kennen, können Sie mithilfe eines Dirichlet-Prozesses unbeaufsichtigt lernen, um Parameter zu testen, die Clustern / Gruppen zugeordnet sind, und dann Ihre Token gemäß diesen Parametern zu gruppieren. Die allgemeine Idee besteht darin, eine Dirichlet-Verteilung zu verwenden, um Wahrscheinlichkeiten über Wörter für jeden Cluster zu generieren, und ein Dirichlet-Prozess verwendet diese Wahrscheinlichkeiten, um jedem Wort in Ihrem Vokabular einen Cluster zuzuweisen. Wenn Sie Cluster zwischen E-Mails freigeben möchten, verwenden Sie hierarchische Dirichlet-Prozesse. Hier finden Sie einen schönen Blog-Beitrag darüber, wie das funktioniert.

Die beliebteste Bibliothek für Clustering ist Gensim. Beachten Sie jedoch die Warnung bezüglich der Implementierung des hierarchischen Dirichlet-Prozesses:

gensim verwendet eine schnelle Online-Implementierung basierend auf [3]. Das HDP-Modell ist eine neue Ergänzung zu Gensim und immer noch rau an seinen akademischen Rändern - vorsichtig verwenden.

In Bezug auf die Feature-Extraktion gibt Ihre Frage nicht genau an, welche Art von unnötigen Features Sie erhalten. In diesem Fall müssen Sie Ihre Token jedoch vor oder nach der Verarbeitung mit NLTK filtern. Im Allgemeinen können Sie für sehr spezifische Anwendungen keine hervorragenden Ergebnisse erwarten.

Robert Smith
quelle