如何用Rasa和Spacy进行意图分类

754 阅读8分钟

用Rasa和Spacy进行意图分类

Java虚拟机(或JVM)允许计算机解释或运行Java程序。它作为一个编译器,用于生成机器代码。所有的Java程序都需要一个运行时环境。

意图分类是根据客户目标对文本数据进行自动分类。

意图分类使用机器学习和自然语言理解的概念,对具有不同意图的文本或句子进行分类。

例如,机器学习模型可以学习到诸如 "哪里是购买电视的最佳地点 "这样的句子与购买意图有关。

另一个例子可以是 "我在哪里可以找到一个吃饭的地方",这与寻找餐馆或酒店的意图有关。

对话式人工智能模型中,意图指的是输入问题后给客户的答复。

在第一个例子中,该模型将回应出售电视的最佳场所。在第二个例子中,该模型将强调可用的餐馆或酒店。

意图分类是聊天机器人的一个重要组成部分。它允许这些技术在发布问题时提供准确的答案。

这有助于增加销售,以及客户管理。大多数聊天机器人系统被用来通过个性化的对话来吸引客户。

在本教程中,你将使用Rasa和Spacy来构建意图分类器。Rasa是一个用于使用Python和[自然语言理解(NLU)]构建AI聊天机器人的库。

你将使用Spacy进行高级自然语言处理和后端操作。

前提条件

  1. 对[Python]有良好的理解。
  2. 一些[机器学习]的基本知识。
  3. [在这里]下载数据集。
  4. 有一些[自然语言处理]的知识[。]

注意:为了便于学习,在建立模型时使用[Google Colab]。

简介

意图分类使用的是自然语言理解(NLU)的概念。

自然语言理解(NLU)是自然语言处理(NLP)的一个子集,主要是通过检查一个词的语法和上下文来进行机器阅读理解。

这使它能够确定一个给定句子的预期含义。这就是为什么它被用于意图分类。

另一方面,NLP侧重于处理一个文本,而不去寻找文本的上下文或含义。

下面的图片显示了自然语言处理(NLP)和自然语言理解(NLU)的例子。

NLP-vs-NLU

在本教程中,你使用一个测试样本来训练模型。样本数据集将包含各种文本和它们所属的意图。

在你开始之前,请安装以下库。

安装Rasa和Spacy

让我们从Rasa开始。

由于你使用的是Google Colab,运行这个命令来安装Rasa。

!pip install rasa_nlu

要安装Spacy,请运行这个命令。

!pip install -U spacy

使用的数据集

数据集是以JSON格式使用的。它包含一个文本的列表和它们所属的意图,如下图所示。

Dataset used.

在上面的图片中,你有一些意图,如restaurant_search,affirm,location, 和food

这个JSON数据集样本将被用来训练模型。对话式人工智能模型将被用来回答与餐馆有关的问题。

它还给出了这家餐厅的位置,以及提供的食物类型,如Indian,Chinese,ItalianAfrican fusion 。这将提供一个个性化的对话。

要获得JSON文件,请点击这里

下载数据集文件后,将该文件命名为rasa-dataset.json

导入软件包

你必须导入以下包。

from rasa_nlu.training_data import load_data
from rasa_nlu.config import RasaNLUModelConfig
from rasa_nlu.model import Trainer
from rasa_nlu import config

让我们了解一下上述库。

load_data

它用于将JSON文件数据集加载到机器中。这个数据集被用来训练模型。

这将有助于模型理解模式,并将其用于预测分析。

RasaNLUModelConfig

该库用于存储最佳配置的模型参数。Rasa为模型找到最佳参数

这些参数为模型提供了最高的准确性,以及最好的预测。

训练器

它用于使用加载的数据集来训练模型。训练使模型能够识别模式并进行预测。

配置

这个库用来配置Spacy,它被用来运行模型的后端。

现在你可以加载数据集来训练模型。

加载数据集

你使用load_data 方法加载数据集。

train_data = load_data('rasa-dataset.json')

使用Spacy配置后端

我们将使用Spacy来配置后端。这是一个用于进行自然语言处理的开源库。

你用一个yaml 文件来配置模型。这是使用的样本yaml 文件。

language: "en"
pipeline: "spacy_sklearn"

=======================

language: "en"

pipeline:
- name: "nlp_spacy"
- name: "tokenizer_spacy"
- name: "intent_entity_featurizer_regex"
- name: "intent_featurizer_spacy"
- name: "ner_crf"
- name: "ner_synonyms"
- name: "intent_classifier_sklearn"

yaml 文件包含以下内容。

使用的语言

你指定使用的语言是英语。

管线阶段

管道是用来实现机器学习过程的自动化。这使得建立机器学习模型的过程更加简单和快速。

你将该文件命名为config_spacy.yaml 。将这个保存的文件加载到程序中,方法如下。

trainer = Trainer(config.load("config_spacy.yaml"))

你使用Trainer 方法加载保存的yaml 文件。

然后你使用config.load() 函数来添加设定的参数和管道阶段。

现在我们已经准备好训练模型了。

模型训练

