spanl 运算符的实现过程

0. 环境

  • ubuntu 版本:Ubuntu 20.04.4 LTS
  • anaconda 版本:Anaconda3-2021.05-Linux-x86_64(确保和ubuntu自带的python版本一致)
  • 安装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
  • 然后在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
  • 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。
posted @ 2022-04-21 17:15  bky-16  阅读(118)  评论(0编辑  收藏  举报