Ответ 1
Я сделал цепочку чатов Маркова для IRC в Python несколько лет назад и могу пролить свет, как я это сделал. Сгенерированный текст не обязательно имеет никакого смысла, но это может быть очень интересно читать. Давайте разложим его поэтапно. Предполагая, что у вас есть фиксированный ввод, текстовый файл (вы можете использовать ввод текста или текста чата или просто использовать свое воображение)
Прокрутите текст и создайте словарь, то есть контейнер с ключом. И поместите все пару слов в виде ключей и слово, следующее за значением.
Например: если у вас есть текст "abcabk", вы начинаете с "ab" в качестве ключа и "c" в качестве значения, тогда "bc" и "a" как значение... значение должно быть списком или любым удержанием коллекции 0..many 'items', так как вы можете иметь более одного значения для данной пары слов. В приведенном выше примере вы будете иметь "a b" два раза, за которым следует "c", а затем "k". Поэтому в итоге у вас будет словарь/хэш, похожий на это: {'a b': ['c','k'], 'b c': ['a'], 'c a': ['b']}
Теперь у вас есть необходимая структура для создания вашего фанк-текста. Вы можете начать с случайного ключа или фиксированного места! Поэтому, учитывая структуру, которую мы имеем, мы можем начать с сохранения "ab", а затем случайным образом взяв из значения c или k следующее слово, поэтому первое сохранение в цикле "abk" (если выбрано "k" ) то вы продолжаете двигаться одним шагом вправо, который в нашем случае является "bk" и сохраняет случайное значение для этой пары, если у вас в нашем случае нет, поэтому вы выходите из цикла (или вы можете решить другие вещи, такие как начать заново). Когда цикл завершен, вы печатаете сохраненную текстовую строку.
Чем больше вход, тем больше значений у вас будут для вас (пара слов), а затем у вас будет "умнее бот", чтобы вы могли "обучать" своего бота, добавляя больше текста (возможно, вход в чат?). Если у вас есть книга в качестве входных данных, вы можете создать несколько хороших случайных предложений. Обратите внимание, что вам не нужно принимать только одно слово, которое следует за парой в качестве значения, вы можете взять 2 или 10. Разница в том, что ваш текст будет более точным, если вы используете более длинные строительные блоки. Начните с пары в качестве ключа и следующего слова в качестве значения.
Итак, вы видите, что у вас в основном может быть два шага: сначала создайте структуру, в которой вы произвольно выбираете ключ для начала, затем берете этот ключ и печатаете случайное значение этого ключа и продолжаете, пока у вас не будет значения или какой-либо прочее состояние. Если вы хотите, вы можете "семенировать" пару слов из ввода чата из вашей структуры ключевых значений, чтобы начать. Его до вашего воображения, как начать свою цепочку.
Пример с реальными словами:
"hi my name is Al and i live in a box that i like very much and i can live in there as long as i want"
"hi my" -> ["name"]
"my name" -> ["is"]
"name is" -> ["Al"]
"is Al" -> ["and"]
........
"and i" -> ["live", "can"]
........
"i can" -> ["live"]
......
Теперь построим цикл:
Выберите случайный ключ, скажите "привет мой" и произвольно выберите значение, только одно здесь, так что его "имя",
(SAVING "привет мое имя" ).
Теперь переместите один шаг вправо, взяв "мое имя" в качестве следующего ключа и выберите случайное значение... "это",
(SAVING "привет мое имя" ).
Теперь перейдите и возьмите "имя"... "Al"
(SAVING "привет мое имя AL" ).
Теперь возьмите "is Al"... "и"
(SAVING "Привет, меня зовут Al и" ).
...
Когда вы переходите к "и i", вы произвольно выбираете значение, допустим "can", тогда слово "i can" создается и т.д.... когда вы приходите в свое состояние остановки или у вас нет значений напечатайте построенную строку в нашем случае:
"Привет, меня зовут Al, и я могу жить там, пока я хочу"
Если у вас есть больше значений, вы можете перейти к любым клавишам. Чем больше значений, тем больше у вас комбинаций и тем более случайным и интересным будет текст.