Объекты разговора с чат-ботом, ваш подход?

Я относительно новичок в программировании, и недавний проект, над которым я начал работать, - это чат-бот на Python для канала irc, который я часто посещаю. Одна из моих целей - дать боту возможность отслеживать разговоры с пользователями. В настоящее время я использую объекты разговора. Когда пользователь обращается к боту, он создает новый объект convo и сохраняет журнал разговора, текущую тему и т. Д. В этом объекте. Когда пользователь говорит, если его сообщение соответствует теме разговора, он выбирает ответ на основе того, что он сказал, и новой темы.

Например, если бот присоединяется, и пользователь говорит: «Привет, бот». беседа будет создана, и тема будет установлена ​​на «приветствие». бот ответит «привет», и если пользователь спросит: «Что случилось?», бот изменит тему на «текущие события» и ответит «немного» или что-то подобное. тема имеет связанную тему, и если бот замечает внезапное изменение темы, не помеченной как связанная (вопросы являются исключениями), он будет вести себя немного сбитым с толку и растерянным.

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

Прежде чем вы скажете, что это не то место, я пытался спросить на programmers.stackexchange.com, но не получил соответствующего ответа, просто кто-то неправильно меня понял. Я надеюсь, что смогу получить больше отзывов о более активном сайте. В каком-то смысле это помощь по коду :)

Вот код моего текущего подхода. Есть еще несколько ошибок, и я уверен, что код далек от эффективности. Любые советы или помощь по коду приветствуются.

def __init__(slef):
    self.dicti_topics = {"None":["welcomed", "ask", "badbot", "leave"],
                         "welcomed":["welcomed", "howare", "badbot", "ask", "leave"],
                         "howare":["greetfinished", "badbot", "leave"]}

    self.dicti_lines = {"hello":"welcomed", "howareyou":"howare", "goaway":"leave", "you'rebad":"badbot", "question":"asked"}
    self.dicti_responce = dicti["Arriving dicti_responce"]

def do_actions(self):
    if len(noi.recv) > 0:
        line = False
        ##set vars
        item = noi.recv.pop(0)

        #update and trim lastrecv list
        noi.lastrecv.append(item)
        if len(noi.lastrecv) > 10: noi.lastrecv = noi.lastrecv[1:10]

        args = item.split()
        channel, user = args[0], args[1].split("!")[0]
        message = " ".join(w for w in args[2:])
        print "channel:", channel
        print "User:", user
        print "Message:", message


        if re.match("noi", message):
            if not user in noi.convos.keys():
                noi.convos[user] = []
            if not noi.convos[user]:
                noi.convos[user] = Conversation(user)
                noi.convos[user].channel = channel

                line = "What?"
                send(channel, line)
        if re.match("hello|yo|hey|ohai|ello|howdy|hi", message) and (noi.jointime - time.time() < 20):
            print "hello convo created"
            if not user in noi.convos.keys():
                noi.convos[user] = []
            if not noi.convos[user]:
                noi.convos[user] = Conversation(user, "welcomed")
                noi.convos[user].channel = channel



        #if user has an active convo
        if user in noi.convos.keys():
            ##setvars
            line = None
            convo = noi.convos[user]
            topic = convo.topic


            #remove punctuation, "noi", and make lowercase
            rmsg = message.lower()
            for c in [".", ",", "?", "!", ";"]:
                rmsg = rmsg.replace(c, "")
                #print rmsg
            rlist = rmsg.split("noi")


            for rmsg in rlist:
                rmsg.strip(" ")


                #categorize message
                if rmsg in ["hello", "yo", "hey", "ohai", "ello", "howdy", "hi"]: rmsg = "hello"
                if rmsg in ["how do you do", "how are you", "sup", "what's up"]: rmsg = "howareyou"
                if rmsg in ["gtfo", "go away", "shooo", "please leave", "leave"]: rmsg = "goaway"
                if rmsg in ["you're bad", "bad bot", "stfu", "stupid bot"]: rmsg = "you'rebad"
                #if rmsg in []: rmsg = 
                #if rmsg in []: rmsg =


                #Question handling
                r = r'(when|what|who|where|how) (are|is) (.*)'
                m = re.match(r, rmsg)
                if m: 
                    rmsg = "question"
                    responce = "I don't know %s %s %s." % (m.group(1), m.group(3), m.group(2))


                #dicti_lines -> {message: new_topic}
                #if msg has an entry, get the new associated topic
                if rmsg in self.dicti_lines.keys():
                    new_topic = self.dicti_lines[rmsg]

                    #dicti_topics
                    relatedtopics = self.dicti_topics[topic]
                    #if the topic is related, change topic
                    if new_topic in relatedtopics:
                        convo.change_topic(new_topic)
                        noi.convos[user] = convo
                        #and respond
                        if new_topic == "leave": line = random.choice(dicti["Confirm"])
                        if rmsg == "question": line = responce
                        else: line = random.choice(self.dicti_responce[new_topic])

                    #otherwise it's confused
                    else:
                        line = "Huh?"


                if line:
                    line = line+", %s." % user
                    send(channel, line)

Это do_action состояния в конечном автомате.


person xBlink    schedule 09.07.2011    source источник
comment
Объекты - не лучший вариант - они подходят, если у вас есть данные чего-либо сверх минимальной сложности. Но, пожалуйста, опубликуйте код, чтобы мы могли подсказать, какие части могут быть проще.   -  person Fred Foo    schedule 09.07.2011
comment
@larsmans: Я добавил код, хотя оптимизация кода на самом деле не является частью моего первоначального вопроса :) И извините, ответ занял так много времени, что мне пришлось какое-то время находиться вдали от компьютера.   -  person xBlink    schedule 12.07.2011


Ответы (1)


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

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

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

  1. Какова цель вашей программы в одном предложении?
  2. как можно проще объясните мне основные термины, IRC, Conversation.
  3. что он должен уметь? короткие маркеры.
  4. explain in steps how you would use the program eg:
    • i type in
    • тогда он говорит
    • в зависимости от погоды ... он дает мне список этого ...

Сделав это, забудьте о своем объекте convo или о чем-то еще и подумайте в терминах 1, 2 и 4. На бумаге и ручке подумайте об основных элементах ваших проблем, т.е. о разговорах. Не создавайте объекты просто ... вы » найду их.

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

«Бот добавляет сообщение в тему, пользователь добавляет сообщение в тему, сообщения из темы отправляются в журнал».

это поможет вам узнать, что это за объекты, что они должны делать и какую информацию необходимо хранить.

Сказав все это, я бы сказал, что ваша самая большая проблема - это то, что вы берете на себя больше, чем можете прожевать. Начнем с того, что для компьютера распознавание слов и раскладывание их по темам довольно сложно и требует лингвистики и / или статистики. Как новый программист, я бы старался избегать этих областей, потому что они просто подведут вас и в процессе убьют вашу мотивацию. начните с малого ... затем сделайте БОЛЬШОЙ. попробуйте возиться с программированием графического интерфейса, затем сделайте простой калькулятор и прочее ...

person code shogan    schedule 09.07.2011