- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对编程还比较陌生,最近我开始从事的一个项目是一个用 python 编写的聊天机器人,用于我经常访问的 irc channel 。我的目标之一是让机器人能够基本上跟踪它与用户的对话。我目前正在使用对话对象。当用户向机器人发送请求时,它会创建一个新的 convo 对象,并在该对象中存储对话日志、当前主题等。当用户说话时,如果他们的消息与对话主题匹配,它会根据他们所说的内容和新主题选择响应。
例如,如果机器人加入,并且用户说:“你好,机器人。”将创建对话并将主题设置为“问候”。机器人会回问好,如果用户问:“怎么了?”,机器人会将主题更改为“当前事件”,并回复“不多”或类似内容。主题有相关主题,如果机器人注意到未标记为相关的主题突然发生变化(问题除外),它会表现得有点困惑和吃惊。
我的问题是:我觉得我的方法有点过于复杂和不必要。我确信对象并不是最好的使用方式。跟踪对话及其主题的另一种方法是什么?无论是更好还是更糟,我只是在寻找想法和一点头脑 Storm 。
在你说这不是正确的地方之前,我已经尝试在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。
最佳答案
在编程中,即使在决定什么对象以及如何对象之前,拥有明确的目标也很重要。不幸的是,从我上面读到的内容来看,这并不是很清楚。
所以首先忘记程序的如何。忘记对象、代码以及它们的作用。
现在想象一下其他人将为您编写该程序。一个如此优秀的程序员,他们不需要你告诉他们如何编码。以下是他们可能会问您的一些问题。
完成此操作后,请忘记您的 convo 对象或其他任何内容,并根据 1、2 和 4 进行思考。在笔和纸上思考问题的主要元素,即对话。不要只是创建对象.. .你会找到它们的。
现在考虑这些元素之间的交互方式。即
“机器人将消息添加到主题,用户将消息添加到主题,来自主题的消息被发送到日志。”
这将帮助您找到对象是什么、它们必须做什么以及它们需要存储什么信息。
话虽如此,我想说你最大的问题是你承担的事情超出了你的承受能力。首先,计算机识别单词并将其放入主题中是相当复杂的,并且涉及语言学和/或统计学。作为一名新程序员,我倾向于避开这些领域,因为它们只会让你失望,并在此过程中扼杀你的动力。从小事做起...然后做大事。尝试搞乱 GUI 编程,然后制作一个简单的计算器之类的东西......
关于python - 聊天机器人对话对象,你的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6635245/
我能想到的最好的标题,但要澄清的是,情况是这样的: 我正在开发一种类似短 url 的服务,该服务允许用户使用他们的 Twitter 帐户“登录”并发布内容。现在这项服务可以包含在 Tweetdeck
我正在开发一个应用程序,我需要用户使用类似聊天的系统相互交互。 为此,我想创建一个对话模型。据我所知,我将使用多对多关系。 具有以下模型:Conversation、User 和 Message,我想象
我试图在一个页面上多次实现 jquery 对话框 - 基本上,我想在用户单击某个人的名字时显示有关该人的更多信息。 我正在使用 php 生成页面。 我尝试这样做,并使其部分工作,但我只能使页面上的第一
我制作了一个 CustomTypeDialog 类,我想要的是使用不在 Activity 布局中的 EditText。当我尝试单击其中一个按钮时出现空指针异常,我认为这是因为它们不在 Activity
我有这个程序,我想知道如何继续它。我想让用户在“发生了什么”之后输入更多文本,然后让程序响应。感谢您的帮助 int main() { cout > answer; switch(an
我目前正在开发一个由 javafx ui 支持的 java 游戏。 玩家。应该可以和npc对话,这没问题。但我想要一定的文字效果。就像在 polemon 游戏或 Undertale 中一样,文本会逐个
所以基本上我正在尝试重写一个 bash 脚本,该脚本使用对话框 --radiolist 来选择区域设置、键盘、时间。目前,标签是与本地对应的数字(我为它创建了一个哈希表)。但因为我有大约 100 个语
有人可以告诉我如何使用 Watson Conversation 和其他服务(例如 Twilio)调用实时电话并进行对话吗? 我可以使用 Watson Conversation、Twilio 和 Nod
我有一个包含几个 .txt 文件的目录。让我们说 hi.txt hello.txt hello_test.txt test.txt 在 VBA 中使用文件对话框,如何过滤以在下拉列表中仅显示“*tes
我有一个 session 范围的 bean,ComponenteM,它被注入(inject)到请求范围的 bean,ComponenteC 中。 @Named @RequestScoped publi
我需要收集推文“集”,即用于我的研究的推特对话; 这些集合还需要满足以下条件 其中的推文数量,以及 参与人数。 我研究过 Twitter Streaming API、twitter-stream ge
我想在用户 Lync 客户端中打开一个新对话,其中包含预先确定的消息文本,但消息的收件人由用户选择,此过程从用户单击网站。 这可能吗? 最佳答案 这里的部分问题是,如果不知道要与谁开始对话(如果有意义
在 JBoss AS7 中工作,使用 Conversation Scope 管理浏览器选项卡中的用户交互。 我注意到我的页面附加了 ?cid 参数。这很棒 - 直到用户为页面添加书签然后尝试返回它!对
本地和远程标记以及Call-ID的组合用于识别对话。据说Call-ID是一次调用的唯一值。那么为什么 Call-ID 不单独用于识别对话呢? 最佳答案 一句话:“发夹”。 “Hairpinning”是
除了这行不通之外,这里没什么好说的,我不知道为什么。 Arduino 上的串行输出什么也没有。 C# 代码的输出变为等待响应,然后什么也没有。 当我启动 C# 程序时,Arduino 上的蓝牙卡 LE
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
目前正在开发一个应用程序,它甚至可以与 Android 2.2 一起使用,我使用支持库及其 AppCompat 主题来设计我的 UI。尽管大部分 UI 工作正常,但我有一个带有自定义布局的 Alert
我正在尝试对 MySQL 表 I 进行类似对话的输出,如下所示: Content From To Date Lorem
我已经创建了消息系统,在 messages.php 上我想显示消息对话,应该显示最后一条消息,但不知道查询,因为我是 php 新手,这里是数据库信息 table:conversation_chat
在那里,这是我的代码结构: 主要 Activity : public class PureDataActivity extends Activity { private TextView st
我是一名优秀的程序员,十分优秀!