spanl 运算符的实现过程
0. 环境
- ubuntu 版本:Ubuntu 20.04.4 LTS
- anaconda 版本:Anaconda3-2021.05-Linux-x86_64(确保和ubuntu自带的python版本一致)
- 该网站可查看 anaconda 对应的 python 版本 Old package lists — Anaconda documentation
- 安装tensroflow:因为默认的numpy是1.20版本,所以第一次直接使用
conda install tensorflow
安装tensorflow会导致两者版本不匹配,所以要先使用conda uninstall numpy
卸载numpy,然后安装指定版本的numpy:conda install numpy=1.19
,继续安装tensorflow - 安装spacy:
conda install spacy
,然后下载和spacy版本对应的en_core_web_sm.tar.gz,使用pip install
进行安装
1. 自然语言理解和生成
- 提前训练好识别查询类型的 lstm 模型,将其与其它两个必须的文件(类型名称对应和分词模型文件)放入文件夹 save_models 中。
- 准备好知识库文件夹 knowledge_base:地点 place.txt,和空间关系 spatial_relations.csv。
- 编写 Python 文件:NLU.py 和 NLG.py
2. 激活代数 NearestNeighbor
- 使用此代数中的运算符进行最近邻查询。
- 去掉makefile.algebras文件中以下两行的注释
- ALGEBRA_DIRS += NearestNeighbor
ALGEBRAS += NearestNeighborAlgebra
- ALGEBRA_DIRS += NearestNeighbor
- 然后在secondo目录下执行make命令
3. 增加 SpatialNLQ 代数
- 扩展步骤参考:SECONDO 的代数扩展
- 需要在makefile.algebras文件中添加如下五行内容
- ALGEBRA_DIRS += SpatialNLQ
ALGEBRAS += SpatialNLQAlgebra
ALGEBRA_DEPS += python3.8
ALGEBRA_DEP_DIRS += /home/lmy/anaconda3/lib/libpython3.8.so
ALGEBRA_INCLUDE_DIRS += /home/lmy/anaconda3/include/python3.8
- ALGEBRA_DIRS += SpatialNLQ
- SpatialNLQ 文件夹内容如下:
- 需要修改 NLU.py 文件中调用知识库文件和模型文件的路径,注意:此处最好是写成绝对路径。
- SpatialNLQAlgebra.cpp 中需要注意的地方:
- 首先要看 ubuntu 自带的 Python 版本,需要保证 anaconda 和 ubuntu 都为 libpython3.8.so,如下图所示:
- 然后要将/home/lmy/anaconda3/include/python3.8/cpython/pystate.h中的头文件作如下修改,不然会报错
- 释放 Python 资源时,Py_Finalize(); 一定要写到 SpatialNLQAlgebra 类的析构函数里(不然会导致 spanl 运算符只能成功运行一次)。如果是多次导入 PyImport_ImportModule 模块,只有最后一步才调用Py_Finalize()。(具体 C++ 调用 Python 模块的内容请参考c/c++、python混合编程——c/c++调用python第三方包numpy等)
4. 修改 secondo 中 string 数据类型的最大字符数
- secondo 中定义的 CcString 字符数最大为48,所以如果不修改,输入的自然语言查询超过48字符的就会被截断。
- 关于 CcString 的定义在 secondo/include/StandardTypes.h 文件里,其中和最大字符数有关的是变量 MAX_STRINGSIZE,而它的定义在头文件 NestedList.h 中,作以下修改即可:
- 最后需要在secondo目录下执行make。