Ересь Инквизитор! Реализация общей модели кластеризации текста (1)

машинное обучение глубокое обучение программист регулярное выражение Безопасность
Ересь Инквизитор! Реализация общей модели кластеризации текста (1)

Обеспечьте вдохновение для вашей системы обнаружения вторжений.


Если вы дадите вам кучу пользовательского ввода, есть много китайских топонимов, таких как «Пекин», «Чэнду», «Дунгуань», к сожалению, в них также смешаны некоторые римские топонимы, такие как «Сингапур», «Нью-Йорк», «Токио». Ваша задача состоит в том, чтобы разделить их, как бы вы это сделали?

Конечно, есть много способов сделать это легко.

Если это куча «хорошо», «хорошо», «неплохо», «удивительно», «хорошо», короткие отзывы, смешанные с «Fallout 4 — это воплощение всего плохого в современных играх, в нем есть в общей сложности 2 захватывающих квеста. , его геймплей хуже остальных, и в довершение всего в него добавили микротранзакции. Это худший из серии Fallout.

Вы можете подумать, что нет ничего проще, просто проверьте длину строки и даже количество знаков препинания.

Что, если куча «12345678», «5201314» и «пароль» смешаны с «паролем» и (выберите количество (*) из данных)> 0 и «a» = «a», «>»'>» ?

Может быть, вы нетерпеливы: эта грамотность по технике безопасности все еще существует! Обнаружение ключевых слов и специальных символов!

Вы больше не позволите мне «если»: нет ничего, с чем бы не справилось регулярное выражение, а если и есть, то пришло время выучить его заново.

Хорошо, но теперь нам нужно использовать одну и ту же модель для достижения всех вышеперечисленных сценариев — когда строки длинные и короткие, она будет разделять строки ненормальной длины. Когда есть обычные строки и строки, содержащие специальные символы, он может выбрать специальные. Когда строки смешаны на разных языках, их можно «санировать». Бывают даже самые разные непредвиденные ситуации.

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

Если вам случится заняться чем-то вроде изученияГлубокое обучение для кибербезопасностиПрименение , я полагаю, вы можете быстро подумать о практической ценности этого «гетеротического судьи», когда посмотрите на набор данных.

Подмигнем сочувственно. В следующем тексте мы будем реализовывать такую ​​игрушку.

Самосовершенствование епископа: взгляд на лицо

Независимо от того, насколько велико расстояние между Пекином и Чэнду, его можно легко измерить с помощью евклидова расстояния. А как насчет расстояния между «Пекином» и «Чэнду»?

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

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

  • Различия в длине строк (например,catиmiaomiaomiaomiaomiao)
  • Различия в наборах символов (например,123иabc)
  • различия в последовательности символов (например,上海自来水и水来自海上)

разница в длине

Что тут сказать... строка длины 5, очевидно, имеет на единицу больше 2, чем строка длины 3...

Пропустите это здесь.

def strLengthDiffer(str1, str2):
	return abs(len(str1) - len(str2))

Различия в наборах символов

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

Для достижения этой цели необходимо сначала определить расстояние между символами. Здесь мы определяем расстояние между теми же символами, что и 0, похожими символами (такими какaиb) определяется как 1, а расстояние между символами разных классов определяется как 10.

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

С помощью межсимвольного расстояния мы определяем расстояние между символом A(1) и набором символов B как минимальное расстояние от A(1) до каждого символа в B.

На основании вышеизложенного далее определяем расстояние между набором символов A и набором символов B: арифметическое и расстояние каждого символа до B.

Очевидно:

  • Расстояние между символами (a, b) = Расстояние между символами (b, a)
  • Расстояние от символа до набора символов (a, B) = Расстояние от набора символов до символа (B, a)
  • Расстояние между наборами символов (A, B) = Расстояние между наборами символов (B, A)

Таким образом, мы завершили когнитивное определение расстояния между наборами символов.

def charSetDiffer(s1, s2):
    # 由于笔者使用的代码版本在这里有更复杂的逻辑,就不提供代码细节了
    # 已经讲得这么明确了,写写看吧
    return s

различия в последовательности символов

Для разработчиков пользовательский вводalert("test")все ещеaeelrstt""(), очевидно, имеет совсем другое значение. Последняя строка с неизвестным значением не даст людям взглянуть еще раз, а если первую пользователь успешно выполнит, то, вероятно, в будущем он нанесет какой-то другой ущерб, что очень зло.

История говорит нам, что различия в последовательностях персонажей нельзя игнорировать.

