Оценка строки на основе того, насколько она похожа на английскую - PullRequest
12 голосов
/ 29 июля 2011

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

string1 = "THEQUICKBROWNFOX" string2 = "KLJHQKJBKJBHJBJLSDFD"

Я хочу функцию, которая будет оценивать string1выше, чем string2 и миллион других бессмысленных строк.Обратите внимание на отсутствие пробелов, так что это символьная функция, а не пословная.

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

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

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

Ответы [ 5 ]

9 голосов
/ 30 июля 2011

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

2 голосов
/ 30 июля 2011

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

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

0 голосов
/ 28 мая 2016

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

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

0 голосов
/ 30 июля 2011

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

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

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

0 голосов
/ 30 июля 2011

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

...