linux安装rasa_nlu_chi
安装 conda :
1 $ cd ~ && rm -rf ./Anaconda3 # 删除原来的anaconda 2 # 自行清除环境变量里的anaconda信息 3 $ wget "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh" 4 $ bash Miniconda3-latest-Linux-x86_64.sh 5 # 重启计算机 6 # reboot 7 8 $ conda env list # 查看激活的环境版本 9 $ conda create -n env_name python=3.8 # 创建虚拟环境及对应的python版本 10 $ conda activate env_name # 激活虚拟环境
编辑配置文件,配置国内源:
1 # 运行命令:vim ~/.condarc 2 show_channel_urls: true 3 channels: 4 - https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ 5 - https://mirrors.ustc.edu.cn/anaconda/pkgs/free/ 6 - https://mirrors.bfsu.edu.cn/anaconda/cloud/pytorch/ 7 - https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/ 8 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 9 10 - defaults 11
默认连接服务器会进入conda的基础环境,前面有 base 开头
1 # 可通过以下命令取消默认进入虚拟环境: 2 conda config --set auto_activate_base false 3 4 # 重新进入 5 conda activate base 6 7 # 退出 8 conda deactivate
进入创建好的虚拟环境中:
在线安装MITIE:
pip install git+https://github.com/mit-nlp/MITIE.git
安装所需的库,版本自选:
pip install jieba==0.42
pip install scikit-learn==0.2.1
安装Rasa_NLU_CHI:
$ git clone https://github.com/crownpku/Rasa_NLU_Chi.git # clone 源码
进入 rasa/Rasa_NLU_Chi/alt_requirements 目录,运行安装依赖 conda install --yes --file requirements_bare.txt
有包安装不成功,直接手动 pip 安装。
在data中导入模型:
# 位置:data/total_word_feature_extractor_zh.dat
# 文件链接:https://pan.baidu.com/s/1kNENvlHLYWZIddmtWJ7Pdg 密码:p4vx
模型训练,训练文件可通过 数据标注平台 生成,也可以直接照着 demo-rasa_zh.json 文件内容进行编写,训练类型不能少于一个。
python -m rasa_nlu.train -c sample_configs/config_jieba_mitie_sklearn.yml --data data/examples/rasa/demo-rasa_zh.json --path models --project nlu
所需参数:
- 训练配置文件:
-c
- 训练语料:
--data
- 模型保存路径:
--path
- 项目名称:
--project
模型训练完成后,会在--path
指定的路径下保存训练好的模型文件,如果训练时指定了模型名称(即--project),模型就会存储在models/project_name/model_**
目录中,如models/chat_nlu_test/model_20190821-160150
训练时的异常报错:
一、
File "/home/ubuntu/coding/rasa/Rasa_NLU_Chi/rasa_nlu/utils/__init__.py", line 236, in read_yaml_file return yaml.load(read_file(filename, "utf-8")) TypeError: load() missing 1 required positional argument: 'Loader'
处理:打开报错位置,修改一下代码:
1 return yaml.load(read_file(filename, "utf-8")) 2 # 改为 3 return yaml.load(read_file(filename, "utf-8"), Loader=yaml.FullLoader)
二、
File "/home/ubuntu/coding/miniconda3/envs/rasa_env/lib/python3.8/site-packages/cloudpickle/cloudpickle.py", line 132, in _make_cell_set_template_code return types.CodeType( TypeError: an integer is required (got type bytes)
处理:打开路径位置修改代码
1 if not PY3: 2 return types.CodeType( 3 ...... 4 ) 5 else: 6 return types.CodeType( 7 ...... 8 (), 9 ) 10 11 # 改为 12 13 if not PY3: 14 return types.CodeType( 15 ...... 16 ) 17 else: 18 args = [ 19 co.co_argcount, 20 co.co_kwonlyargcount, 21 co.co_nlocals, 22 co.co_stacksize, 23 co.co_flags, 24 co.co_code, 25 co.co_consts, 26 co.co_names, 27 co.co_varnames, 28 co.co_filename, 29 co.co_name, 30 co.co_firstlineno, 31 co.co_lnotab, 32 co.co_cellvars, # this is the trickery 33 (), 34 ] 35 if sys.version_info >= (3, 8, 0): 36 args.insert(2, 0) 37 new_code = types.CodeType(*args) 38 return new_code
启动服务:
python -m rasa_nlu.server -c sample_configs/config_jieba_mitie_sklearn.yml --path models
直接新开服务器终端测试命令:
1 # project 对应模型训练时保存的地址,model 下的路径,没有则为空 2 # model 为模型生成的名称 3 curl -XPOST localhost:5000/parse -d '{"q":"明天早上8点开会", "project": "nlu", "model": "model_20220414-145406"}' | python -mjson.tool
本地运行可直接调用接口测试
1 # post 请求 2 http://localhost:5000/parse 3 4 # json参数 5 {"q": "下午3点开会"} 6 7 # 返回结果 8 { 9 "intent": { 10 "name": "会议", 11 "confidence": 0.7503166481366184 12 }, 13 "entities": [ 14 { 15 "entity": "提醒", 16 "value": "开会", 17 "start": 4, 18 "end": 6, 19 "confidence": null, 20 "extractor": "ner_mitie" 21 } 22 ], 23 "text": "下午3点开会", 24 "time": "2022-04-14 15:00:00" 25 }
测试时报错:
ValueError: y should be a 1d array, got an array of shape (1, 5) instead.
处理:修改以下内容
1 # Rasa_NLU_Chi/rasa_nlu/classifiers/sklearn_intent_classifier.py 2 3 return self.le.inverse_transform(y) 4 # 改为 5 return self.le.inverse_transform(np.squeeze(y))
配置 supervisor 使项目在后台自动运行:
1 [program:rasanlu] 2 command=/home/ubuntu/coding/miniconda3/envs/rasa_env/bin/python3 -m rasa_nlu.server -c sample_configs/config_jieba_mitie_sklearn.yml --path models 3 directory=/home/ubuntu/coding/Rasa_NLU_Chi 4 numprocs=1 5 autostart=true 6 startsecs=10 7 autorestart=true 8 startretried=3 9 user=ubuntu 10 redirect_stderr=true 11 stdout_logfile=/home/ubuntu/coding/Rasa_NLU_Chi/rasa_supervisor.log 12 stdout_logfile_maxbytes=20MB 13 stdout_logfile_backups=20
command 中的路径使用了conda 配置的虚拟环境路径
可自定义返回的内容,找到对应的url接口进行更改:
请求接口官方文档:https://rasa.com/docs/rasa/pages/http-api/#operation/addConversationMessage
1 # rasa_nlu.server.py 2 # 该文件中定义了各接口返回的数据,可自定义更改返回的内容 3 class RasaNLU(object): 4 """Class representing Rasa NLU http server""" 5 6 app = Klein() 7 8 ... 9 10 @app.route("/parse", methods=['GET', 'POST', 'OPTIONS']) 11 @requires_auth 12 @check_cors 13 @inlineCallbacks 14 def parse(self, request): 15 ... 16 if 'q' not in request_params: 17 ... 18 else: 19 data = self.data_router.extract(request_params) 20 try: 21 request.setResponseCode(200) 22 response = yield (self.data_router.parse(data) if self._testing 23 else threads.deferToThread(self.data_router.parse, data)) 24 # 以下内容为自定义新增返回解析时间time,去除返回值 intent_ranking 25 try: 26 response.update({"time": time_extract(data["text"])[0]}) 27 except: 28 pass 29 response.pop("intent_ranking") 30 # end 31 returnValue(json_to_string(response)) 32 except InvalidProjectError as e: 33 ...