telegram-bots / imaginaryfriend

:rocket: Telegram bot
45 stars 18 forks source link

Document ReplyGenerator's code #48

Open demidovakatya opened 7 years ago

demidovakatya commented 7 years ago

https://github.com/telegram-bots/imaginaryfriend/blob/737375bf28d9fb12666b19374c152b1e212c10ed/src/service/reply_generator.py#L5

please, document this class's methods and the logic. I believe ReplyGenerator is the core part of the code

😸

REDNBLACK commented 7 years ago

https://github.com/telegram-bots/imaginaryfriend/commit/312d6b76357a52be8b0916585f51b56f69124bcd done

demidovakatya commented 7 years ago

в общем, как я себе это представляю, логика должна такая:

— приходит сообщение:Здравствуйте Мартин Алексеевич! Я на вас всю общественность подниму чтобы просветили вас гадов гадских! Вы срал а я тебе говорил мы дом общественность ебал тебя гадов и мы же и будем а не вы чтоб мы пахали. Мы пахали а ты я ебал.

— мы его сплитим на предложения (по endsen):

 'я на вас всю общественность подниму чтобы просветили вас гадов гадских',
 'вы срал а я тебе говорил мы дом общественность ебал тебя гадов и мы же и будем а не вы чтоб мы пахали',
 'мы пахали а ты я ебал']

— предложения сплитим на токены

[['здравствуйте', 'мартин', 'алексеевич'],
 ['я', 'на', 'вас', 'всю', 'общественность', 'подниму', 'чтобы', 'просветили', 'вас', 'гадов', 'гадских'],
 ['вы', 'срал', 'а', 'я', 'тебе', 'говорил', 'мы', 'дом', 'общественность', 'ебал', 'тебя', 'гадов', 'и', 'мы', 'же', 'и', 'будем', 'а', 'не', 'вы', 'чтоб', 'мы', 'пахали'],
 ['мы', 'пахали', 'а', 'ты', 'я', 'ебал']]

— всё разбиваем на пары слов:

мартин - алексеевич
алексеевич - (ENDSEN)

я - на
на - вас
вас - всю
всю - общественность
общественность - подниму
подниму - чтобы
чтобы - просветили
просветили - вас
вас - гадов
гадов - гадских
гадских - (ENDSEN)

вы - срал
срал - а
а - я
я - тебе
тебе - говорил
говорил - мы
мы - дом
дом - общественность
...
мы - же
же - и
и - будем
будем - а
...
пахали - (ENDSEN)

мы - пахали
пахали - а
а - ты
ты - я
я - ебал
ебал - (ENDSEN)

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

⚠️ тут нужно ещё производить проверку, а окей ли вообще сообщению начинаться с этого слова (например, мы, вы, здравствуйте — более вероятные начала предложения, чем же). т.е. нужно отдельную статистику вести.

— затем для каждого j-го токена ищем двойки вида (j, k) и из всех k выбираем наиболее часто встречающийся (или случайный из топ-3/5/N наиболее часто встречающихся

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

в общем, выбираем стартовый токен — random select из всех токенов сообщения, но плюс с домножением на частоту встречаемости данного слова в начале (т. е. если нам написали вы же пидор, мы как бы можем начать одинаково с вы, же или пидор, но учитывая историю встречаемости слов — будет примерно так: (1/3) * (1+1) * вы + (1/3) * 1 * же + 1/3 * 1 * пидор)

не описала:

@REDNBLACK спасибо за доку! :+1:

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

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