运用Python从头开始构建简单的Siri机械人?_单词_机械人
天生型机器人可以天生答案,而并非总是用一组答案中的一个回答。这使他们变得更聪明,由于他们从查询中逐字逐句地获取答案。
在本文中,我们将基于python中的NLTK库构建一个基于检索的大略谈天机器人。
建立机器人先决条件假设你具有scikit库和NLTK的动手知识。但是,如果你是NLP的新手,你仍旧可以阅读该文章,然后再参考资源。
自然措辞处理专注于人类措辞与打算机之间相互浸染的研究领域称为自然措辞处理,简称NLP。它位于打算机科学,人工智能和打算措辞学的交汇处。NLP是打算机以一种智能且有用的办法剖析,理解和从人类措辞中获取含义的方法。通过利用NLP,开拓职员可以组织和布局知识来实行诸如自动择要,翻译,命名实体识别,关系提取,情绪剖析,语音识别和主题细分之类的任务。
NLTK:简介NLTK(自然措辞工具包)是用于构建Python程序以处理人类措辞数据的领先平台。它为50多种语料库和词汇资源(如WordNet)供应了易于利用的界面,以及用于分类,标记化,词干剖析,标记,解析和语义推理的文本处理库套件,以及具有工业强度的NLP库的包装器。
NLTK被称为“利用Python进行打算措辞学传授教化和事情的绝佳工具”,以及“利用自然措辞的出色库”。
***并安装NLTK
安装NLTK:运行 pip install nltk测试安装:运行,python然后键入import nltk安装NLTK软件包导入NLTK并运行nltk.download().这将打开NLTK***器,你可以从中选择要***的语料库和模型。你也可以一次性***所有软件包。
利用NLTK进行文本预处理文本数据的紧张问题是它们全部为文本格式(字符串)。但是,机器学习算法须要某种数字特色向量才能实行任务。因此,在开始任何NLP项目之前,我们须要对其进行预处理以使其适宜事情。基本的文本预处理包括:
将全体文本转换为大写或小写,这样算法就不会将相同单词在不同情形下视为不同标记化:标记化只是用于描述将普通文本字符串转换为标记列表(即我们实际须要的单词)的过程的术语。句子标记器可用于查找句子列表,单词标记器可用于查找字符串中的单词列表。NLTK数据包包括一个经由预演习的Punkt令牌天生器。
肃清噪音,即所有不是标准数字或字母的东西。删除停滞词。有时,一些极为常见的词汇在帮助用户选择符合用户需求的文档时彷佛没有什么代价,但却被完备打消在词汇表之外。这些词被称为停滞词词干剖析:词干剖析是将词形变革(有时是派生的)的单词还原为词干、词根或词根的过程,常日是书面形式。词法化:词干法的一个小变种是词法化。它们之间的紧张差异在于,词干常日可以创建不存在的词,而引理是实际的词。因此,你的词根意思不是你只能在字典中查找的内容,而是你可以查找引理的意思。合法化的例子是“运行”是“运行”或“奔跑”等词的基本形式,或者“更好”和“好”一词处于同一引理中,因此它们被认为是相同的。言语包在初始预处理阶段之后,我们须要将文本转换为故意义的数字矢量(或数组)。词袋是文本的表示形式,描述了文档中单词的涌现。它涉及到两件事:
已知单词的词汇表。衡量已知词汇的存在。TF-IDF方法“词袋”方法的一个问题是,频繁涌现的单词开始在文档中占主导地位(例如,较大的分数),但可能没有那么多的“信息内容”。同样,与较短的文件比较,较长的文件将具有更大的权重。
一种方法是通过单词在所有文档中涌现的频率来重新调度单词的频率,以便对在所有文档中也很常见的诸如“ the”之类的单词的分数进行惩罚。这种计分方法称为术语频率反文档频率,简称TF-IDF,个中:
术语频率:是当前文档中单词频率的得分。
TF = (Number of times term t appears in a document)/(Number of terms in the document)
反向文档频率:是一个单词在文档中的罕见程度评分。
IDF = 1+log(N/n), where, N is the number of documents and n is the number of documents a term t has appeared in.
Tf-IDF权重是信息检索和文本挖掘中常常利用的权重。此权重是一种统计量度,用于评估单词对凑集或语料库中文档的主要性
例子:
考虑一个包含100个单词的文档,个中单词“ phone”涌现5次。
那么电话的术语频率(即tf)为(5/100)= 0.05。现在,假设我们有1000万个文档,个中有1000万个单词涌如今电话中。然后,反向文档频率(即IDF)打算为log(10,000,000 / 1,000)=4。因此,Tf-IDF权重是这些数量的乘积:0.05 4 = 0.20。
TF-IDF可以在scikit学习中实现为:
从sklearn.feature_extraction.text导入TfidfVectorizer
余弦相似度TF-IDF是一种运用于文本的变换,用于在向量空间中得到两个实值向量。然后,我们可以通过取向量的点积并将其除以其范数的乘积来得到任何一对向量的余弦相似度。得出向量之间角度的余弦值。余弦相似度是两个非零向量之间相似度的量度。利用此公式,我们可以找出任意两个文档d1和d2之间的相似性。
Cosine Similarity (d1, d2) = Dot product(d1, d2) / ||d1|| ||d2||
个中d1,d2是两个非零向量。
现在,我们对NLP流程有了一个清晰的想法。现在是时候完成真正的任务,即创建谈天机器人了。我们在这里将谈天机器人命名为“ ROBO ”。
导入必要的库
import nltkimport numpy as npimport randomimport string # to process standard python strings
语料库对付我们的示例,我们将利用谈天机器人的Wikipedia页面作为语料库。复制页面中的内容,并将其放置在名为“ chatbot.***”的文本文件中。但是,您可以利用您选择的任何语料库。
读取数据我们将读取corpus.***文件,并将全体语料库转换为句子列表和单词列表,以进行进一步的预处理。
f=open('chatbot.***','r',errors = 'ignore')raw=f.read()raw=raw.lower()# converts to lowercasenltk.download('punkt') # first-time use onlynltk.download('wordnet') # first-time use onlysent_tokens = nltk.sent_tokenize(raw)# converts to list of sentences word_tokens = nltk.word_tokenize(raw)# converts to list of words
让我们看一个send_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的函数,该函数将把令牌作为输入并返回标准化的令牌。
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学习库中,导入TFidf矢量化器,以将原始文档的凑集转换为TF-IDF功能的矩阵。
from sklearn.feature_extraction.text import TfidfVectorizer
其余,从scikit学习库导入余弦相似度模块
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=Trueprint("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编写了我们的第一个谈天机器人。现在,让我们看看它如何与人类互动:
这还不错。纵然谈天机器人在某些问题上不能给出满意的答案,它在其他问题上的表现也很好。
结论只管它是一个非常大略的机器人,险些没有任何认知能力,但它是进入NLP并理解谈天机器人的好方法。只管“ ROBO”会响运用户输入。
谈天机器人的源代码我已经为大家准备好了,如果您须要的话, 可以关注转发文章之后私信回答【源码】即可免费获取到!
本文系作者个人观点,不代表本站立场,转载请注明出处!