2021-8-30
一. Language Models语言模型
如果你想使用预训练的语言模型词向量,那么可以使用下面的配置加载词向量
MitieNLP
简介 MITIE initializer
输出 Nothing
要求 Nothing
-
描述
初始化MITIE框架,每个MITIE的组件都依赖于这个部分,因此MitieNLP应该放在pipline处理的开始。
-
配置
这部分的处理需要一个语言模型文件,在配置中要显示配置出来。
pipeline: - name: "MitieNLP" # language model to load model: "data/total_word_feature_extractor.dat"
如果想了解更多的信息,请前往安装MITIE
同样,你也可以使用MITIE训练自己的词向量,步骤如下:
准备大规模的干净的语料
在你的语料库上构建并运行MITIE Wordrep工具。根据您的数据集和工作站,这可能需要几个小时/几天的时间。您将需要128GB的RAM来运行wordrep—是的,要求空间确实很大,尝试扩展您的交换。
-
将新的total_word_feature_extractor.dat路径设置为配置文件中MitieNLP组件的模型参数。
训练MITIE词向量的完整示例, 请查看用Rasa NLU 构建自己的中文NLU系统。使用中文维基百科训练的模型。
二. Tokenizers分词
分词器将文本分割成字符。如果你想将意图拆分为多个标签,例如用于预测多个意图或建模层次意图结构,使用以下标志与任何标记赋予器:
- Intent_tokenization_flag表示是否将意图标签进行分词处理。将其设置为True,则意图标签也会被分词处理。
- Intent_split_symbol设置分隔符字符串来分割意图标签,默认为下划线(_)。
JiebaTokenizer结巴分词
简介 中文的分词器
输出
tokens
for user messages, responses (if present), and intents (if specified)要求 Nothing
-
描述
中文的分词器。
Note
如果要使用改分词器,请安装 pip3 install jieba
三. Featurizers特征化
文本特征器分为两类:稀疏特征器和密集特征器。稀疏特征器是返回带有许多缺失值的特征向量的特征器,例如零。由于这些特征向量通常会占用大量的内存,我们将它们存储为稀疏特征。稀疏特征只存储非零值及其在向量中的位置。因此,我们节省了大量的内存,并能够在更大的数据集上进行训练。
所有的特征器都可以返回两种不同的特征:序列特征和句子特征。
序列特征是一个(单词数量x特征维数)大小的矩阵。矩阵包含序列中每个单词的特征向量。这允许我们训练序列模型。
句子特征由(1 ×特征维数)大小矩阵表示。它包含了完整语句的特征向量。句子特征可用于任何词袋模型。因此,相应的分类器可以决定使用哪种特征。注意:序列特征和句子特征的特征维数不一定相同。
RegexFeaturizer
简介 使用正则表达式创建用户消息的向量表示形式。
输出 sparse_features
for user messages and
tokens.pattern要求 tokens
类型 稀疏特征
-
描述
创建实体提取和意图分类的特征。在训练期间,regexfeatuizer会创建一个在训练数据格式中定义的正则表达式列表。对于每个regex,将设置一个特性来标记该表达式是否在用户消息中找到。所有的特征随后将被输入意图分类器/实体提取器以简化分类(假设分类器在训练阶段已经学习了,这个集合特征表明了一个特定的意图/实体)。实体提取的正则表达式特性目前只支持CRFEntityExtractor和DIETClassifier组件!
-
配置
通过添加case_sensitive: False选项使特性器不区分大小写,默认为case_sensitive: True。
要正确处理不使用空格分隔单词的语言,比如中文,用户需要添加use_word_boundaries: False选项,默认为use_word_boundaries: True。
pipeline: - name: "RegexFeaturizer" # Text will be processed with case sensitive as default "case_sensitive": True # use match word boundaries for lookup table "use_word_boundaries": True
四. Entity Extractors 实体抽取
从用户信息中抽取实体,比如人命,地名。
Note
如果您使用多个实体提取器,我们建议每个提取器都以一组独占的实体类型为目标。例如,使用Duckling提取日期和时间,使用DIETClassifier提取人名。否则,如果多个提取器针对相同的实体类型,很可能会多次提取实体。
例如,如果您使用两个或多个通用提取器,如MitieEntityExtractor、DIETClassifier或CRFEntityExtractor,那么您的训练数据中的实体类型将被所有这些提取器找到并提取。如果您用实体类型填充的槽是文本类型的,那么pipline中的最后一个提取器将获胜。如果槽的类型是list,那么所有结果都将添加到列表中,包括重复的结果。
即使提取器关注不同的实体类型,也会发生另一种不太明显的重复/重叠提取情况。想象一下,一个送餐机器人和一个用户信息,比如“I would like to order the Monday special”。假设,如果您的时间提取器的性能不是很好,它可能会在这里提取Monday 作为订单的时间,而您的其他提取器可能会提取Monday special 作为点的餐。如果遇到这种类型的重叠实体,添加额外的训练数据以改进提取器可能是有意义的。如果这还不够,您可以添加一个自定义组件,根据您自己的逻辑解决实体提取中的冲突。
MitieEntityExtractor
简介 MITIE entity extraction (using a MITIE NER trainer)
输出 entities
要求 MitieNLP and
tokens
-
输出示例
{ "entities": [{ "value": "New York City", "start": 20, "end": 33, "confidence": null, "entity": "city", "extractor": "MitieEntityExtractor" }] }
-
描述
MitieEntityExtractor使用MITIE实体提取来查找消息中的实体。底层分类器使用多类线性支持向量机,具有稀疏线性核和自定义特征。MITIE组件不提供实体置信度值。
Note
此实体提取器内部会自己进行特征提取,不需要依赖任何 featurizer特征化处理。
-
配置
pipeline: - name: "MitieEntityExtractor"
RegexEntityExtractor正则实体提取器
简介 使用在训练数据中定义的查找表和/或正则表达式提取实体
输出 entities
要求 Nothing
-
描述
该组件使用训练数据中定义的 lookup tables和 regexes 提取实体。该组件检查用户消息是否包含某个查找表的条目或匹配某个正则表达式。如果找到匹配,则将值提取为实体。
该组件只使用名称等于训练数据中定义的实体之一的正则表达式特性。确保每个实体至少标注一个示例。
Note
当您将此提取器与MitieEntityExtractor、CRFEntityExtractor或DIETClassifier组合使用时,可能会导致多个实体提取。特别是如果许多训练句子都有实体注释,您也为这些实体类型定义了正则表达式。有关多次提取的更多信息,请参阅实体提取器部分开始处的大信息框。
如果您似乎同时需要这个RegexEntityExtractor和前面提到的另一个统计提取器,我们建议您考虑以下两个选项之一。
当您对每种提取器类型都具有独占实体类型时,建议使用选项1。为了确保提取器不会相互干扰,对于每个regex/lookup实体类型只注释一个示例句子,而不是更多。
当您希望使用正则表达式匹配作为统计提取器的附加信号,但又没有单独的实体类型时,选项2是有用的。在这种情况下,您将希望
1)在管道中的提取器之前添加regexfeataturizer
2)在训练数据中注释所有的实体示例
3)从管道中删除RegexEntityExtractor。这样,您的统计提取器将收到关于存在正则表达式匹配的附加信号,并将能够从统计上确定何时依赖这些匹配,何时不依赖。
-
配置
通过添加case_sensitive: True选项使实体提取器区分大小写,默认为case_sensitive: False。
要正确处理不使用空格分隔单词的语言,比如中文,用户需要添加use_word_boundaries: False选项,默认为use_word_boundaries: True。
pipeline: - name: "MitieIntentClassifier"
pipeline:
- name: RegexEntityExtractor
# text will be processed with case insensitive as default
case_sensitive: False
# use lookup tables to extract entities
use_lookup_tables: True
# use regexes to extract entities
use_regexes: True
# use match word boundaries for lookup table
"use_word_boundaries": True
EntitySynonymMapper
简介 将同义的实体值映射到相同的值
输出 修改实体抽取器抽取出的实体
要求 An extractor from Entity Extractors
-
描述
如果训练数据包含定义的同义词,则该组件将确保检测到的实体值将被映射到相同的值。例如,如果您的训练数据包含以下示例:
[ { "text": "I moved to New York City", "intent": "inform_relocation", "entities": [{ "value": "nyc", "start": 11, "end": 24, "entity": "city", }] }, { "text": "I got a new flat in NYC.", "intent": "inform_relocation", "entities": [{ "value": "nyc", "start": 20, "end": 23, "entity": "city", }] } ]
该组件允许您将实体New York City和NYC映射到NYC。实体提取将返回nyc,即使消息包含NYC。当该组件更改现有实体时,它将自己附加到该实体的处理器列表中。
-
配置
pipeline: - name: "EntitySynonymMapper"
五. Intent Classifiers 意图分类器
意图分类器会把用户输入信息,识别为domain.yml文件中定义的意图
MitieIntentClassifier
简介 MITIE intent classifier (using a text categorizer)
输出 intent
要求
tokens
for user message and MitieNLP-
输出示例
{ "intent": {"name": "greet", "confidence": 0.98343} }
-
描述
此分类器使用MITIE来进行意图分类,内置分类器使用稀疏线性核的的线性SVM多分类器(详情请见 MITIE trainer code中 ,参考
train_text_categorizer_classifier
函数)Note
此分类器内部会提取特征,不需要依赖任何 featurizer特征化处理
-
配置
pipeline: - name: "MitieIntentClassifier"
SklearnIntentClassifier
简介 Sklearn intent classifier
输出 intent 和 intent_ranking
要求
dense_features
for user messages-
输出示例
{ "intent": {"name": "greet", "confidence": 0.78343}, "intent_ranking": [ { "confidence": 0.1485910906220309, "name": "goodbye" }, { "confidence": 0.08161531595656784, "name": "restaurant_search" } ] }
-
描述
Sklearn意图分类器会训练一个线性SVM,其中SVM使用grid search进行优化,并且可以提供其它意图的置信度。SklearnIntentClassifier需要在pipline中进行一个稠密特征化的处理。该稠密特征作为分类器的输入。如果想知道更多关于此算法的资料,请参阅 GridSearchCV 文档。
-
配置
在训练SVM过程中,通过超参数搜索来寻找最好的参数集合。在配置文件中可以指定参数搜索集合,如下所示:
pipeline: - name: "SklearnIntentClassifier" # Specifies the list of regularization values to # cross-validate over for C-SVM. # This is used with the ``kernel`` hyperparameter in GridSearchCV. C: [1, 2, 5, 10, 20, 100] # Specifies the kernel to use with C-SVM. # This is used with the ``C`` hyperparameter in GridSearchCV. kernels: ["linear"] # Gamma parameter of the C-SVM. "gamma": [0.1] # We try to find a good number of cross folds to use during # intent training, this specifies the max number of folds. "max_cross_validation_folds": 5 # Scoring function used for evaluating the hyper parameters. # This can be a name or a function. "scoring_function": "f1_weighted"
KeywordIntentClassifier
简介 简单的关键字匹配意图分类器,用来识别简短的意图
输出 intent
要求 Nothing
-
输出示例
{ "intent": {"name": "greet", "confidence": 1.0} }
-
描述
这个分类器通过搜索用户输入数据的关键字来进行分类,当整个关键词和用户输入信息必须一个字不差,完全匹配时才会识别为相应的意图(多一个字都无法识别)。关键字定义为nlu.yml 中的意图对应示例句子。即整个example 是一个关键字,而不是其中的某个词汇。
NOTE
该分类器用于小的项目或冷启动阶段。如果你已经有部分NLU训练数据,可以参阅建议的piplines进行配置,Tuning Your Model.
-
配置
在训练SVM过程中,通过超参数搜索来寻找最好的参数集合。在配置文件中可以指定参数搜索集合,如下所示:
pipeline: - name: "KeywordIntentClassifier" case_sensitive: True
<img src="/Users/chenfan/Documents/mdPic/image-20210708174605132.png" alt="image-20210708174605132" style="zoom: 33%;" />
FallbackClassifier
简介 如果NLU意图分类得分不明确,则使用意图nlu_fallback对消息进行分类。置信度被设置为与回退阈值相同。如果输入句子所有的意图置信度都比较低,那么就会把该句子识别为意图:nlu_fallback
输出 entities
,
intentand
intent_ranking要求
intent
andintent_ranking
output from a previous intent classifier-
输出示例
{ "intent": {"name": "nlu_fallback", "confidence": 0.7183846840434321}, "intent_ranking": [ { "confidence": 0.7183846840434321, "name": "nlu_fallback" }, { "confidence": 0.28161531595656784, "name": "restaurant_search" } ], "entities": [{ "end": 53, "entity": "time", "start": 48, "value": "2017-04-10T00:00:00.000+02:00", "confidence": 1.0, "extractor": "DIETClassifier" }] }
-
描述
FallbackClassifier使用intent nlu_fallback对用户消息进行分类,以防之前的意图分类器无法对置信度大于或等于FallbackClassifier的阈值的意图进行分类。当两个排名靠前的意图的置信度得分比二义性阈值更接近时,它还可以预测回退意图。
您可以使用FallbackClassifier来实现一个Fallback Action,该Action处理带有不确定NLU预测的消息。
rules: - rule: Ask the user to rephrase in case of low NLU confidence steps: - intent: nlu_fallback - action: utter_please_rephrase
-
配置
pipeline: - name: "FallbackClassifier" threshold: 0.3
FallbackClassifier只会在没有其他意图被预测的置信度大于或等于阈值的情况下添加它对nlu_fallback意图的预测。
threshold: 该参数设置预测nlu_fallback意图的阈值。如果前一个意图分类器预测的意图的置信度不大于或等于阈值,那么FallbackClassifier将添加一个置信度为1.0的nlu_fallback意图预测。
ambiguity_threshold: 如果您配置了一个ambiguity_threshold, FallbackClassifier也会预测nlu_fallback意图,以防两个排名最高的意图的置信分数的差异小于ambiguity_threshold。