Журнал сообщений классификации / группировки и нахождения читабельного человека шаблон для каждой группы - PullRequest
3 голосов
/ 30 января 2020

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

  • Хорошо ли машинное обучение для такой проблемы или это излишнее?
  • Может ли эта проблема быть связана с другой классической проблемой, которая уже опубликовала статьи, чтобы я мог выбрать правильное решение?

Проблема:

I ' Мы занимаемся исследованием довольно интересной проблемы, которая, как мне кажется, во многих системах Google Analytics решается с помощью автоматизированного процесса.

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

Пример:

+---------------------------------------------------------------+
|Label: "Forbidden: User session {{placeholder1}} has expired." |
+---------------------------------------------------------------+
|Message: "Forbidden: User session aad3-1v299-4400 has expired."|
|Message: "Forbidden: User session jj41-1d333-bbaa has expired."|
|Message: "Forbidden: User session aab3-bn12n-1111 has expired."|
+---------------------------------------------------------------+

Пока у нас есть полуавтоматический процесс, который решает проблему но время от времени мы получаем новые пользовательские JavaScript сообщения об ошибках, которые проскальзывают через наши фильтры.

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

  1. Для пакета строк ошибок запустите алгоритм (например, Левенштейна), который находит похожие строки. Сгруппируйте похожие ошибки.
  2. Внутри группы похожих строк запустите diff и найдите динамические c части. Проверьте разницу:

Placeholder found in similar strings

Для справки здесь у нас есть сообщения об ошибках, которые были собраны в течение одной минуты:

Message: 3312445,Error: Unknown page "retina_list"
Message: 9931234,Error: Unknown page "widget_summary"
Message: ReferenceError: 'alg,TypeError: g' is undefined
Message: 522574,Error: Unknown page "page_options"
Message: ReferenceError: '297756| Zly / Error in handler for event:,[object Object],ApiListenerError: TypeError: a' is undefined
Message: [Euv warn]: style="width: {{item.evaluation}}em": interpolation in 'style' attribute will cause the attribute to be discarded in Internet Explorer. Use krt-bind:style instead. (found in component: <default-componentfalse2320383>)
Message: [Euv warn]: src="//www.example.com/image/{{item._id}}-1.jpg?w=220&h=165&mode=crop": interpolation in 'src' attribute will cause a 404 request. Use krt-bind:src instead. (found in component: <default-componentfalse8372912>)
Message: [Euv warn]: src="//www.example.com/image/{{item._id}}?car=recommend_sp312": interpolation in 'src' attribute will cause a 404 request. Use krt-bind:src instead. (found in component: <default-componentfalse3330736>)
Message: [Euv warn]: src="//www.example.com/image/{{item._id}}-1.jpg?w=220&h=165&mode=crop": interpolation in 'src' attribute will cause a 404 request. Use krt-bind:src instead. (found in component: <default-componentfalse4893336>)
Message: ReferenceError: 'alg,TypeError: g' is undefined
Message: 73276| Zly / Error in handler for event:,[object Object],ApiListenerError: TypeError: Cannot read property 'campaignName' of undefined
Message: ReferenceError: 'alg,TypeError: g' is undefined
Message: ReferenceError: 'bend,TypeError: f' is undefined

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

Я также думаю, что более серьезные проблема заключается в том, чтобы сгенерировать метку группы, а не сгруппировать строки, поскольку иногда пара похожих строк имеет очень разную длину, а заполнители представляют собой длинные предложения со специальными символами, такими как \, ". ^% # & * !? <> |] [{} .

1 Ответ

3 голосов
/ 02 февраля 2020

Как вы указали, похоже, что мы можем разделить эту проблему на два отдельных шага.

  1. Сгруппировать похожие сообщения и
  2. Пометить каждую группу.

    Шаг 1:

Хотя я не слишком знаком с Tensorflow JS, я не думаю, что использовать машинное обучение (ML) - это излишне. для решения этой проблемы, особенно для шага 1.

На самом деле, этот тип проблемы является отличным кандидатом на конкретную c форму ML, известную как неконтролируемое обучение, и, в частности, Кластеризация . В Необучаемом обучении мы ищем «ранее неизвестные шаблоны в наших данных без ранее существовавших меток».

См .: https://en.wikipedia.org/wiki/Unsupervised_learning

В этом контексте это означает, что мы не знаем, будут ли «Сообщение об ошибке 1» и «Сообщение об ошибке 2» принадлежать к одной и той же группе, прежде чем мы применим наш алгоритм кластеризации. Используя ваш пример, мы можем обоснованно подозревать, что сообщения:

“Forbidden: User session aad3-1v299-4400 has expired"
“Forbidden: User session jj41-1d333-bbaa has expired"

будут принадлежать к той же группе, но алгоритм кластеризации не знает об этом при запуске.

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

* 1037. *

Тогда уже существующие метки в данных означают, что такие сообщения, как

“Forbidden: User session aad3-1v299-4400 has expired"
“Forbidden: User session jj41-1d333-bbaa has expired"

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

Из вашего описания звучит так, что для шага 1 вы хотите выполнить сопоставление строк (например, Левенштейна), чтобы сравнить все примеры сообщений, а затем применить алгоритм кластеризации к этим результатам. Затем, после того как у вас есть группы (кластеры) сообщений, шаг 2 включает в себя поиск соответствующей метки для каждой группы.

Шаг 2:

Согласился, что поиск соответствующей метки для каждая группа, вероятно, сложнее здесь. Один из подходов, который может быть полезен, - это подсчитать, сколько раз слово или фраза встречается в группе или кластере, и, если они не удовлетворяют некоторому заранее заданному порогу, использовать заполнитель, как у вас в метке примера. Например, слова «Запрещено», «Пользователь», «Сессия» и «Истек срок действия» будут общими для группы, тогда как перечисленные буквенные цифры c ID уникальны для отдельных сообщений. Если порогом является то, что слово или фраза должны отображаться как минимум в двух сообщениях, только идентификаторы будут заменены местозаполнителем.

При таком подходе вы, по сути, ищете слова или фразы, которые являются необычными для группы, и не предоставляют полезную информацию для формирования соответствующей метки. В некотором смысле, это противоположно концепции, используемой во многих поисковых системах, которая стремится выяснить, насколько часто или важно слово или фраза для документа (см. https://en.wikipedia.org/wiki/Tf%E2%80%93idf).

...