Здесь мы используем языковую модель N-грамм для измерения разницы между двумя последовательностями по количеству граммов при N=2.

Если вы не понимаете, о чем я, то это такой расчет:

  1. Предположим, у нас есть строки S1 и S2.
  2. Взяв в качестве элемента каждые два последовательных символа строки S1, формируется множество G1, а также G2 таким же образом.
  3. Разница последовательностей между строками S1 и S2 — это количество различных элементов в G1 и G2. Очевидно, вы можете получить это значение, вычитая их объединение из их пересечения.
def n_grams(a):
    z = (islice(a, i, None) for i in range(2))
    return list(zip(*z))
def groupDiffer(s1, s2):
    len1 = len(list(set(s1).intersection(set(s2))))
    len2 = len(list(set(s1).union(set(s2))))
    return abs((len2 - len1))

Наконец-то получил расстояние между строками

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

Здесь метод, который я использую, -

def samplesDistance(str1, str2):
    a = strLengthDiffer(str1, str2)
    b = charSetDiffer(str1, str2)
    s1 = n_grams(str1)
    s2 = n_grams(str2)
    c = groupDiffer(s1, s2)
    d = a+b+c
    return d

Да! Просто добавьте...

Гора не высокая, а храмы для отправки вымпелов есть.Алгоритм не сложный, лишь бы был полезен.

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

Ты не похож на них

С расстоянием между струнами, далее, есть расстояние от одной струны до другого пучка струн. Мы определяем следующим образом:

Расстояние между образцом строки и набором строк = среднее арифметическое расстояния от образца строки до каждого образца строки в наборе строк.

который:

def sampleClassDistance(sample, class1):
    list_0 = []
    length = len(class1)
    for item in class1:
        list_0.append(samplesDistance(sample, item))
    return sum(list_0)/length

вы двое

Начав с расстояния от строки до группы строк в предыдущем разделе, мы можем получить расстояние от группы строк до другой группы строк. Он определяется в аналогичной форме:

Расстояние между наборами строк = среднее арифметическое расстояний от каждой выборки в наборе строк до набора строк = среднее арифметическое расстояний от каждой выборки в наборе строк до каждой выборки в другой строке

который:

def classesDistance(class1, class2):
    list_0 = []
    class1 = flatten(class1)
    class2 = flatten(class2)
    m = len(class1)
    n = len(class2)
    for item1 in class1:
        for item2 in class2:
            list_0.append(sampleDistance(item1, item2))
    return sum(list_0)/(m*n)

Нет фракции внутри класса, всякие странные

Точно так же «внутриклассовое расстояние» также может быть определено как свойство внутри набора строк. Это может быть несколько близко к дисперсии в практическом смысле. Мы оговариваем:

Внутриклассовое расстояние = расстояние от набора строк до самого себя

def innerClassesDistanse(class1):
    return classesDistance(class1, class1)

Давайте остановимся и организуем наши мысли

В этот момент у вас может закружиться голова.Какова цель определения такого большого количества расстояний?

Мы сказали, что ключом к разделению двух типов неопределенно различных форм строк является определение различия, то есть количественная оценка того, насколько на самом деле различаются «очевидно разные».

Поэтому мы изобрели некое «расстояние» в качестве поддающегося количественной оценке атрибута.Если между двумя строками существуют разные длины, разные символы и разные последовательности символов, то две строки имеют поддающееся количественной оценке расстояние.

Если есть расстояние между двумя строками, то есть расстояние между одной строкой и строкой другого типа, между строкой одного типа и строкой другого типа, а также есть расстояние внутри строки того же типа.

Когда ты в толпе, самое главное — понять, кто тебе друг, а кто враг. А когда нужно разделить людей на две группы, самое главное знатьНасколько они разные,а такжеНасколько последователен каждый тип человека внутри.

В случае классификационных строк необходимо иметь возможность количественной оценкимежклассовое расстояниеиВнутриклассовое расстояние.

эй нет, у нас уже естьclassesDistance()иinnerClassesDistanse().

Вот и все, увидимся в следующий раз :)


Примечание редактора:

Эта статья еще не закончена, ждите продолжения. Ссылки и примеры кода будут приведены в полной статье.

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

Искусство /YvesX

Вы все равно не можете догадаться, что я делаю

Монтаж/Флуоресценция

Автор разрешил опубликовать эту статью, и авторские права принадлежат Chuangyu Frontend. Пожалуйста, укажите источник для перепечатки этой статьи. Ссылка на эту статью:известный Sec-Fed.com/2018-09-25-…

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

Спасибо за чтение.