Существует исходный код для класса 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()