Подтвердить что ты не робот

Вычисление строки, основанной на том, как это похоже на английский

Я не уверен, как точно сформулировать этот вопрос, так вот пример:

string1 = "THEQUICKBROWNFOX" string2 = "KLJHQKJBKJBHJBJLSDFD"

Мне нужна функция, которая будет забивать string1 выше строки2 и миллион других строк тарабарщины. Обратите внимание на отсутствие пробелов, поэтому это пошаговая функция, а не слово за словом.

В 90-х годах я написал функцию триграммного подсчета в Delphi и заполнил ее триграммами от Huck Finn, и я подумываю о переносе кода на C или Python или удалении его в автономный инструмент, но должен быть более эффективными способами. Я буду делать это миллионы раз, поэтому скорость хорошая. Я попробовал библиотеку pveron Reverend.Thomas Beyse() и обучил ее некоторым целым строкам-шапкам, но, похоже, они требуют пробелов между словами и, таким образом, возвращают оценку []. Я нашел некоторые библиотеки Markov Chain, но они также, казалось, требовали пробелов между словами. Хотя из моего понимания их я не понимаю, почему так должно быть...

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

Спасибо за помощь!

4b9b3361

Ответ 1

Я бы начал с простой вероятностной модели того, насколько вероятна каждая буква, с учетом предыдущей (возможно, нулевой, в начале слова) буквы. Вы можете создать это на основе словарного файла. Затем вы можете расширить это, чтобы использовать 2 или 3 предыдущих буквы в качестве контекста для определения вероятностей, если исходная модель недостаточно хороша. Затем умножьте все вероятности на получение оценки для слова и, возможно, возьмите N-й корень (где N - длина строки), если вы хотите нормализовать результаты, чтобы вы могли сравнивать слова разной длины.

Ответ 2

Я не понимаю, почему цепь Маркова не могла быть изменена для работы. Я бы создал словарь текстовых файлов сорта и прочитал это, чтобы изначально заполнить структуру данных. Вы просто используете цепочку из n букв, чтобы предсказать следующую букву, а не n слов, чтобы предсказать следующее слово. Затем, вместо случайного генерирования буквы, вы, вероятно, захотите вытащить вероятность следующей буквы. Например, если у вас была текущая цепочка "TH", а следующая буква была "E", вы бы пошли на свою карту и увидели вероятность того, что "E" будет следовать "TH". Лично я бы просто скомпоновал все эти вероятности во время цикла через строку, но как точно создать счет с вероятностью зависит от вас. Вы можете нормализовать его для длины строки, чтобы вы могли сравнивать короткие и длинные строки.

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

Ответ 3

Я не знаю, как это работает, но Mail::SpamAssassin::Plugin::TextCat анализирует электронную почту и догадывается, на каком языке (поддерживая десятки языков).

Ответ 4

Индекс совпадения может помочь здесь, см. https://en.wikipedia.org/wiki/Index_of_coincidence.

Для начала просто вычислите разницу IC с ожидаемым значением 1,73 (см. Википедию выше). Для расширенного использования вы можете сами вычислить ожидаемое значение с помощью некоторого примера языка corpus.

Ответ 5

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

Шаг предварительной обработки называется преобразованием графем-фонеме и обычно приводит к вероятности отображения строк в звуки.

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