Генератор бреда. Помогите доделать алгоритм.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Генератор бреда. Помогите доделать алгоритм.

Сообщение arthur2 » 23.03.2009 (Пн) 10:20

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

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

Код: Выделить всё
Public Function getMarkov(lenM As Long, txt As String _
   , Optional prefChrs As String) As String

'Нужно реализовать, чтобы на выходе
'симоволы из prefChrs  встречались чаще
   
    Randomize
    Dim sk As Long 'до куда заполнен результирующий текст
   
    Dim s As String, ln As Long
   
    Dim hf As Long 'середина текста
    ln = Len(txt)
    hf = ln \ 2
    ln = ln - 4 ' чтобы, если мы случайным образом выбираем последний знак,за ним ещё был бы хвостик.

getMarkov = Space(lenM)

Dim i As Long, k As Long

'случайным образом выбираем строку для старта
k = Int((ln - 1 + 1) * Rnd + 1)
'это должно быть начало слова, значит сдвигаемся до пробела
k = InStrRev(txt, " ", k) + 1
s = Mid$(txt, k, 2) ' берем два символа из текста
sk = 1
Mid$(getMarkov, sk, 2) = s 'и пишем их в строку результата


Do
    'Int((верхняяГраница - нижняяГраница+ 1) * Rnd + нижняяГраница)
    i = Int((ln - 1 + 1) * Rnd + 1) ' выбрали случайную точку в тексте
   
    'теперь ищем от неё такое же соченание в тексте ещё где-нибудь.
   
    If i > hf Then
       k = InStr(i, txt, s) ' ищем сначала в ту сторону, которая короче
                            ' иначе сочетания из середины выпадали бы чаще
       If k = 0 Then k = InStrRev(txt, s, i) 'если не нашли, ищем в другую сторону
    Else
       k = InStrRev(txt, s, i)
       If k = 0 Then k = InStr(i, txt, s)
    End If
    If k > ln Then 'если это последнее сочетание в тексте, то сочетается оно с первым в тексте
        k = 1
    End If
   
    s = Mid$(txt, k + 2, 2) ' с чем именно сочетаются наши два символа.
   
    If Len(s) = 0 Then Stop
    sk = sk + 2
    If sk > lenM Then Exit Do
    Mid$(getMarkov, sk, 2) = s
Loop
End Function

Получается нормальный бред, качество которого меня вполне устраивает. Но осталась нерешённая проблема: как сделать, чтобы в полученном тексте чаще встречались определённый символы (скажем, "ъхзэЪХЗЭ")

Помогите идеей?
Вложения
Markov chain.zip
(32.86 Кб) Скачиваний: 75
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Генератор бреда. Помогите доделать алгоритм.

Сообщение Хакер » 23.03.2009 (Пн) 12:09

А ты не спам-машину ли делаешь?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Генератор бреда. Помогите доделать алгоритм.

Сообщение arthur2 » 23.03.2009 (Пн) 12:33

Нет, я делаю генератор текста для клавиатурного тренажера. Собственно, отсюда и проблема: как увеличить количество определённых символов, которые в обычном тексте встречаются редко.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Генератор бреда. Помогите доделать алгоритм.

Сообщение Хакер » 23.03.2009 (Пн) 12:42

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Генератор бреда. Помогите доделать алгоритм.

Сообщение arthur2 » 23.03.2009 (Пн) 12:47

Да я знаю :)

У меня генерируется не на уровне слов, а на уровне букв. Скорее, как здесь:
http://www.klavogonki.ru/create/
(трасса Абракадабра)
Артур
 
   

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Генератор бреда. Помогите доделать алгоритм.

Сообщение RayShade » 23.03.2009 (Пн) 14:35

Да просто качай с этого форума рандомный пост и делов-то :)
I don't understand. Sorry.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Генератор бреда. Помогите доделать алгоритм.

Сообщение arthur2 » 23.03.2009 (Пн) 15:26

Ребята, вы чего? Мой код - уже работает! Задача только в том, чтобы увеличить в тексте количество определенных символов, не нарушив при этом самого принципа построения цепи.

Именно это я не могу придумать, и именно в этом прошу помощи.
Артур
 
   

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Генератор бреда. Помогите доделать алгоритм.

Сообщение jangle » 23.03.2009 (Пн) 16:15

Cамый лучший генератор бреда на политическую тему Кибербатька
Генерирует практически 100% осмысленный текст, но там фразы сторятся уже из готовых предложений.
Получается вполне человеческий поток сознания в стиле Новодворской, что достаточно для троллинга копипастой

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Генератор бреда. Помогите доделать алгоритм.

Сообщение arthur2 » 23.03.2009 (Пн) 16:22

А по коду кто-нибудь что-нибудь предложит?
Артур
 
   

GDK
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 23.10.2008 (Чт) 16:15

Re: Генератор бреда. Помогите доделать алгоритм.

Сообщение GDK » 24.03.2009 (Вт) 13:07

Когда бред готов, посчитать кол-во символов (ёпрст). Если процент символов не устроит, заменить некоторые позиции бреда на Ё или п или р или ...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Генератор бреда. Помогите доделать алгоритм.

Сообщение arthur2 » 24.03.2009 (Вт) 16:09

GDKЭто нарушит принцип построения цепи :) Бред перестанет быть естественным.

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

У меня сейчас такая идея (пытаюсь реализовать)

1. Берём символ из строки с теми символами, процент которых увеличиваем.
2. Ищем в тексте случайным образом место, где символ встречается.
3. Генерирует от этого места цепь в обе стороны (вперед и назад) такой длины, чтобы обеспечить нужную частоту повторения.
4. Обрезаем результат по крайним пробелам слева и срава.

5 Берём следующий символ из prevChrs и повторяем с ним то же самое.

Получается набор недлинных псевдофраз, внутри которых есть нужный нам символ. Их можно стыковать между собой по пробелам - значит безшовно.
Артур
 
   

GDK
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 23.10.2008 (Чт) 16:15

Re: Генератор бреда. Помогите доделать алгоритм.

Сообщение GDK » 25.03.2009 (Ср) 15:13

Сгенерировать бред, не содержащий ёпрст. Сгенерировать ещё бред, но содержащий только ёпрст. Объединить в требуемом процентном соотношении.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Генератор бреда. Помогите доделать алгоритм.

Сообщение arthur2 » 25.03.2009 (Ср) 15:56

Сгенерировать ещё бред, но содержащий только ёпрст.

Бред же генерируется не из букв, а на основе реального теста - так что вопрос "как сгенерировать бред с ёпрст" - и есть заглавный вопрос :) А бред только из одних ёпрст - вообще не годится.
Артур
 
   


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

    TopList