Mein Unternehmen bietet vielen seiner Kunden Managed Services an. Unsere Kunden verwenden normalerweise die folgenden Überwachungstools, um ihre Server / Webanwendungen zu überwachen:
- OpsView
- Nagios
- Pingdom
- 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-DBServer3
usw. 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.
quelle
Antworten:
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:
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.
quelle