1

私はプログラミングに比較的慣れていませんが、最近取り組み始めたプロジェクトは、私が頻繁に使用する irc チャネル用の Python のチャットボットです。私の目標の 1 つは、ボットがユーザーとの会話を非常に基本的に追跡できるようにすることです。私は現在会話オブジェクトを使用しています。ユーザーがボットに話しかけると、ボットは新しい convo オブジェクトを作成し、会話のログ、現在のトピックなどをそのオブジェクトに保存します。ユーザーが話すとき、メッセージが会話のトピックと一致する場合、ユーザーの発言と新しいトピックに基づいて応答が選択されます。

たとえば、ボットが参加し、ユーザーが「こんにちは、ボット」と言ったとします。会話が作成され、トピックが「挨拶」に設定されます。ボットは挨拶を返し、ユーザーが「What's up?」と尋ねると、ボットはトピックを「currentevents」に変更し、「あまりない」などと返信します。トピックには関連トピックがあり、ボットが関連としてマークされていないトピックへの突然の変更に気付いた場合 (質問は例外です)、ボットは少し混乱してびっくりします。

私の質問ですが、私の方法は少し複雑すぎて不必要だと思います。オブジェクトは使用するのに最適なものではないと確信しています。会話とそのトピックを追跡するための別のアプローチは何ですか? 良くも悪くも、私はただアイデアを探していて、ちょっとブレインストーミングをしているだけです。

ここが適切な場所ではないと言う前に、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 です。

4

1 に答える 1

1

プログラミングでは、どのオブジェクトとその方法を決定する前であっても、明確な目標を持つことが重要です。残念ながら、私が上で読んだことから、これは本当に明確ではありません。

したがって、最初にプログラムの方法を忘れてください。オブジェクト、コード、およびそれらが何をするかを忘れてください。

今、誰かがあなたのためにプログラムを書こうとしていたと想像してみてください。非常に優れたプログラマーである人は、コーディング方法を教える必要はありません。ここに彼らがあなたに尋ねるかもしれないいくつかの質問があります。

  1. あなたのプログラムの目的は一文で何ですか?
  2. 主な用語であるIRC、会話をできるだけ簡単に説明してください。
  3. それは何ができなければなりませんか?短い箇条書き。
  4. プログラムの使用方法を段階的に説明します。例:
    • 入力します
    • それからそれは言います
    • 天気に応じて...それは私にこれのリストを与えます...

これを行ったら、コンボオブジェクトなどを忘れて、1、2、4の観点から考えます。ペンと紙で、問題の主な要素、つまり会話について考えます。オブジェクトを作成するだけではありません...あなた」それらを見つけます。

次に、これらの要素の相互作用の観点から、これらの要素の関係について考えます。すなわち

「ボットはトピックにメッセージを追加し、ユーザーはトピックにメッセージを追加し、トピックからのメッセージはログに送信されます。」

これは、オブジェクトが何であるか、オブジェクトが何をしなければならないか、およびオブジェクトが保存する必要がある情報を見つけるのに役立ちます。

そうは言っても、あなたの最大の問題は、噛むことができる以上のことをすることだと思います。そもそも、コンピュータが単語を認識してトピックに入れるのは非常に複雑で、言語学や統計が必要です。新しいプログラマーとして、私はこれらの領域を避ける傾向があります。なぜなら、それらは単にあなたを失望させ、その過程であなたのモチベーションを殺してしまうからです。小さく始めて...それから大きくしてください。GUIプログラミングをいじってみて、簡単な電卓などを作成してください...

于 2011-07-09T14:50:18.150 に答える