Python聊天框 :AIML语料库(中文)+Python后台+Python前端交互聊天框+Neo4j图形数据库 实现一个智能回复聊天机械人(实现自学习功能)。
我的AIML机械人实现了自学习的功能,也就是说不用再去改AIML语料库,可以通过聊天框的对话教会机械人新的知识,代码本质上就是把聊天对话中提取的语句,作为新的知识写入语料库中,你可以慢慢的把笨笨的机械人变得越来越聪明。在neo4j部分,实现了对neo4j图形数据库知识节点的增、删、改、查,当然这是通过与机械人的聊天框对话完成,也就是说,聊天框、AIML对话以及neo4j数据库是结合在一起的,可以通过与机械人的对话实现对neo4j数据库的操作。本次实验(不好意思说是项目,实在是惭愧,哈哈哈<-__->)有三个方面的东西,python部分、AIML对话部分、Neo4j部分,python部分包括聊天框,数据库操作,语句处理,关键词提取、AIML自学习、聊天框居中、图片同比例缩放、API的使用、API返回数据Json格式的输出、线程的开启等;AIML部分就是包括了各种它本身的书写语法;Neo4j部分包含了使用.csv成批导入节点,Cypher语句的编写等。如果你正在开始学习上述提到的东西之一,可以用上帝视角参考一下我的代码,读者在看的时候一定要注意AIML、Python聊天框、Neo4j数据库是如何结合的,理解了这里,我的代码你基本上就理解了80%。总之python的代码就是负责连接各个部分,把信息处理之后发布到聊天框上与用户进行交互。如果你只需要聊天框部分,我已在下面单独贴出了聊天框的代码。
本资源只用于学习使用,千万别为了应付作业急于求成,随便的拿代码去改改应付了事,这样是学不到东西的,做什么事最重要的是要有耐心,计算机的很多项目都需要掌握很多基础知识才能完成,我们拿到一个项目的第一反应不是去上手做,而是先做技术分析,难度分析,评估以自己的水平需要多少时间完成,这些是最重要的,如果一上来就急于求成,往往会陷入迷茫,做着做着就蒙了,白白浪费时间,做项目是一个先学再做的过程,千万别把顺序弄反了。走好第一步,再难的项目也会变得简单起来。读者可以把我的代码在完全搞明白的程度上进行优化,修改,但切不可随意糊弄,别想在短时间内就把问题搞定。让我们怀揣梦想,不做杂鱼,力争上流,加油you!
其实你应该会发现,什么事你越想糊弄过关越过不了关,你拿了别人代码,不代表万事搞定了,你还得运行起来,你什么都不懂,想把代码运行起来几乎很困难,不如从头自己学自己搞,这样你会学到很多东西,最后也能做出来,只有东西是自己做的心里才能四平八稳,完全不慌,你也再不用担心老师叫你演示时你会出错,回答时会答不上来了。
Python聊天框效果图
背景图片可以自主修改。
使用Python写聊天框和写前端页面一样,最重要的是把各个组成部分的布局弄好,这里采用的是grid网格布局,读者这里需要上网百度了解一下网格布局。
我电脑上的运行环境
①安装最新的Python3.9。(官网下载即可,需要配置环境变量,和JDK类似,配置过程百度一下即可)
②IDE:使用Visual Studio(安装Python组件)对代码进行调试、运行。
③安装好Python之后,打开电脑命令行,使用命令pip install aiml 安装Python aiml库。(安装之前应更换Python的下载源,不然下载会慢到你怀疑人生。使用命令:pip config set global.index-url http://pypi.douban.com/simple/ ,国内的镜像源有清华、豆瓣、中科大,这里换成豆瓣镜像源。)
④后续还需要安装一些Python库,例如:解析Json数据的,以及播放音乐的库。
⑤Notice:值得注意的是,在Python3.7之后将不再支持aiml中使用到的time.clock() 方法,其在Python3.3中废弃,Python3.8之后被移除,需要打开aiml中的Kernel.py(在你所安装的aiml的文件目录之下)文件,将其中的time.clock()方法全部更换成time.perf_counter(),这样才能正常运行aiml。
⑥下载安装neo4j server用于构建知识图谱数据库。我安装的具体版本为neo4j-community-4.0.8。
⑦需要安装的Python库:pip install py2neo、BeautifulSoup4、pandas、lxml,其中py2neo用于python连接neo4j数据库并进行查询;BeautifulSoup4、lxml用于对爬虫爬取的html文件进行解析;pandas是一个数据分析库,里面有很多工具用于数据分析。
⑧JDK:使用JDK11。这里必须要注意,Neo4j有对应要求的JDK版本,版本不对无法打开数据库的,neo4j-community-4.0.8对应的是11。
Python聊天框的代码
头文件我没有做删减,包括了AIML的和neo4j知识图谱的。里面的两个方法,**set_win_center()**用于在显示聊天框的时候,经过对你电脑屏幕大小的计算将聊天框显示在屏幕中央;**resize()**用来对图片进行同比例缩放,这个方法后来被我废弃了,本来一开始我想在聊天框的空白区域插入图片或者动图,这里就遇到了一个问题,不同大小和长宽不同比例的图片插入要么不能铺满,要么插入之后很难看,所以就写了图片同比例缩放函数用于插入图片,只要给它输入插入图片的容器的高度宽度就可以了。但是后来我换成使用画布来构建背景,这个方法也就废弃了,如有需要读者可以自行启用。
初学者须保持耐心,细细研究代码,把每个函数里面的每个参数的意思搞明白。
import aiml
import os
import hashlib
import requests
import time
import tkinter
import tkinter as tk
import threading
from tkinter import *
from tkinter import messagebox, scrolledtext
import json,urllib
from urllib.parse import urlencode
import urllib.request
import io
from PIL import Image, ImageTk
import pygame
from py2neo import Graph, Node, Relationship
import Stroke
def main():
#将窗口居中显示
def set_win_center(root, curWidth='', curHight=''):
if not curWidth:
'''获取窗口宽度,默认200'''
curWidth = root.winfo_width()
if not curHight:
'''获取窗口高度,默认200'''
curHight = root.winfo_height()
print(curWidth, curHight)
scn_w, scn_h = root.maxsize()# 获取屏幕宽度和高度
cen_x = (scn_w - curWidth) / 2# 计算中心坐标
cen_y = (scn_h - curHight) / 2
print(cen_x, cen_y)
size_xy = '%dx%d+%d+%d' % (curWidth, curHight, cen_x, cen_y)# 计算出面积和坐标,%d表示整数。设置窗口初始大小和位置
root.geometry(size_xy)
def resize(w, h, w_box, h_box, pil_image):#图片同比例缩放
f1 = 1.0*w_box/w
f2 = 1.0*h_box/h
factor = min([f1, f2])
width = int(w*factor)
height = int(h*factor)
return pil_image.resize((width, height), Image.ANTIALIAS)
#创建窗口
app = Tk()
app.title('aiml对话框')
canvas = Canvas(app, width=720,height=520,highlightthickness=0)
imgpath = 'D:\chat\3.gif'
img = Image.open(imgpath)
#w, h = img.size
#pil_image_resized = resize(w, h, 720, 520,img)
photo = ImageTk.PhotoImage(img)
canvas.create_image(420, 450,image=photo)#里面的前两个参数为坐标
canvas.grid(columnspan = 3,rowspan = 3)
#label=tkinter.Label(app,image=photo) #图片
#label.grid()
#创建frame容器
frmLT = Frame(width = 500, height = 320, bg = 'white')
frmLC = Frame(width = 515, height = 150, bg = 'white')
frmLB = Frame(width = 130, height = 26)
#frmRT = Frame(width = 200, height =250)
#创建控件
txtMsgList = Text(frmLT)
txtMsgList=scrolledtext.ScrolledText(width=62, height=20)
txtMsgList.tag_config('greencolor',foreground = '#008C00')#创建tag
#txtMsgList = Text(app,font=("华文彩云",8),fg="black")
txtMsgList.grid(row=0,column=0,sticky=W)
txtMsg = Text(frmLC)
txtMsg.bind("<KeyPress-Up>", sendMsgEvent)#向上键发送
txtMsg.grid(row =1, column = 0)
btnSend = Button(frmLB, text = '发送', width = 8, command = sendMsg)#加入bg="red"可修改按钮背景颜色。
btnCancel =Button(frmLB, text = '取消', width = 8, command = cancelMsg)
#读取图片,并自适应标签大小
#pil_image = Image.open('D://chat//2.png')
#w, h = pil_image.size
#pil_image_resized = resize(w, h, 200, 320, pil_image)
#tk_image = ImageTk.PhotoImage(pil_image_resized)
#lblImage = Label(frmRT)
#lblImage = Label(image=tk_image)
#lblImage.grid(row = 0, column = 2,sticky=N)
#窗口布局 使用grid网格布局,读者需要理解参数row、column等的意思。
frmLT.grid(row = 0, column = 0, columnspan = 2, padx = 1, pady = 3,sticky=NW)
frmLC.grid(row = 1, column = 0, columnspan = 2, padx = 1, pady = 3,stick=NW)
frmLB.grid(row = 2, column = 0, columnspan = 2,sticky=NW)
#frmRT.grid(row = 0, column =2,columnspan = 2, rowspan = 3, padx =2, pady = 3,sticky=N)
#固定大小
frmLT.grid_propagate(0)
frmLC.grid_propagate(0)
frmLB.grid_propagate(0)
#frmRT.grid_propagate(0)
btnSend.grid(row = 2, column = 0)
btnCancel.grid(row = 2, column = 1)
#窗口居中
app.resizable(False, False)#窗口大小不能改变
app.update()
set_win_center(app, 720, 520)
#主事件循环
app.mainloop()
if __name__ == "__main__":
main()
**
在这里我就只贴出聊天框的代码,所有的代码我会全部免费开源到我的Github中。
在neo4j部分我使用了爬虫爬取时光网排名前100的电影生成.csv文件,并将其成批导入neo4j数据库,具体做法跳转到github:
爬虫爬取,成批导入neo4j
## 点击下载所有源代码
另外我写了三个优质的word指导文件(拒绝忽悠,质量靠谱,总共有3个文件,从最简答的AIML对话开始),读者可以自行到我的主页进行下载。希望我们有缘再见,谢谢阅读。
**