Python3深度学习库Keras/TensorFlow打造自己的聊天机器人( 三 )

ok,200次之后,现在模型已经训练好了,现在声明一个方法用来进行词袋转换:
def clean_up_sentence(sentence):# tokenize the pattern - split words into arraysentence_words = nltk.word_tokenize(sentence)# stem each word - create short form for wordsentence_words = [stemmer.stem(word.lower()) for word in sentence_words]return sentence_wordsdef bow(sentence, words, show_details=True):# tokenize the patternsentence_words = clean_up_sentence(sentence)# bag of words - matrix of N words, vocabulary matrixbag = [0]*len(words)for s in sentence_words:for i,w in enumerate(words):if w == s:# assign 1 if current word is in the vocabulary positionbag[i] = 1if show_details:print ("found in bag: %s" % w)return(np.array(bag))测试一下,看看是否可以命中词袋:
p = bow("你好", words)print (p)返回值:
found in bag: 你好[0 0 1 0 0 0 0 0 0 0 0 0 0 0]很明显匹配成功,词已入袋 。
在我们打包模型之前,可以使用model.predict函数对用户输入进行分类测试,并根据计算出的概率返回用户意图(可以返回多个意图,根据概率倒序输出):
def classify_local(sentence):ERROR_THRESHOLD = 0.25# generate probabilities from the modelinput_data = https://www.isolves.com/it/cxkf/yy/Python/2023-01-31/pd.DataFrame([bow(sentence, words)], dtype=float, index=['input'])results = model.predict([input_data])[0]# filter out predictions below a threshold, and provide intent indexresults = [[i,r] for i,r in enumerate(results) if r>ERROR_THRESHOLD]# sort by strength of probabilityresults.sort(key=lambda x: x[1], reverse=True)return_list = []for r in results:return_list.append((classes[r[0]], str(r[1])))# return tuple of intent and probabilityreturn return_list测试一下:
print(classify_local('您好'))返回值:
found in bag: 您好[('打招呼', '0.999913')]liuyue:mytornado liuyue$再测:
print(classify_local('88'))返回值:
【Python3深度学习库Keras/TensorFlow打造自己的聊天机器人】found in bag: 88[('告别', '0.9995449')]完美,匹配出打招呼的语境标签,如果愿意,可以多测试几个,完善模型 。
测试完成之后,我们可以将训练好的模型打包,这样每次调用之前就不用训练了:
model.save("./v3u.h5")这里分类模型会在根目录产出,文件名为v3u.h5,将它保存好,一会儿会用到 。
接下来,我们来搭建一个聊天机器人的API,这里我们使用目前非常火的框架Fastapi,将模型文件放入到项目的目录之后,编写main.py:
import randomimport uvicornfrom fastapi import FastAPIapp = FastAPI()def classify_local(sentence):ERROR_THRESHOLD = 0.25# generate probabilities from the modelinput_data = https://www.isolves.com/it/cxkf/yy/Python/2023-01-31/pd.DataFrame([bow(sentence, words)], dtype=float, index=['input'])results = model.predict([input_data])[0]# filter out predictions below a threshold, and provide intent indexresults = [[i,r] for i,r in enumerate(results) if r>ERROR_THRESHOLD]# sort by strength of probabilityresults.sort(key=lambda x: x[1], reverse=True)return_list = []for r in results:return_list.append((classes[r[0]], str(r[1])))# return tuple of intent and probabilityreturn return_list@app.get('/')async def root(word: str = None):from keras.models import model_from_json,load_modelmodel = load_model("./v3u.h5")wordlist = classify_local(word)a = ""for intent in intents['intents']:if intent['tag'] == wordlist[0][0]:a = random.choice(intent['responses'])return {'message':a}if __name__ == "__main__":uvicorn.run(app, host="127.0.0.1", port=8000)这里的:
from keras.models import model_from_json,load_modelmodel = load_model("./v3u.h5")用来导入刚才训练好的模型库,随后启动服务:
uvicorn main:app --reload效果是这样的:

Python3深度学习库Keras/TensorFlow打造自己的聊天机器人

文章插图
 
结语:毫无疑问,科技改变生活,聊天机器人可以让我们没有佳人相伴的情况下,也可以听闻莺啼燕语,相信不久的将来,笑语盈盈、衣香鬓影的“机械姬”亦能伴吾等于清风明月之下 。




推荐阅读