一种用于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