rasa 继续入门 - 语言模型与分词器
rasa 支持多种语言模型与分词器,语言模型常用的有 MITIENLP 和 SpaCyNLP,分词器常用的有 WhitespaceTokenizer、JiebaTokenizer、MitieTokenizer、SpacyTokenizer 等。
WhitespaceTokenizer
空格分词器,每个空格间隔的文本,都将分为一个token,典型的英文句子的分词。该分词器不支持中文分词。配置方式如下:
pipeline:
- name: "WhitespaceTokenizer"
# Flag to check whether to split intents
"intent_tokenization_flag": False
# Symbol on which intent should be split
"intent_split_symbol": "+"
# Regular expression to detect tokens
"token_pattern": None
intent_tokenization_flag和intent_split_symbol是在nlu返回多意图的时候使用。当intent_tokenization_flag设置为False,nlu只返回一个置信度最高的意图。但有些时候,一句话包含多个意图,例如:
## intent: affirm+ask_transport
- Yes. How do I get there?
- Sounds good. Do you know how I could get there from home?
用户的回答包含2层意思,首先是同意我的建议,另外是询问怎么去。这时候,需要将intent_tokenization_flag设置为True,然后在训练数据里面编写多意图对应的话术,多个意图中间用intent_split_symbol去分割。在运行的时候,用户说“Sounds good. Do you know how I could get there from home?”,Rasa nlu就会返回affirm+ask_transport这个意图。
token_pattern是一个正则表达式,是对分词后的结果做后处理,过程是这样:先对一句话进行分词,生成一个序列,然后将序列中每个token再应用到token_pattern处理一次,将新生成的词也放在最终分词列表里面。
JiebaTokenizer
jieba分词器,仅可以在中文分词使用,支持自定义词库分词。词库的配置方法如下:
pipeline:
- name: "JiebaTokenizer"
dictionary_path: "path/to/custom/dictionary/dir"
# Flag to check whether to split intents
"intent_tokenization_flag": False
# Symbol on which intent should be split
"intent_split_symbol": "_"
# Regular expression to detect tokens
"token_pattern": None
其中,dictionary_path是字典文件所在路径。
SpaCyNLP
spaCy是一个用Python和Cython编写的高级自然语言处理的库。它跟踪最新的研究成果,并将其应用到实际产品。spaCy带有预训练的统计模型和单词向量,目前支持60多种语言。它用于标记任务,解析任务和命名实体识别任务的卷积神经网络模型,在非常快速的情况下,达到比较好的效果,并且易于在产品中集成应用。
1、安装并下载语言模型包:
pip install -U spacy
# 中文包
python -m spacy download zh_core_web_sm
# 英文包
python -m spacy download en_core_web_sm
如果通过命令下载不下来,可以下载包到本地安装。如下:
1.到 https://spacy.io/ 下载响应的语言包
2.使用 pip
进行安装,如:
# 中文包
pip install \你的下载路径\zh_core_web_sm-3.1.0-py3-none-any.whl
pip install \你的下载路径\zh_core_web_sm-3.1.0.tar.gz
# 英文包
pip install \你的下载路径\en_core_web_sm-3.1.0-py3-none-any.whl
pip install \你的下载路径\en_core_web_sm-3.1.0.tar.gz
- SpaCy的语言支撑的很多,每种语言又有不同的包,根据需要恰当选择吧
2、rasa 中配置:
简单配置:
pipeline:
- name: "SpacyNLP"
model: "zh_core_web_sm"
更多的配置,具体参见 https://rasa.com/docs/rasa/language-support#spacy :
pipeline:
- name: "SpacyNLP"
# language model to load
model: "zh_core_web_sm"
- name: "SpacyTokenizer"
# Flag to check whether to split intents
"intent_tokenization_flag": False
# Symbol on which intent should be split
"intent_split_symbol": "_"
# Regular expression to detect tokens
"token_pattern": None
- name: "SpacyFeaturizer"
# Specify what pooling operation should be used to calculate the vector of
# the complete utterance. Available options: 'mean' and 'max'.
"pooling": "mean"
此处配置要注意引号和下划线的问题…
修改 config.yml
的时候别忘记修改最开头的语言配置 language: en
!!!不知为啥,我配上SpaCy后,rasa shell
就会 TimeoutError。暂时不知原因,回头解决吧!!!
另,默认超时时间要修改的话,到这:$python安装目录$\Lib\site-packages\rasa\core\channels\console.py
,修改 DEFAULT_STREAM_READING_TIMEOUT_IN_SECONDS = 10
为所需的值即可。