Làm cách nào để trích xuất các tính năng và phân loại email cảnh báo đến từ các công cụ giám sát thành danh mục phù hợp?


7

Công ty của tôi cung cấp dịch vụ được quản lý cho rất nhiều khách hàng của mình. Khách hàng của chúng tôi thường sử dụng các công cụ giám sát sau để giám sát máy chủ / ứng dụng web của họ:

  1. OpsView
  2. Nagios
  3. Bình thường
  4. Kịch bản shell tùy chỉnh

Bất cứ khi nào có bất kỳ vấn đề nào được tìm thấy, một thư cảnh báo sẽ đến nhóm Ops của chúng tôi để họ hành động khi khắc phục vấn đề.

Khi chúng tôi quản lý hàng ngàn máy chủ, hộp thư đến của các nhóm Ops của chúng tôi luôn tràn ngập các thông báo qua email. Ngay cả một vấn đề duy nhất có hiệu ứng xếp tầng, có thể kích hoạt 20-30 email.

Bây giờ, điều tôi muốn làm là triển khai một hệ thống có thể trích xuất các tính năng quan trọng ra khỏi email cảnh báo - như địa chỉ IP của máy chủ, loại sự cố, mức độ nghiêm trọng của sự cố, v.v. và cũng phân loại các email thành danh mục phù hợp, như CPU-Load-Customer1-Server2, MySQL-Replication-Customer2-DBServer3v.v. Sau đó, chúng tôi sẽ có một bộ các bước gỡ lỗi được xác định trước cho từng danh mục, để giúp nhóm Ops khắc phục sự cố nhanh hơn. Ngoài ra, trình trích xuất tính năng sẽ cung cấp dữ liệu đầu vào cho nhóm cho một vấn đề.

Cho đến nay tôi đã có thể đào tạo NaiveBayesClassifier với các kỹ thuật học tập có giám sát, tức là dữ liệu đào tạo được gắn nhãn (dữ liệu cụm) và có thể phân loại các email chưa xem mới vào cụm / danh mục phù hợp. Vì các email dựa trên các mẫu nhất định, độ chính xác của trình phân loại là rất cao. Nhưng chúng tôi cũng nhận được email cảnh báo từ các tập lệnh tùy chỉnh, có thể không tuân theo các mẫu. Vì vậy, thay vì học có giám sát, tôi muốn thử học không giám sát cho cùng. Tôi đang nhìn vào cụm KMeans . Nhưng một lần nữa vấn đề là, chúng ta sẽ không biết trước số lượng cụm. Vì vậy, thuật toán nào sẽ là tốt nhất cho trường hợp sử dụng này? Ngay bây giờ tôi đang sử dụng thư viện TextBlob của Python để phân loại.

Ngoài ra, để trích xuất tính năng từ một email cảnh báo, tôi đang xem xét thư viện NLTK ( http://www.nltk.org/book/ch07.html ). Tôi đã thử nó, nhưng nó dường như hoạt động tốt trên các đoạn văn bản / văn bản tiếng Anh thích hợp, tuy nhiên, đối với các email cảnh báo, nó đã trích xuất rất nhiều tính năng không cần thiết. Đã có bất kỳ giải pháp hiện có cho cùng? Nếu không, cách tốt nhất để thực hiện là gì? Thư viện nào, thuật toán nào?

PS: Tôi không phải là nhà khoa học dữ liệu.

Email mẫu:

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

Mã phân loại: (định dạng của csv - email, <đĩa / 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)

Mã trích xuất tính năng được lấy từ: https://gist.github.com/shlomibabluki/5539428

Xin vui lòng cho tôi biết nếu có thêm thông tin được yêu cầu ở đây.

Cảm ơn trước.


Bạn có thể bắt đầu với việc chuyển đổi từng email thành tf-idf vector scikit-learn.org/urdy/modules/feature_extraction.html . Tìm đúng số K là một vấn đề khó khăn, điều này có thể giúp stackoverflow.com/questions/1793532/
Saurabh Saxena

Trường hợp sử dụng rất đẹp. Nhưng tôi nghĩ rằng bạn đang trộn "khai thác tính năng", "độ chính xác phân loại" và "học có giám sát". Tôi có nghĩa là không thể phân tích email một cách dễ dàng không có nghĩa là bạn không thể học có giám sát. Đó là tất cả về việc biết trước các lớp học và có dữ liệu tàu được phân loại, và cả hai có thể được thu thập trong trường hợp của bạn.
Amir Ali Akbari

@SaurabhSaxena Chạy TF-IDF trong thời gian thực và khi chúng tôi nhận được email cảnh báo mới là không thể, vì TF-IDF cần phải chạy trên toàn bộ tài liệu chứ không chỉ một email mới. Cảm ơn các liên kết và thông tin.
Kartikeya Sinha

@AmirAliAkbari Tôi không hiểu. Trường hợp sử dụng mà tôi có, phải có sự kết hợp giữa "trích xuất tính năng" của thông tin quan trọng từ thư, "phân cụm có giám sát" các email thành các nhóm để định tuyến email và "phân loại" các email mới thành cụm chính xác. Độ chính xác rất quan trọng ở đây vì tải CPU trên email cảnh báo máy chủ ứng dụng nên được phân loại là thư cảnh báo không gian đĩa máy chủ MySQL DB. :)
Kartikeya Sinha

Câu trả lời:


3

Tôi muốn thử học tập không giám sát cho cùng. Tôi đang nhìn vào cụm KMeans. Nhưng một lần nữa vấn đề là, chúng ta sẽ không biết trước số lượng cụm. Vì vậy, thuật toán nào sẽ là tốt nhất cho trường hợp sử dụng này?

Khi bạn không biết trước số cụm, bạn vẫn có thể thực hiện việc học không giám sát bằng cách sử dụng quy trình Dirichlet để lấy mẫu các tham số liên quan đến cụm / nhóm và sau đó phân cụm các thẻ của bạn theo các tham số đó. Ý tưởng chung là sử dụng phân phối Dirichlet để tạo xác suất cho các từ cho mỗi cụm và quy trình Dirichlet sử dụng các xác suất này để gán một cụm cho mỗi từ trong từ vựng của bạn. Nếu bạn muốn chia sẻ các cụm giữa các email, thì bạn sử dụng Quy trình Dirichlet phân cấp. Ở đây bạn có thể tìm thấy một bài viết blog tốt đẹp về cách thức này hoạt động.

Thư viện phổ biến nhất để phân cụm là gensim , nhưng lưu ý cảnh báo của họ liên quan đến việc thực hiện Quy trình Dirichlet phân cấp:

gensim sử dụng triển khai trực tuyến nhanh, dựa trên [3]. Mô hình HDP là một bổ sung mới cho gensim, và vẫn còn sơ sài xung quanh các khía cạnh học thuật của nó - sử dụng cẩn thận.

Đối với trích xuất tính năng, câu hỏi của bạn không nói chính xác loại tính năng không cần thiết bạn đang nhận, nhưng nếu đó là trường hợp, bạn cần lọc mã thông báo trước hoặc sau khi xử lý chúng bằng NLTK. Nói chung, bạn không thể mong đợi kết quả tuyệt vời cho các ứng dụng rất cụ thể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.