简单手撸代码进入SMP2018中文人机对话技术评测任务一前三甲

原文链接:https://juejin.im/post/5bbf3be2e51d450e894e57f8

如果你对自然语言处理和深度学习感兴趣,一定要看看本文,怎么从原始文本数据处理到训练模型到构建应用。过程很重要!总有一点你会有收获。

SMP2018中文人机对话技术评测由中国中文信息学会社会媒体处理专委会主办,哈尔滨工业大学、科大讯飞股份有限公司承办,讯飞公司提供数据,华为公司提供奖金。

这是刚刚出炉的排行榜:

最近刚好在做人机对话的研究,马上把这个任务手撸了,简简单单进入前三(最基础的模型的 F1 值在82左右),并把资源放在了 GitHub SMP2018 上(呜呜呜,可惜以前没去参赛),欢迎大家在我的基础模型上做的更好!

根据训练的模型,我还做了个简单的人机对话应用,也放在GitHub SMP2018 上,如果没有兴趣玩模型,就来玩这个应用吧!

比如这个应用可以对你说的话进行分大类:

 今天东莞天气如何
----------
predict label:	 datetime
----------

 怎么治疗感冒?
----------
predict label:	 health
----------

 你好?
----------
predict label:	 chat
----------
复制代码

评测任务概述

  • 本届人机对话技术评测主要包括两个任务,参赛者可以选择参加任意一个任务或全部任务。

任务1:用户意图领域分类

在人机对话系统的应用过程中,用户可能会有多种意图,相应地会触发人机对话系统中的多个领域(domain) ,其中包括任务型垂直领域(如查询机票、酒店、公交车等)、知识型问答以及闲聊等。因而,人机对话系统的一个关键任务就是正确地将用户的输入分类到相应的领域(domain)中,从而才能返回正确的回复结果。

【用户意图领域分类示例】

1) 你好啊,很高兴见到你! — 闲聊类

2) 我想订一张去北京的机票。 — 任务型垂类(订机票)

3) 我想找一家五道口附近便宜干净的快捷酒店 — 任务型垂类(订酒店)

【评测说明】

评测任务1包含闲聊和垂类两大类,其中垂类又细分为30个垂直领域。本次评测任务1中,仅考虑针对单轮对话用户意图的领域分类,多轮对话整体意图的领域分类不在此次评测范围之内。

本比赛的相关连接
CodaLab评测主页
数据下载
CodaLab 评测教程
评测排行榜
SMP2018-ECDT评测主页
SMP2018-ECDT评测成绩公告链接

我的解决办法

就这个简单的模型,真的就冲进了前三名。

我觉得前期的原始文本处理和后面的构建应用也许更有趣!

如果你对深度学习感兴趣,可以来我的博客交流喔!

展开阅读全文

人机对话

12-16

