Группировка миллионов строк с подстановкой - PullRequest
13 голосов
/ 01 июня 2011

У меня есть большое количество (XXM-XXXM) строк, которые выглядят как (маленький образец):

Я не знаю ни всех возможных строк ошибок, ни их перестановок. Я хочу сгруппировать все похожие ошибки вместе и сгенерировать некоторую статистику, показывающую количество ошибок для каждой группы строк ошибок.

Итак, по сути, я хотел бы сгруппировать наиболее похожие строки, и строки могут принадлежать нескольким группам.

Спасибо!

Ответы [ 13 ]

0 голосов
/ 01 июня 2011

Если бы это зависело от меня, я бы использовал python и регулярные выражения.Отказ от ответственности: я никогда не использовал python в том масштабе, о котором вы говорите.

Вот первые два элемента из вашего примера вывода, переписанные в регулярных выражениях:

  • r "Загрузка страницы \ w + .php клиентом [. \ d] + не удалась из-за ошибки \ d +"
  • r "Подключение к [. \ d] + порту \ d + тайм-аут клиента [. \ d] + исходный порт \ d + "

Не так уж и плохо, верно?Вы можете использовать их в качестве «ключей» для ваших корзин верхнего уровня.

Тогда ваш код для сопоставления заданной строки (строк) с корзиной станет невероятно простым:

for bucket in buckets:
   if re.match(bucket.regex, s):
      bucket.matchingStrings.append(s)
      break
# else if no buckets match, generate a new bucket/regex for s

Созданиеэти регулярные выражения будут хитрой частью.Вы должны иметь правила для выбора частей строки, которые должны быть обобщены.В вашем случае общие части кажутся числами, IP-адресами и именами файлов.Вам нужно будет придумать правильные выражения для каждого сценария, но вот простая замена, которая заменяет числа в строке шаблоном регулярного выражения, представляющим число.

pattern = r"\d+"
re.sub(pattern, pattern, "Failed to count from 0 to 600")
# returns r"Failed to count from \d+ to \d+"

Могу поспорить, что вы получите довольно далекос заменой \ d + и ничего более.

0 голосов
/ 01 июня 2011

Хм, зачем изобретать велосипед - взгляните на бесплатную версию splunk , она предназначена для подобных задач.

0 голосов
/ 01 июня 2011

Очень сложно ответить без каких-либо предположений на входе.

Мой подход был бы:

  1. Взгляните на ваши входные данные, определите правила группировки и реализуйте эти правила (возможно, с помощью регулярных выражений).
  2. Затем создайте группу "misc" для тех, кто не соответствует ни одной.
  3. Соберите данные и посмотрите, есть ли шаблоны в этой группе, для которых вы можете написать регулярные выражения.
  4. Повторяйте до тех пор, пока у вас не появится достаточно маленькая группа "Разное".

Только вы можете сказать (без предположений) , хотите ли вы сгруппировать определенный набор «похожих» строк или нет. Должно быть конечное количество типов сообщений об ошибках, поэтому это должно дать достаточно хороший результат после нескольких итераций.

Другой подход может заключаться в предположении, что сходство основано на числах и IP-адресах в строках, состоит в их поиске и использовании этих чисел для классификации элементов. Это опять-таки предполагает более конкретное понимание ваших правил, но может избавить вас от повторного создания правил (если предположение действительно действительно).

Можно подумать об измерении расстояния Левенштейна между строками (или использовать аналогичный алгоритм), но для классификации, которая потребует слишком много шагов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...