#string #machine-learning
Вопрос:
У меня есть такая строка
ODQ1OTc3MzY0MDcyNDk3MTUy.YKoz0Q.wlST3vVZ3IN8nTtVX1tz8Vvq5O8
Первая часть строки представляет собой случайное 18-значное число в формате base64, а вторая-временная метка unix в base64, в то время как последняя-hmac.
Я хочу создать модель для распознавания такой строки.
Как я могу это сделать?
Комментарии:
1. давайте пока забудем о машинном обучении. Подумайте, как вы будете идентифицировать строки в этом шаблоне?
2. Вот где я вроде как заблудился, я не знаю, как это закодировать
Ответ №1:
Хотя я не обязательно глубоко задумывался об этом, это было бы то, что приходит мне в голову в первую очередь.
Для этого вам, конечно, не нужно машинное обучение. На самом деле машинное обучение было бы не только неэффективным для подобных проблем, но может быть даже хуже, в зависимости от конкретного подхода.
Здесь точное решение может быть достигнуто, просто поняв проблему.
Один из способов, которым люди часто сопоставляют строки с определенной структурой, — это так называемые регулярные выражения или RegExp
.
Регулярные выражения позволяют сопоставлять шаблоны строк различной сложности.
Чтобы привести простой пример на Python:
import re
your_string = "ODQ1OTc3MzY0MDcyNDk3MTUy.YKoz0Q.wlST3vVZ3IN8nTtVX1tz8Vvq5O8"
regexp_pattern = r"(. ).(. ).(. )"
re.findall(regexp_pattern, your_string)
>>> [('ODQ1OTc3MzY0MDcyNDk3MTUy', 'YKoz0Q', 'wlST3vVZ3IN8nTtVX1tz8Vvq5O8')]
Теперь одна из проблем заключается в том, как вы узнаете, где начинается и заканчивается ваша строка. В большинстве случаев существуют определенные привязки, особенно в строках, которые были созданы программно. Например, если бы мы знали , что перед каждой строкой, которую вы хотите сопоставить, есть слово Token:
, вы могли бы включить его в шаблон регулярного r"Token: (. ).(. ).(. )"
выражения .
Другими способами избежать несоответствий было бы более четкое определение требований к шаблону. Прямо сейчас мы просто сопоставляем шаблон с любым количеством символов и двумя .
, разделяющими их на три последовательности. Если бы вы знали, какую реализацию base64 вы использовали, вы могли бы ограничить алфавит потенциальных символов .
(таким образом, любых) алфавитом, используемым в вашей реализации base64 [abcdefgh1234]
. В этом примере это было бы так abcdefgh1234
, поэтому шаблон можно было бы уточнить следующим образом r»([abcdefgh1234] ).([abcdefgh1234] ).(. )»`. То же самое относится и к коду HMAC.
Кроме того, вы можете указать допустимую длину каждой подстроки. Например, вы сказали, что у вас есть 18 случайных цифр. Это, вероятно, будет означать, что каждый кодируется как 1 байт, что приведет к 18*8 = 144 битам, что в base64 приведет к 24 токенам (где каждый кодирует секстет, таким образом, 6 бит информации). То же самое можно было бы сделать с меткой времени, предполагая 32-разрядную метку времени, для этого, вероятно, потребуется 6 токенов base64 (представляющих 36 бит, 36, потому что вы не могли разделить 32 на секстеты).
С помощью этой информации вы можете дополнительно уточнить шаблон
r"([abcdefgh1234]{24}).([abcdefgh1234]{6}).(. )"`
Кроме того, то же самое может быть применено к коду HMAC.
Я предоставляю вам немного почитать о регулярных выражениях, но я бы предположил, что это самое простое решение и, безусловно, более подходящее, чем любой вид машинного обучения.