如何为聊天机器人设计数据通道
如何为聊天机器人设计数据通道
AllenOR灵感 发表于8个月前
如何为聊天机器人设计数据通道
  • 发表于 8个月前
  • 阅读 5
  • 收藏 0
  • 点赞 0
  • 评论 0

移动开发云端新模式探索实践 >>>   

聊天机器人开发者通常使用两种技术使得自己的聊天机器人更加的聪明,这两种技术分别是机器学习和专家系统。

机器学习技术可以帮助你识别用户信息的意图是什么,并且从中抽取出一些实体名词。这个技术是非常有帮助的,但是需要很多的数据来训练这个算法。根据经验,我们需要为每个类别提供大约 1000 个示例,用于用户的意图分类。

如果你没有足够的训练数据,那么你也可以设计一些简单的规则来识别用户的意图信息。规则可以是非常简单的,比如,在一个句子中出现 “pay” 和 “order” ,那么我们就认为用户发出的就是一个购买指令。在程序中的实现,大约就是这样:

def isRefundRequest(message):
    return 'pay' in message or 'order' in message

任何的意图分类代码都可能导致两种类型的错误。第一种:用户没有标明确切的意图,但是聊天机器人识别出来了意图;第二章:用户表达了自己的意图,但是聊天机器人没有识别出来。这种方法识别的意图将导致很多的错误,比如:

  1. 用户可以在句子中使用 “pay” 和 “order” 这两个词,但是以另一种方式:I make an order by mistake. I won't pay.

  2. 一个关键词是另一个短语的一部分,比如:Can I use paypal for order #123?

  3. 拼写错误,比如:My orrder number is #123. How can I pay?

  4. 词的不同形式,比如:How can I pay for my orders?

所以,你的聊天机器人需要一个预处理的数据通道,来处理这些典型的错误。具体步骤可能包括以下几步:

1.拼写检查

得到用户的原始输入,然后修改用户的拼写错误。这里有一个非常简单的实现和一个用深度学习实现的拼写检查器

2.分割成句子

我们经常会把每个句子独立出来分析,这是一个非常有用的方法。将文本分割成一个一个句子是非常容易的,你可以使用一些 NLP 方面的包。比如:NLTKStanfordNLPSpaCy

3.分割成单词

这也是一个非常重要的技能,因为一般情况下规则系统都是基于词来操作的。上述提到的一些 NLP 库都可以做这件事。

4.词性标记

一些词同时有两种不同的词性,比如 “change” 是一个名词也是一个动词。知道一个词的词性可以很好的帮助我们规避歧义。你可以使用上述提到的 NLP 库或者 Google SyntaxNet 来处理这些事,Google 的库正确率更高,并且支持很多种语言。

5.词干提取

一个词可能有很多种形式:“pay”,“paying”,“paid”。在很多种情况下,一个词的确切形式对于编写专家系统并不重要。但是如果预处理的时候,能把一个词的很多形式归并到一个形式,那么这对于设计规则系统将带来很大的简便性。对于英文,最有名的字典就是 WordNet,NLTK 和一些其它的库也能达到这个目的。

6.实体识别:时间,数字和专有名词

日期和数字可以被表示成不同的形式:“3/1/2016”,“1st of March”,“next Wednesday”,“2016-03-01”,“123”,“one hundred”等等。在进行模式匹配之前,将这些日期和数字转换成统一格式可能会带来很大的帮助。还有一些专有名词需要我们来特殊对待:地点(国家,地区,城市,街道地址,地点),人员,电话号码。

7.查找概念/同义词

如果你想搜索一种狗,但是你肯定不想列出系统数据库中所有狗的品种,因为数据库中可能有数以百计的狗。如果在预处理消息中可以识别狗的品种,并且使用特殊标签标记这个词,这就是一个非常好的预处理方式。然后,我们只需要在规则中找到这个品种的狗就行了。

WordNet 可以用来识别一些常见的概念。你可能需要添加一些特定的域来处理这些概念,比如,如果你正在构建一个医疗保健机器人,那么需要列出药物的各个名称。

预处理完成之后,你可以得到一个干净的句子列表或每一个句子的单词列表。每个单词都标有词性和概念。下一步就是去定义用户信息的一个意图。

你可以使用常用的逻辑运算符 AND,OR,NOT 来构建自己的模式语言。如果你常见了基于 Python 的内部 DSL(特定域语言),那么规则可以如下所示:

r = Rule(
    And(
        Or('cancel', 'close'),
        'membership',
    Respond('Would you like to cancel your membership immediately?'))

或者,你可以设计外部的 DSL ,这更加方便阅读理解,但是你需要做额外的工作来创建该语言的编译器或解释器。如果你使用 ChatScript 语言,那么写法如下所示:

u: (<<[cancel close] membership>>)
    Would you like to cancel your membership immediately?

快去动手试试吧 :)


来源:Medium

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 10
博文 2139
码字总数 82983
×
AllenOR灵感
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: