Связывание команды с чатом с помощью NLTK - PullRequest
0 голосов
/ 14 октября 2019

Я создаю простого чат-бота и хочу, чтобы он запускал команду при задании конкретного вопроса / ответа.

например: Chatbot: «Что я могу сделать для вас сегодня?»Пользователь: "Открыть Google" Chatbot: "Открытие www.google.com" Chatbot запускает command = WebDriver.open ('www.google.com')

Текущий код для тестирования: (TKinter используется только для тестирования, пожалуйстаигнорировать код tkinter)

import nltk
from nltk.chat.util import Chat, reflections
import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import tkinter
from tkinter import *

root = TK()

root.geometry(100x100+100+100)
root.title("Chatbot")

pairs = [

["Hi im (.*)",["hello %1, What can I do for you?"]],
["Open google",["opening www.google.com"]],+OpenG() ##### this is where I need help as concatenating commands does not work

]

def firstChatBot():
    print("Greetings! My name is Chatbot-T1, What is yours?.")
    Chatbot = Chat(pairs, reflections)
    Chatbot.converse()

def openG():
    print("Opening www.google.com")
    driver = webdriver.Chrome()
    driver.get("https://www.googe.com")

btn1 = Button(root, text="Chat", command=firstChatBot).grid(column=1, row=1)

root.mainloop()

1 Ответ

0 голосов
/ 14 октября 2019

Существует исходный код для класса Chat в nltk , и у него нет метода для запуска функций.

Вы должны будете использовать этот код и изменить метод response__init__), чтобы получить три элемента (pattern, response, function_name) вместо (pattern, response) и запустить function_name().

И тогда вы можете использовать

["Open google", ["opening www.google.com"], open_google]

Там должно быть open_google без (), а другой вопрос должен иметь None в качестве третьего элемента.

EDIT: Я добавил match к callback(), так что теперь функция question и все совпадения в (.*), и он может проверить, что было под вопросом.

Я использовал Open (.*), чтобы обратный вызов мог проверить, что было в (.*) и запускать разные страницы. Если вы напишите Open google, откроется www.gooogle.com, если вы напишите Open so, откроется www.StackOverflow.com

import nltk
from nltk.chat.util import Chat, reflections
import re
import random
import webbrowser

class MyChat(Chat):

    def __init__(self, pairs, reflections={}):

        # add `z` because now items in pairs have three elements
        self._pairs = [(re.compile(x, re.IGNORECASE), y, z) for (x, y, z) in pairs]
        self._reflections = reflections
        self._regex = self._compile_reflections()

    def respond(self, str):

        # add `callback` because now items in pairs have three elements
        for (pattern, response, callback) in self._pairs:
            match = pattern.match(str)

            if match:

                resp = random.choice(response)
                resp = self._wildcards(resp, match)

                if resp[-2:] == '?.':
                    resp = resp[:-2] + '.'
                if resp[-2:] == '??':
                    resp = resp[:-2] + '?'

                # run `callback` if exists  
                if callback: # eventually: if callable(callback):
                    callback(match)

                return resp

# --- create function before `pairs` ---

#def open_google(match):
#    webbrowser.open('https://google.com')

def open_something(match):
    #webbrowser.open('https://google.com')
    groups = match.groups()
    if groups:
        if groups[0] == 'google':
            webbrowser.open('https://google.com')
        elif groups[0] == 'so':
            webbrowser.open('https://stackoverflow.com')
        else:
            print('What is "{}"?'.format(groups[0]))
    else:
        print("I don't know what to open")

# --- every question needs `callback` or `None`---

pairs = [
    ["Hi im (.*)", ["hello %1, What can I do for you?"], None],
#    ["Open google", ["opening www.google.com"], open_google],
    ["Open (.*)", ["opening something ..."], open_something],
]

print("Greetings! My name is Chatbot-T1, What is yours?.")
Chatbot = MyChat(pairs, reflections)
Chatbot.converse()
...