一个人机对话界面,输入"你知道达芬奇吗"会打印"知道".输入"他很有名"会打印"是啊,他的画的画很好".rn 加了个标签,只有输入了"你知道达芬奇吗"之后再输入"他很有名"才会打印"是啊,他的画的画很好".rnrn以下是代码rnrn希望高手帮我改下rn要求:加入-输入"你知道亚里斯多德吗"会打印"知道".输入"他很有名"会打印"是的,他是个伟大的哲学家".rn 也是只有输入"你知道亚里斯多德吗"之后再输入"他很有名"才会打印"是的,他是个伟大的哲学家".rnrn注意:这两次都输入了"他很有名".要让它们不产生冲突,rnrnrnrnpublic class MyMidlet extends MIDlet implements CommandListener rnForm f = new Form("人机对话"); rnrnCommand send = new Command("确定", Command.OK, 1); rnrnCommand cls = new Command("清除记录", Command.CANCEL, 1); rnrnCommand exit = new Command("退出", Command.EXIT, 1); rnrnTextField tf1 = new TextField("瑞亚", "", 20, TextField.ANY); rnrnDisplay display = Display.getDisplay(this); rnrnpublic MyMidlet() rn// TODO 自动生成构造函数存根 rnf.append(tf1); rnf.addCommand(send); rnf.addCommand(exit); rnf.addCommand(cls); rnf.setCommandListener(this); rn rnrnprotected void destroyApp(boolean arg0) rn// TODO 自动生成方法存根 rnrn rnrnpublic void exitApp() rndestroyApp(true); rnnotifyDestroyed(); rnrn rnrnprotected void pauseApp() rn// TODO 自动生成方法存根 rnrn rnrnprotected void startApp() throws MIDletStateChangeException rnrn// TODO 自动生成方法存根 rndisplay.setCurrent(f); rnrn rnrnprivate String[] words = "您的输入不正确", "知道", rn"是啊,他的画的画很好" ,"000"; rnrnprivate boolean flag; rnrnpublic void commandAction(Command c, Displayable d) rn// TODO 自动生成方法存根 rnif (c == send) rnString s = tf1.getString().trim(); rnif (s.startsWith("000")) rnf.append("瑞亚:" + tf1.getString() + "\n"); rnf.append("苏菲:" + words[3] + "\n"); rntf1.setString(""); rnrnrnrn else if (s.equals("你知道达芬奇吗")) rnf.append("瑞亚:" + tf1.getString() + "\n"); rnf.append("苏菲:" + words[1] + "\n"); rntf1.setString(""); rnflag = true; rnrn else if (flag && s.startsWith("他很有名")) rnf.append("瑞亚:" + tf1.getString() + "\n"); rnf.append("苏菲:" + words[2] + "\n"); rntf1.setString(""); rnrn else rnf.append("瑞亚:" + tf1.getString() + "\n"); rnf.append("苏菲:" + words[0] + "\n"); rntf1.setString(""); rn rnrn else if (c == cls) rnf.deleteAll(); rnf.append(tf1); rn else if (c == exit) rnexitApp(); rn rn rnrn 论坛

j2me人机对话

11-18

rn想做个手机程序实现人机对话程序,只做了一个界面,还不能达到对话的功能,不知到有没有高手帮我做到. rn要求:有一个文本输入框,文本输入框为瑞亚说的话,文本框之下为苏菲的回答,手机左键为确认按钮,文本框输入相应文字,左键点确认按钮之后,把瑞亚和苏菲说的话一起打印到文本框之下,最少实现两句对话。打印之后清空文本框。只要求能对相应的文字输入,作相应的文字打印。 第一句:输入“你几岁”,打印“20岁”,第二句:输入“做什么的”,打印“学IT的”,能否把完整代码发到lingwuersan@163.com,非常感谢。 rnrnpublic class rrr2 extends MIDlet implements ItemCommandListener rnprivate Form props = new Form("对话框"); rnprivate Display dis; rnprivate TextField tfAcc = new TextField("瑞亚","",20,TextField.ANY); rnprivate Command cmdDel = new Command("←清除",Command.SCREEN,1); rnpublic rrr2() rn rnrnprotected void startApp() throws MIDletStateChangeException rn// TODO Auto-generated method stub rndis = Display.getDisplay(this); rndis.setCurrent(props); rnprops.append(tfAcc); rntfAcc.addCommand(cmdDel); rntfAcc.setItemCommandListener(this); rnprops.append("苏菲:rtgerrte\n"); rn rnpublic void commandAction(Command c, Item i) rnSystem.out.println("悬着"); rnif(c==cmdDel) rnTextField tf = (TextField)i; rnint position = tf.getCaretPosition(); rntf.delete(position-1, 1); rn rn rnprotected void destroyApp(boolean arg0) throws MIDletStateChangeException rn// TODO Auto-generated method stub rnrn rnrnprotected void pauseApp() rn// TODO Auto-generated method stub rn rnrn不管用什么方法,只要能做出来在WTK2.5能运行就行如果有那位朋友做出来了,直接把源代码发来就OK,在下是初学者,就算你提示了,我也不会啊,只有麻烦各位直接把源代码发到lingwuersan@163.com,我就万分感谢。 论坛

没有更多推荐了,返回首页