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                ...

 

posted @ 2022-05-12 08:58  F·灬小人物  阅读(203)  评论(0编辑  收藏  举报