Алгоритмы идентификации марковского контента?

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

Было бы замечательно, если ресурсы, на которые вы указываете, являются дружественными Python.

Ответ 1

Вы можете использовать подход "грубой силы", посредством которого вы сравниваете сгенерированный язык с данными, собранными на n-граммах более высокого порядка, чем модель Маркова, которая сгенерировала его.

то есть. Если бы язык был сгенерирован марковской моделью второго порядка, то до 3 грамм будут иметь правильные частоты, но 4 грамма, вероятно, не будут.

Вы можете получить до 5-граммовых частот от общедоступного Google n-gram dataset. Огромное - сжатие 24G - вам нужно получить его по почте на DVD с LDC.

EDIT: добавлены некоторые детали реализации

n-граммы уже учтены, поэтому вам просто нужно хранить счетчики (или частоты) таким образом, чтобы их можно было быстро найти. Должна работать правильно проиндексированная база данных или, возможно, индекс Lucene.

Учитывая фрагмент текста, сканируйте его и посмотрите на частоту каждого 5-граммов в своей базе данных и посмотрите, где он по сравнению с другими 5-граммами, начинающимися с тех же 4 слов.

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

Ответ 2

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

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

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

В качестве примера, здесь афоризм из kantmachine:

Сегодня он будет убежден, что воля человека свободна; завтра, учитывая неразрывную цепочку природы, он будет смотреть на свободу как на просто иллюзию и объявить природу все-в-все.

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

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

Ответ 3

Я предлагаю обобщение ответа Эвана: сделайте собственную марковскую модель и обучите ее большим куском (очень большого) образца, который вы дадите, оставив остальную часть образца как "тестовые данные". Теперь посмотрим, насколько хорошо модель, которую вы обучили, выполняет на тестовых данных, например. с критерием квадратного квадрата, который предложит ситуацию, в которой "fit is TOO good" (предполагая, что тестовые данные действительно генерируются этой моделью), а также те, в которых соответствие очень плохое (предполагая ошибку в структуре модели - более укоренившаяся модель с неправильной структурой делает в этих случаях заведомо плохую работу).

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

Другой подход заключается в использовании nltk для синтаксического анализа предложений, которые вам даны - небольшое количество ошибочных можно ожидать даже в естественном тексте (поскольку люди несовершенны, а также парсер), он может не знать, что слово X можно использовать в качестве глагола и только классифицировать его как существительное и т.д. и т.д.), но большинство марковских моделей (кроме они моделируют по существу ту же самую грамматическую структуру, которую использует ваш парсер, и вы можете использовать несколько парсеров, чтобы попытаться противодействовать этому! -) приведет к более частому анализу, чем даже к дислексиям людей. Опять же, откалибруйте это по естественным и синтетическим текстам, и вы увидите, что я имею в виду! -)

Ответ 4

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

Ответ 5

Краудсорсинг. Используйте Механический Турок и попросите нескольких людей проголосовать за это. Есть даже некоторые библиотеки, которые помогут вам снять это. Например:

Вот сообщение в блоге от O'Reilly Radar о советах по использованию Mechanical Turk для выполнения вашей работы:

Ответ 6

Если вы пишете программу, которая генерирует вероятности марковского перехода из любой последовательности символов, а затем вычисляет скорость энтропии марковской матрицы. (см. http://en.wikipedia.org/wiki/Entropy_rate#Entropy_rates_for_Markov_chains). Это в основном оценка того, насколько легко можно предсказать текст, используя только цепочку марков (более высокая энтропия означает более сложное предсказание). Поэтому я думаю, что чем ниже энтропия марковской матрицы, тем вероятнее, что образец текста контролируется марковской матрицей. Если у вас есть вопросы о том, как писать этот код, у меня, случается, есть программа на python, которая делает именно это на моем компьютере, поэтому я могу помочь вам