当前位置:   article > 正文

python实现简单对话机器人_在Python中从零开始构建一个简单的聊天机器人(使用NLTK)...

python用keras训练对话机器人

现在我们对NLP流程有了一个初步的了解。现在是我们实现真正任务的时候了,即Chatbot的创建。下文中将聊天机器人命名为'ROBO'

导入(import)必须的库

import nltk

import numpy as np

import random

import string # to process standard python strings

语料

对于我们的示例,我们将使用维基百科Chatbot页面作为我们聊天机器人的语料库。复制页面中的内容并将其放在名为“chatbot.txt”的文本文件中。但是,您也可以使用您选择的任何语料库。

读取数据

我们将读入corpus.txt文件并将整个语料库转换为句子列表和单词列表以供进一步预处理。

f=open('chatbot.txt','r',errors = 'ignore')

raw=f.read()

raw=raw.lower()# converts to lowercase

nltk.download('punkt') # first-time use only

nltk.download('wordnet') # first-time use only

sent_tokens = nltk.sent_tokenize(raw)# converts to list of sentences

word_tokens = nltk.word_tokenize(raw)# converts to list of words

让我们看一下sent_tokens和word_tokens的例子

sent_tokens[:2]

['a chatbot (also known as a talkbot, chatterbot, bot, im bot, interactive agent, or artificial conversational entity) is a computer program or an artificial intelligence which conducts a conversation via auditory or textual methods.',

'such programs are often designed to convincingly simulate how a human would behave as a conversational partner, thereby passing the turing test.']

word_tokens[:2]

['a', 'chatbot', '(', 'also', 'known']

预处理原始文本

我们现在将定义一个名为LemTokens的函数,该函数将Token作为输入并返回规范化的Tokens。

lemmer = nltk.stem.WordNetLemmatizer()

#WordNet is a semantically-oriented dictionary of English included in NLTK.

def LemTokens(tokens):

return [lemmer.lemmatize(token) for token in tokens]

remove_punct_dict = dict((ord(punct), None) for punct in string.punctuation)

def LemNormalize(text):

return LemTokens(nltk.word_tokenize(text.lower().translate(remove_punct_dict)))

关键词匹配

接下来,我们将为机器人定义一个问候函数,即如果用户的输入是问候语,机器人将返回问候语响应.ELIZA使用简单的关键字匹配问候语。我们将在这里使用相同的概念。

GREETING_INPUTS = ("hello", "hi", "greetings", "sup", "what's up","hey",)

GREETING_RESPONSES = ["hi", "hey", "*nods*", "hi there", "hello", "I am glad! You are talking to me"]

def greeting(sentence):

for word in sentence.split():

if word.lower() in GREETING_INPUTS:

return random.choice(GREETING_RESPONSES)

生成响应

为了从我们的机器人生成输入问题的响应,将使用文档相似性的概念。所以我们首先导入必要的模块。

从scikit learn库中,导入TFidf矢量化器,将原始文档集合转换为TF-IDF特征矩阵。

from sklearn.feature_extraction.text import TfidfVectorizer

Also, import cosine similarity module from scikit learn library

from sklearn.metrics.pairwise import cosine_similarity

这将用于查找用户输入的单词与语料库中的单词之间的相似性。这是聊天机器人最简单的实现方式。

我们定义一个函数响应,它搜索用户的话语中的一个或多个已知关键字,并返回几个可能的响应之一。如果找不到与任何关键字匹配的输入,则返回响应:“对不起!我不明白你的意思。“

def response(user_response):

robo_response=''

sent_tokens.append(user_response)

TfidfVec = TfidfVectorizer(tokenizer=LemNormalize, stop_words='english')

tfidf = TfidfVec.fit_transform(sent_tokens)

vals = cosine_similarity(tfidf[-1], tfidf)

idx=vals.argsort()[0][-2]

flat = vals.flatten()

flat.sort()

req_tfidf = flat[-2]

if(req_tfidf==0):

robo_response=robo_response+"I am sorry! I don't understand you"

return robo_response

else:

robo_response = robo_response+sent_tokens[idx]

return robo_response

最后,我们将根据用户的输入,提供我们希望机器人在开始和结束对话时说出的行。

flag=True

print("ROBO: My name is Robo. I will answer your queries about Chatbots. If you want to exit, type Bye!")

while(flag==True):

user_response = input()

user_response=user_response.lower()

if(user_response!='bye'):

if(user_response=='thanks' or user_response=='thank you' ):

flag=False

print("ROBO: You are welcome..")

else:

if(greeting(user_response)!=None):

print("ROBO: "+greeting(user_response))

else:

print("ROBO: ",end="")

print(response(user_response))

sent_tokens.remove(user_response)

else:

flag=False

print("ROBO: Bye! take care..")

到这里,我们在NLTK中编写了我们的第一个聊天机器人。您可以在此处找到包含语料库的完整代码。现在,让我们看看它如何与人类互动:

A.gif

这并不算太糟糕。即使聊天机器人无法对某些问题给出满意的答案,但其他问题的表现还不错。

结论

虽然它是一个非常简单的机器人,几乎没有任何认知技能,但它是进入NLP并了解聊天机器人的好方法。对于一个生产系统,你会想要考虑一个现有的机器人平台或框架,这个例子可以帮助你思考创建一个聊天机器人的设计和挑战。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/346364
推荐阅读
相关标签
  

闽ICP备14008679号