Chat: 基于自然语言理解与机器学习的聊天机器人¶

这就是 Chat¶
Chat 是一个基于自然语言理解与机器学习的语义理解库。 Chat 提供丰富的语义分析工具与语义知识图的构建工具,非常适合从0开始迅速搭建自己的聊天机器人,也能够减少工程师在实际开发当中的重复工作。 Chat 非常易于修改和扩展,可以方便地个性化定制。如果您有如下需求,欢迎选择 Chat:
- 想从0开始迅速搭建自己的聊天机器人
- 想了解自然语言处理与机器学习算法在问答中的应用
- 想智能化生活工作,提升效率
- 对知识图谱以及 KBQA 感兴趣,想从0开始构建自己的知识图谱
Chat 适用的 Python 版本是:Python 3.3-3.6
Chat 的设计原则
- 用户友好:用户的使用体验始终是我们考虑的首要和中心内容。Chat 遵循减少认知困难的最佳实践:Chat 提供一致而简洁的 API, 能够极大减少一般应用下用户的工作量,同时,Chat 提供清晰和具有实践意义的 bug 反馈。
- 模块性:完全独立可配置的模块可以用最少的代价自由组合在一起,您可以使用它们来构建自己的模块。
- 易扩展性:添加新模块超级容易,只需要仿照现有的模块编写新的类或函数即可。创建新模块的便利性使得 Chat 更适合于快速开发。
- 知识图谱:基于图数据库的知识图表达提供了更快的搜索速度与智能。
关于 Chat-cn¶
由于作者水平和研究方向所限,因此文档中不可避免会出现各种错误、疏漏和不足之处。如果您在使用过程中有任何意见、建议和疑问,欢迎发送邮件到 1044908508@qq.com 与我取得联系。
您对文档的任何贡献,包括文档的翻译、查缺补漏、概念解释、发现和修改问题、贡献示例程序等,均会被记录在致谢,十分感谢您对 Chat 中文文档的贡献!
当前版本与更新¶
如果您发现本文档提供的信息有误,有两种可能:
- 您的Chat版本过低:Chat是一个发展迅速的语义理解库,请保持您的 Chat 与官方最新的 release 版本相符。
- 我们的中文文档没有及时更新:如果是这种情况,请发邮件给我,我会尽快更新。
目前文档的版本号是1.0.7,对应于官方的1.0.7 release 版本, 本次更新的主要内容是:
- 添加场景问答上下文支持;
- 部分添加对 SQL 的支持,后续会完善对 SQL 的支持;
- 文档全面升级,绝大多数 API 均得到更新;
- 补充了原文档中缺失,但源代码中确实可用的类和函数;
- 添加了项目细节图示说明,包括架构、部署、具体实现等;
- 重新整理了文档风格和栏目,使得文档更容易阅读。
注解
我们欢迎您在 Github 上 Star, Fork 以及 Watch 官方项目 ,这样当官方有更新时,您会立即知道。
您可以在 Read the docs 中阅读官方中文文档。
如果您阅读在线中文文档时有什么问题,您可以在 Github 上下载这个项目,
然后去 /docs/build/html/index.html
阅读离线中文文档。
用户指南¶
安装 Installation¶
部署流程¶

一、图形数据库¶
1.Neo4j 简介¶
Neo4j 是一个高性能的,NoSQL 图形数据库,它将结构化数据存储在网络上而不是表中。Neo4j 也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
2.图形数据结构¶
在一个图中包含两种基本的数据类型:Nodes(节点) 和 Relationships(关系)。Nodes 和 Relationships 包含 key/value 形式的属性。Nodes 通过 Relationships 所定义的关系相连起来,形成关系型网络结构。

