一种用于chatbot的意图分类器

intent-classifier的Python项目详细描述


一个用于chatbot的意图分类器

简介

__ 意图识别是聊天机器人系统的关键组成部分。 我们可以通过用户所说的内容和对话上下文来识别一个人的意图。 对我们人类来说,这是一项非常简单的日常活动,然而 计算机的艰巨任务。

__ 目的识别被看作是一个多标签分类的过程。 具体地说,我们使用单词和上下文作为输入,输出是 多标签意味着用户的文字可能有多个意图。

  • 输入:

    • 文字:
      用户所说的只是一串。
      例句:“我想知道现在几点,天气怎么样?”

    • 上下文(可选):
      包含各种上下文信息的json字符串。
      示例:'{“timestamp”:1553154627,“location”:“shanghai”}“

    将单词和上下文转换为tfidf vector和dict vector 然后将这两个向量连接起来形成最终的 输入向量。

  • 意向标签:

    • 多标签:
      用“,”分隔的标签字符串,如“时间,天气”。

    • 多层次:
      类似的意向标签将放在相同的类别和形式意向中 具有多个级别。
      示例:
      “新闻/体育新闻/足球新闻”
      “新闻/体育新闻/篮球新闻”

数据集

意向数据集

__ intent数据集可以在任何存储器中,比如mysql数据库或本地csv文件。 实现了从mysql和csv文件加载数据集的两个功能 在dataset.py中。它们可以简单地通过提供参数、mysql连接来使用 配置或csv文件路径。
__ 如果intent数据集放在不同的存储中,则可以实现 就像utils.load_from_mysql/load_from_csv一样。记住结果 函数的一个实例应该是databunch,它限制了字段 数据集的:

defload_from_xxx(xxx_params)->DataBunch:words=[]contexts=[]intents=[]# get words, contexts, intents...returnDataBunch(words=np.array(words,dtype=np.str),contexts=np.array(contexts,dtype=np.str),intents=np.array(intents,dtype=np.str))

规则

__ 规则本质上是一种数据集,就像意图数据集一样。他们也可以 以与intent dataset相同的方式存储和获取:

defload_from_xxx(xxx_params)->DataBunch:words_rules=[]context_rules=[]intent_labels=[]# get words, contexts, intents...returnRuleBunch(words_rules=words_rules,context_rules=context_rules,intent_labels=intent_labels)

分类器

分类机制包括基于规则和基于模型的方法:

  • 基于规则的分类:
    基于规则的方法使用手写的regexp和 上下文关键字和值与单词和上下文匹配。不同于基于模型的 分类器,我们不需要训练基于规则的分类器,而是加载规则 从存储中创建实例,然后直接使用以下规则:
importosfromintent_classifierimportRuleClassifier,ModelClassifier,IntentClassifierfromintent_classifier.datasetimportload_intents_from_mysql,load_rules_from_mysqlconfigs_mysql_rule={"host":"xxx.xxx.xxx.xxx","port":xxx,"user":"xxxx","password":"xxxx","db":"xxxx","table":"xxxx","customer":"xxxx"}rule_bunch=load_rules_from_mysql(configs_mysql_rule)rule_classifier=RuleClassifier(rule_bunch)
  • 基于模型的分类:
    基于模型的方法利用机器学习模型预测意图标签 从意向数据集训练。假设我们训练并抛弃了模特, 我们可以这样使用模型:
folder="xxx/xxx/xxx"model_classifier=ModelClassifier(folder=folder,customer="xxx",lang="en",ner=None,n_jobs=-1)model_classifier.load(clf_id=None)# load models with maximum id
  • 监护仪:
    intentClassifier包装了ruleClassifier和modelClassifier以提供最终的 用于预测意图标签的集成接口。我们可以只用规则分类器 或ModelClassifier来初始化intentClassifier或同时使用它们。如果两个人 分类器正在使用中,如果我们已经 从规则分类器中获取意图标签。
    请注意,我们不应使用许多规则来预测意图 标签,最好的方法是使用基于模型的分类器。基于规则的 分类器仅适用于非常简单的情况,不需要模型或 当模型尚未准备好时的临时解决方案,例如,我们需要重新训练 模型添加一些新的意图。

培训

加载意图数据集,创建ModelClassifier的实例,然后 数据集。

configs_mysql_model={"host":"xxx.xxx.xxx.xxx","port":xxx,"user":"xxxx","password":"xxxx","db":"xxxx","table":"xxxx","customer":"xxxx"}data_bunch=load_intents_from_mysql(configs_mysql_model)folder=os.path.join(os.getcwd(),"models")model_classifier=ModelClassifier(folder=folder,customer="xxx",lang="en",ner=None,n_jobs=-1)model_classifier.fit(data_bunch)

注意,意图中的参数“ner”用于命名实体识别,即 可选择用文字提供实体信息。

保存模型

完成装配后ting,运行dump()将模型保存在子文件夹中 在指定的模型文件夹中使用来自datatime的名称。模型和报告 将保存在名为“intent.model”和“report.txt”的子文件夹中 分别是。

model_classifier.dump()

加载模型

使用特定的clf_id或默认的clf_id运行load以加载最新的 模型。

model_classifier.load(clf_id="20190321113421")# if clf_id is None, the model # with maximum id will be loaded

创建intentClassifier

intent_classifier=IntentClassifier(rule_classifier=rule_classifier,model_classifier=model_classifier)

预测

对单词和上下文使用predict()预测意图标签。归还的遗嘱 作为意向标签列表。

intent_labels=intent_classifier.predict(word="I wanna known what time is it and how is the weather?",context={"timestamp":1553154627,"location":"Shanghai"})

要求

  • Python3.7
  • 努比
  • scipy
  • 熊猫
  • scikit learn==0.20.3
  • 作业库
  • pymysql(可选,对于来自mysql的数据集)
  • 解霸(可选,用于中文标记)

安装

pip安装-e git+https://github.com/aitrek/intent_classifier.git

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
junit有没有办法在Java中重新初始化静态类?   在浏览器中点击应用程序时java Play框架挂起   文件Java错误中的NullPointerException   使用Java中的SNMP查找网络中计算机的登录名   java包装服务器引导程序已弃用,有什么替代方案?   当客户在等待理发时,java信号量值是否存在问题?   java如何使用JavaMail仅下载特定类型的附件   如何在java中将十进制转换为十六进制   java Slick2D粒子系统不会生成粒子   java检测更改事件来自何处   将Java集合类型参数类设置为数组   java如何从eclipse导出为可运行JAR文件?   java EntityManager对象未注入Glassfish和Spring   swing从actionPerformed和actionListener Java返回字符串   java在给定另一个等价键对象的情况下获取映射项的当前键   无论输入如何,java网络都会产生相同的输出