Создайте модель для идентификации строки

#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.

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