3.Neo4j安装¶
Neo4j 可以被安装成一个独立运行的服务端程序,客户端程序通过 REST API 进行访问。也可以嵌入式安装,即安装为编程语言的第三方类库,目前只支持 Java 和 Python 语言。因 Neo4j 是用 Java 语言开发的,所以确保将要安装的机器上已安装了 jre 或者 jdk。
此种安装方式简单,各平台安装过程基本一样
- 1.从 Neo4j官网 上下载最新的版本,根据安装的平台选择适当的版本。
- 2.解压安装包,解压后运行终端,进入解压后文件夹中的 bin 文件夹。
- 3.在终端中运行命令完成安装。
neo4j install-service
- 4.在终端中运行命令开启服务。
neo4j start
- 5.通过 stop 命令可以关闭服务,status 命令查看运行状态。
二、Python3¶
1.Anaconda¶
从 Anaconda官网 上下载3.5版本,根据安装的平台选择适当的版本。
2.Python依赖包¶
从 requirements.txt 安装,由于安装 chat 时会自动安装依赖,所以这一步也可省略。
- pbr
- jieba
- numpy
- py2neo
- requests
- xlrd
- xlwt
- pypinyin
- Flask
- flask_restful
- flask_uploads
pip install -r requirements.txt
三、Chat¶
pip install --upgrade chat
快速开始 QA¶
Step 1 在终端中启动数据库¶
- 方式1:直接使用 chat/tests/nlu.db 这个已经初始化的数据库
- 方式2:需自定义数据库,将其密码设为’train’
- 若要修改密码:可在 chat/conf/self.conf 中修改 [neo4j] 选项 password)
neo4j start
Step 2 初始化语义知识库¶
- 2.1 启动语义服务器并保持(详见 chat/tests/test_server.py,可命令行运行 python test_server.py)
from chat import server
server.start()
- 2.2 导入测试知识库(若直接使用 chat/tests/nlu.db 进入 Step 3)
(详见 chat/tests/test_graph.py,可命令行运行 python test_graph.py)
from chat.graph import Database
kb = Database(password='train')
kb.reset(filename='chat.xls') # 详见 chat/tests/chat.xls,可自定义问答
Step 3 开始聊天¶
- 方式1:启动语义客户端
(详见 chat/tests/test_client.py,可命令行运行 python test_client.py)
from chat import client
client.start()
- 方式2:使用 chat.qa 子模块
from chat.qa import Robot
from chat.config import getConfig
robot = Robot(password=getConfig("neo4j", "password"))
result = robot.search(question="您的自定义问题")
answer = result['content']
print(answer)
配置 Config¶
from chat.qa import Robot
from chat.config import getConfig
robot = Robot(password=getConfig("neo4j", "password"))
# 返回已有知识库列表
result = robot.configure(info="")
# 配置已有知识库权限
# result = robot.configure(info="在已有知识库列表里选择你想要的名称并以空格分隔")
print(result)
开发 Development¶
Chat 始于一个本地语义理解项目,目前由数位 GitHub 的贡献者负责维护和进行改进。
作为一个为研究员和工程师开发的开源项目,我们诚挚地欢迎您为对项目提供帮助。 每个微小的支持都会帮助我们并且会被记录下来。
理念¶
Chat 的想法源于组合语义标签的高区分度和图数据库的灵活高速查询以及向量语义相似度算法的高精度匹配。 它依照下列设计目标所开发:
- 简洁:易于使用,易于扩展与修改以便于研究和工程中使用。
- 快速:自定义语义标签词典:切词过程直接切分为语义向量;图数据库高速查询复杂关联数据;高速语义矩阵相似度计算,简洁但不牺牲性能。
- 兼容:Chat 的每个功能模块都很方便替换为功能相同的其它模块。
- 透明:所有模块均使用纯 Python 来实现,没有一些实现原理及功能的隐藏。
报告 BUG¶
请您在 GitHub 上报告 BUG。 如果您打算报告 BUG,请包含以下内容:
- 您的项目依赖库的版本号
- 重现 BUG 的步骤,最好能减少到数个 Python 命令
- 您获得的结果和您期望的结果。
如果您不确定遇到的行为是否是 BUG, 或者您不确定错误是否与 Chat 有关, 请您先在 our mailing list 查看下。
修复 BUG¶
通过 GitHub 的问题栏(issues)来查看BUG报告。 任何被标记为BUG的项对所有想要修复它的人来说都是开放的。 如果您发现了Chat的一个你可以自己修复的BUG, 您可以用任何方法来实现修复并且无需立即报告这个BUG。
编写文档¶
无论什么时候您发现有些文档没有解释清楚,存在误导,敷衍带过或者根本就是错的。请及时更新它!Edit on GitHub 的链接就在每一篇文档的右上角并且API引用列表中的每篇文档的*[source]*的链接可以帮助您快速地定位任何文字的根源。
如何参与我们¶
在 GitHub 上编辑¶
正如刚刚文档中修复 BUG 所说的简单方法, 点击文档右上角的 Edit on GitHub 链接或者 API 引用列表中的对象的 [source] 链接来打开 GitHub 中的源文件, 然后在你的浏览器中点击 Edit this file 链接并发送拉请求(Pull Request). 你只需要一个免费的 GitHub 账户就可以做到了。
对于任何较大幅度的修改,请遵循以下步骤来更新 Chat 开发。
文档¶
文档由 Sphinx 生成。 如果要本地编辑它,运行下列命令:
cd docs
make html
如果您想要重新生成整个文档,运行下列命令:
cd docs
make clean
make html
然后,打开 docs/build/index.html
来查看会出现在 Read the docs 文档。如果您更改了很多内容,并且似乎出现了许多误导性的错误信息或警告,运行 make clean html
来让 Sphinx 重新生成所有文件。
编写英文文档文字时,请尽可能地按照现有文档的文字习惯,来保证整个文档文字的一致性。所使用的语法及约定的相关信息,请参考以下文档:
测试¶
- 每当您更改任何代码的时候,您应该运行测试脚本来测试它是否能优化现有属性。
- 您修改的每个 BUG 说明一个缺少的测试案例,所以每个修复 BUG 的方案应该配置一个您没修复前的测试案例。
发送拉请求¶
当您对您添加的内容感到满意并且测试通过,文档规范,简明,不存在任何注释错误。 您可以将您的更改提交到一个新的分支(branch),并且将这个分支与您的副本(fork)合并, 然后通过GitHub的网站发送一个拉请求(pull request)
所有的这些步骤在GitHub上有相当不错的说明: https://guides.github.com/introduction/flow/
当您提交拉请求时,请附带一个更改内容的说明,以帮助我们能更好的检阅它。 如果它是一个正在开放的问题(issue),比如:issue#123,请在您的描述中添加 Fixes#123, Resolves#123 或者 Closes#123,这样当您的拉请求被接纳之后 GitHub会关闭那个问题。
技术支持¶
Github¶
您可以在下列网址提问或加入 Chat 开发讨论:
Chat Google group Chat Slack channel, 点击这里获得邀请. 您也可以在 Github issues 里提问或请求新特性。在提问之前请确保您阅读过我们的文档
API 目录¶
如果你正在寻找某个特殊的函数,类或者方法,这一列文档就是为你准备的。
API - 语义知识库管理 API 接口¶
allowed_file |
|
get_username |
|
get_available_kb |
|
get_selected_kb |
|
root_data |
|
signin |
|
signout |
|
get_skb |
|
user_edit |
|
scene_error |
|
reset |
|
upload |
|
upload_img |
|
download_img |
|
download |
|
config_manage |
|
config_add |
|
config_delete |
|
config_delete_admin |
|
search_nlucell |
|
search_scene |
|
nlucell_item |
|
nlucell_add |
|
nlucell_edit |
|
nlucell_delete |
|
scene_topic |
|
scene_item |
|
scene_add |
|
scene_edit |
|
scene_delete |
|
scene_add_single |
|
scene_edit_single |
|
scene_delete_single |
|
start |
API - 常用工具箱¶
mytools.Error |
|
mytools.StringPatternError |
|
mytools.MyEncoder |
|
mytools.get_mac_address |
|
mytools.get_hostname |
|
mytools.get_ip_address |
|
mytools.get_host_ip |
|
mytools.get_current_function_name |
|
mytools.Walk |
|
mytools.time_me |
|
mytools.get_timestamp |
|
mytools.get_current_time |
|
mytools.get_age |
|
mytools.random_item |
|
mytools.file_replace |
|
mytools.read_excel |
|
mytools.set_excel_style |
|
mytools.write_excel |
|
mytools.write_excel_sql |
|
mytools.generate_dict |
|
mytools.waitting |
自定义异常¶
自定义字符串格式异常¶
MyEncoder 解决 json.dumps 不能序列化 datetime 类型的问题¶
获取Mac地址¶
获取主机名¶
获取IP地址¶
获取当前运行函数名¶
遍历目录进行批处理¶
程序时间性能分析¶
获取指定日期表示方式的时间戳或者当前时间戳¶
获取指定日期表示方式的当前时间¶
获取指定日期表示方式的年龄¶
列表随机元素¶
文件替换¶
读取excel¶
设置excel样式¶
写入excel¶
生成词典¶
显示等待中¶
API - 语义工具箱¶
semantic.load_dict |
|
semantic.generate_swords |
|
semantic.check_swords |
|
semantic.synonym_cut |
|
semantic.get_tag |
|
semantic.get_tags |
|
semantic.sim_tag |
|
semantic.max_sim_tag |
|
semantic.sum_cosine |
|
semantic.jaccard_basic |
|
semantic.jaccard |
|
semantic.jaccard2 |
|
semantic.edit_distance |
|
semantic.similarity |
|
semantic.similarity2 |
|
semantic.get_location |
|
semantic.get_musicinfo |
通过 pkl 文件加载原生字典对象¶
生成敏感词词典¶
检测是否包含敏感词¶
自定义分词(包含标点及语气词过滤)¶
自定义分词(可将句子切分为同义词向量标签)¶
获取句子语义标签¶
获取词对应的语义标签集合¶
计算两个语义标签的相似度,得分区间为[0, 1]¶
计算两个词对应的语义标签集合中标签的最大相似度,得分区间为[0, 1]¶
根据语义分词Cosine相似性矩阵计算语义jaccard模型的各个参数¶
向量相似度计算-基础 jaccard 模型¶
向量相似度计算-语义 jaccard 模型¶
向量相似度计算-语义 jaccard2 模型¶
向量相似度计算-语义编辑距离模型¶
向量相似度计算(模型参数可选)¶
计算两个句子的相似度,得分区间为[0, 1]¶
从句子中获取地名信息¶
从句子中获取音乐信息¶
API - 语义工具箱2¶
semantic2.process_part |
|
semantic2.build_tagtree |
|
semantic2.build_tagcount_1 |
|
semantic2.build_tagcount_2 |
|
semantic2.build_tagcount_3 |
|
semantic2.build_tagcount_4 |
|
semantic2.load_dict |