geekdoc-python-zh/docs/askpython/chatbot-in-python-using-spa...

11 KiB
Raw Permalink Blame History

使用 spaCy NLP 库在 Python 中构建聊天机器人

原文:https://www.askpython.com/python/examples/chatbot-in-python-using-spacy

读者你好!欢迎来到本教程,在这里我们将用 python 构建一个天气机器人,它将用自然语言与用户互动。没有任何进一步的到期让我们开始吧。

必读:NLP 简介

什么是聊天机器人?

你们一定都访问过一个网站,在那里有一条信息说“嗨!我能帮你什么”然后我们点击它,开始和它聊天。你有没有想过谁和我们互动?嗯,它是智能软件,与我们互动,并回应我们的查询。

让我们再举一个现实生活中的例子,比如苹果公司的 Siri、亚马逊公司的 Alexa、谷歌助手等等。每当我们说“Alexa在 Spotify 上播放我的音乐播放列表”,你的音乐播放列表就会开始播放。这些智能助理使用人工智能和机器学习,并接受过用户提供的各种输入的训练。

聊天机器人可以执行各种任务,如预订火车票,提供特定主题的信息,寻找你附近的餐馆等。聊天机器人就是为用户完成这些任务而创建的,让他们从自己搜索这些信息中解脱出来。

在本教程中,您将使用 spacy NLP 库 创建一个聊天机器人,它可以告诉用户城市的当前天气,并且能够用自然语言与用户交谈。这个聊天机器人将使用 OpenWeather API 告诉用户世界上任何一个城市的当前天气。

推荐阅读 : 自然语言处理 Top 5 Python 库

用 Python 创建聊天机器人的先决条件

  • 最新版本的 Python 可以从https://www.python.org/downloads/下载
  • 在本教程中,我们将为 OpenWeather 使用一个 API 键。要获取 API 密钥,请访问 OpenWeather 并创建一个帐户。请确认您的电子邮件地址。注册成功后,请访问 API 密钥部分,查看为您的帐户生成的 API 密钥。这个 API 密钥是一个字母数字字符序列。

满足上述要求后,我们就可以进入下一步了。

安装库