你使用trainer.train 方法训练模型,并传入train_data 。这将使模型能够从数据集中学习。

trainer.train(train_data)

训练的输出是,如下图所示。

Fitting folds for each candidates, totalling the fits
[Parallel(n_jobs=1)]: Done  12 out of  12 | elapsed:    0.3s finished
<rasa_nlu.model.Interpreter at 0x2801960c668>

在上面的输出中,你将模型装入数据集。它还显示,你总共有一个1 工作在运行,并且在0.3s 。这通知你已经完成了模型的训练。

训练完模型后,你需要把它保存到一个文件夹中。你将把模型保存到一个名为projects 的文件夹中。

这是用persist 方法完成的,该方法将模型保存到指定的文件夹中。

model_directory = trainer.persist('/projects/')

用SpaCy提取实体

实体提取可以识别文本中的元素和特征。然后,它将它们分类到预定义的组或类别中,这些组或类别是数据集中的意图。

数据集中的意图如下。

迎接

它被用来对与问候有关的语句进行分类。

肯定

它用于描述积极的语句和句子。

餐厅_搜索

这涉及到涉及搜索最好的餐馆或吃饭的地方的语句。

食物类型

这显示了可用的食物类别,如印度、意大利、墨西哥和非洲融合。

地点

这显示了一个给定餐厅的位置。

告别

这显示带有告别信息的文本。

你需要把输入的文本归类到这些可用的意向中。要开始,请导入Spacy,如下图所示。

import spacy
nlp = spacy.load('en')

你导入了将用于实体提取的Spacy,你还指定了使用的语言是英语。

载入一个样本文本。

docx = nlp("I am looking for an Italian Restaurant where I can eat")

然后你在上面的文本中循环,以获得文本中所有可用的实体。

for word in docx.ents:
    print("value",word.text,"entity",word.label_,"start",word.start_char,"end",word.end_char)

上面的代码在文本中循环,并打印出文本中发现的实体。

你用start 来指定你要开始提取的位置,用end 来指定你要结束提取的位置。

提取的结果是,如下图所示。

value Italian entity NORP start 20 ends 27

上面的输出已经提取了Italian ,这是一种食物的类型。

用模型进行预测

你使用该模型来检查它是否能将一个文本分类为一个意图。

from rasa_nlu.model import Interpreter

你使用Interpreter 来进行预测。

为了进行预测,你需要加载一个样本文本。interpreter.parse() 方法被用来读取输入文本。

interpreter.parse("I am looking for an Italian Restaurant where I can eat")

其输出结果如图所示。

{'intent': {'name': 'restaurant_search', 'confidence': 0.7455215289019911},
 'entities': [{'start': 20,
   'end': 27,
   'value': 'italian',
   'entity': 'cuisine',
   'confidence': 0.6636828413532201,
   'extractor': 'ner_crf'}],
 'intent_ranking': [{'name': 'restaurant_search',
   'confidence': 0.7455215289019911},
  {'name': 'affirm', 'confidence': 0.15019642212447237},
  {'name': 'greet', 'confidence': 0.058736824115844515},
  {'name': 'goodbye', 'confidence': 0.045545224857692024}],
 'text': 'I am looking for an Italian Restaurant where I can eat'}

在上面的输出中,模型已经能够将文本分类为restaurant_search 的意图。

该模型还试图检查所有其他可用的意图,但restaurant_search 给出了更高的confidence 或准确性分数0.7455215289019911 。这个分数是74.5% 的准确性。

其他意图的准确率如下。

申明意图

它给出的confidence ,即0.15019642212447237 ,是15.02% ,是准确的。

问候意图

它给出了一个confidence ,即0.058736824115844515 ,这是5.87% ,很准确。

告别意向

它给出了一个confidence ,即0.045545224857692024 ,是4.55% ,是准确的。

当你比较上述所有的准确度分数时,restaurant_search 的准确度分数比74.5% 高,这就是为什么它被选中。

让我们尝试另一个预测。

第二次预测

interpreter.parse("Good morning World")

输出结果显示。

{'intent': {'name': 'greet', 'confidence': 0.44328419685532383},
 'entities': [],
 'intent_ranking': [{'name': 'greet', 'confidence': 0.44328419685532383},
  {'name': 'goodbye', 'confidence': 0.31245698090344237},
  {'name': 'affirm', 'confidence': 0.1257434275305043},
  {'name': 'restaurant_search', 'confidence': 0.11851539471072912}],
 'text': 'Good morning World'}

intent 被选中,因为与其他意图0.312,0.1257, 和0.1185 相比,0.443 的准确率更高。

这表明该模型能够准确地将文本分类为正确的意图。

总结

在本教程中,你已经学习了使用Rasa和Spacy的意图分类。你首先定义了意图分类以及它在构建对话式人工智能模型中的重要性。

你还学习了自然语言处理和自然语言理解之间的区别。Rasa在构建模型时使用自然语言理解。

然后,你安装了意图分类所需的所有软件包,并创建了训练模型。

最后,你用训练好的模型进行预测。该模型能够将各种文本分类为正确的意图。