在本教程中,我们将需要两个库**[spacy](https://www.askpython.com/python/examples/pos-tagging-in-nlp-using-spacy)****[requests](https://www.askpython.com/python-modules/requests-in-python)**。空间库将帮助你的聊天机器人理解用户的句子,请求库将允许聊天机器人发出 HTTP 请求。

安装spacy:

pip install -U spacy

接下来,我们将下载 spacy 的英语语言模型:

python -m spacy download en_core_web_md

如果出现以下错误,则需要安装wheel:

Output
ERROR: Failed building wheel for en-core-web-md

安装车轮:

pip install -U wheel

然后,再次下载英语语言模型。

要确认 spacy 安装正确,请在终端中执行以下命令打开 Python 解释器:

python

现在,导入空间并加载英语语言模型:

>>> import spacy
>>> nlp = spacy.load("en_core_web_md")

如果这两条语句正确执行,则 spacy 安装成功。您可以关闭 python 解释器:

>>> exit()

**requests**库预装了 Python。如果在导入请求模块时收到错误消息则需要安装库:

pip install requests

创建聊天机器人

好了,安装了上面的库,我们可以开始编码了。

步骤 1创建天气函数

在这里,我们将创建一个函数,机器人将使用它来获取一个城市的当前天气。

打开您最喜欢的 IDE并将以下代码添加到 python 文件中:

import requests

api_key = "your_api_key"

def get_weather(city_name):
    api_url = "http://api.openweathermap.org/data/2.5/weather?q={}&appid={}".format(city_name, api_key)

    response = requests.get(api_url)
    response_dict = response.json()

    weather = response_dict["weather"][0]["description"]

    if response.status_code == 200:
        return weather
    else:
        print('[!] HTTP {0} calling [{1}]'.format(response.status_code, api_url))
        return None

让我们来理解代码!

首先,我们导入 requests 库,这样我们就可以发出 HTTP 请求并使用它们。在下一行中,您必须用为您的帐户生成的 API 密钥替换**your_api_key**

接下来,我们定义一个函数**get_weather**(),它将城市的名称作为参数。在函数内部,我们为 OpenWeather API 构造了 URL。我们将通过这个 URL 发出 get 请求。URL 以 JSON 格式返回城市的天气信息。之后,我们使用requests.get()函数向 API 端点发出 GET 请求,并将结果存储在响应变量中。之后,使用response.json()将 GET 请求的结果转换成 Python 字典。我们这样做是为了方便访问。

接下来,我们将天气条件提取成一个 天气变量

接下来,我们处理一些条件。在 if 块中,我们确保 API 响应的状态代码为 200(这意味着我们成功获取了天气信息)并返回天气描述。

如果请求有问题,错误代码会打印到控制台,并且不会返回任何内容。

以上就是关于 get_weather()函数的全部内容。现在,让我们用一些输入来测试这个函数。将代码粘贴到您的 IDE 中,并用为您的帐户生成的 api 密钥替换 your_api_key

代码片段

import requests

def get_weather(city_name):
    api_url = "http://api.openweathermap.org/data/2.5/weather?q={}&appid={}".format(city_name, api_key)

    response = requests.get(api_url)
    response_dict = response.json()

    weather = response_dict["weather"][0]["description"]

    if response.status_code == 200:
        return weather
    else:
        print('[!] HTTP {0} calling [{1}]'.format(response.status_code, api_url))
        return None

weather = get_weather("Patna")
print(weather)

输出

mist

多神奇啊!我们有一个函数可以获取世界上任何一个城市的天气情况。

步骤 2创建聊天机器人功能

在这里,我们将创建一个功能正常的聊天机器人,它使用get_weather()函数获取一个城市的天气状况,使用 spacy NLP 库用自然语言与用户进行交互。将以下代码片段添加到前面的代码中。您不需要为此创建新文件。

首先,我们将导入空间库并加载英语语言模型:

import spacy

nlp = spacy.load("en_core_web_md")

之后,get_weather()添加以下代码:

weather = nlp("Weather Conditions in a city")
def chatbot(statement):
  statement = nlp(statement)

在上面的代码片段中,变量weatherstatement被标记化,这对空间计算用户输入statementweather之间的语义相似度是必要的。聊天机器人函数将statement作为一个参数,它将与存储在变量天气中的句子进行比较。

接下来,我们将使用 spaCy 库的 similarity()函数。similarity()方法计算两个语句的语义相似度,并给出一个介于 0 和 1 之间的值,其中数字越大表示相似度越大。该功能用于使聊天机器人变得智能,以便它可以将用户给出的句子与基本句子进行比较,并给出所需的输出。当我们测试聊天机器人时,情况会变得更加清楚🙂

但是,我们必须为相似性设置一个最小值,以使聊天机器人决定用户希望通过输入语句了解城市的温度。所以,我们把最小值设为 0.75。您可以根据您的项目需求更改该值。

到目前为止,我们的代码是这样的:

import spacy

nlp = spacy.load("en_core_web_md")

weather = nlp("Weather Conditions in a city")

def chatbot(statement):
  statement = nlp(statement)
  min_similarity = 0.75

现在是本教程的最后也是最有趣的部分。我们将用户输入与存储在变量weather中的基本句子进行比较,我们还将从用户给出的句子中提取城市名称。

添加以下代码:

if weather.similarity(statement) >= min_similarity:

    for ent in statement.ents:
      if ent.label_ == "GPE": # GeoPolitical Entity
        city = ent.text

        city_weather = get_weather(city)
        if city_weather is not None:
          return "In " + city +", the current weather is: " + city_weather
        else:
          return "Something went wrong."
      else:
        return "You need to tell me a city to check."

else:
    return "Sorry I don't understand that. Please rephrase your statement."

为了提取命名实体,我们使用 spaCy 的命名实体识别特性。为了提取城市的名称,使用了一个循环来遍历 spaCy 从用户输入中提取的所有实体并检查实体标签是否为“GPE”(地理政治实体)。如果是,那么我们将实体的名称存储在变量city中。一旦提取了城市名称,就调用 get_weather()函数,城市作为参数传递,返回值存储在变量city_weather中。

现在,如果 get_weather()函数成功地获取了天气,那么它将被传递给用户,否则如果发生了错误,将向用户显示一条消息。

至此,您终于使用 spaCy 库创建了一个聊天机器人,它可以理解用户用自然语言输入的内容,并给出想要的结果。

完整的聊天机器人程序代码

import spacy
import requests

nlp = spacy.load("en_core_web_md")

api_key = "019947b686adde825c5c6104b3e13d7e"

def get_weather(city_name):
    api_url = "http://api.openweathermap.org/data/2.5/weather?q={}&appid={}".format(city_name, api_key)

    response = requests.get(api_url)
    response_dict = response.json()

    weather = response_dict["weather"][0]["description"]

    if response.status_code == 200:
        return weather
    else:
        print('[!] HTTP {0} calling [{1}]'.format(response.status_code, api_url))
        return None

weather = nlp("Weather Conditions in a city")
def chatbot(statement):
  statement = nlp(statement)
  min_similarity = 0.75

  if weather.similarity(statement) >= min_similarity:

    for ent in statement.ents:
      if ent.label_ == "GPE": # GeoPolitical Entity
        city = ent.text

        city_weather = get_weather(city)
        if city_weather is not None:
          return "In " + city +", the current weather is: " + city_weather
        else:
          return "Something went wrong."
      else:
        return "You need to tell me a city to check."

  else:
    return "Sorry I don't understand that. Please rephrase your statement."

print("Hi! I am Windy a weather bot.........")
statement = input("How can I help you ?\n")

response = chatbot(statement)
print(response)

我们已经要求聊天机器人提供比哈尔邦的天气情况,让我们看看我们得到了什么输出:

Hi! I am Windy a weather bot.........
How can I help you ?
How is the weather in Bihar
In Bihar, the current weather is: broken clouds

摘要

看到我们的聊天机器人给我们提供天气情况真的很有趣。请注意,我用自然语言询问聊天机器人,聊天机器人能够理解并计算输出。

最后,您已经创建了一个聊天机器人,并且您可以向它添加许多功能。

参考

空间