Сегодня мы собираемся создать ChatBot API и веб-интерфейс на Python 3. ChatBots сложно построить, потому что существует бесконечное количество входных параметров. Из-за этого ChatBot, который может последовательно придумывать хорошие ответы, требует огромных знаний.
Разработчики часто применяют алгоритмы машинного обучения, NLP и совокупность предопределенных ответов в своей конструкции системы ChatBot. Мы собираемся сохранить наш код базовым, поэтому будем обходить создание сложного «мозга» для нашего ChatBot.
Вместо того, чтобы строить мозг ИИ, мы будем использовать тот, который бесплатен и уже создан: поиск Google.
Наш ChatBot выполнит поиск Google по запросу пользователя, очистит текст от первого результата и ответит пользователю первым предложением текста этой страницы.
Запросы в Google с помощью Python
Чтобы запрограммировать нашего простого ChatBot с всеведением (бесконечное знание), мы будем выполнять поиск в Google с помощью Python. К счастью, есть библиотека Python для поиска Google, которую мы можем установить с помощью pip.
Ч.14/15 Python для начинающих: создать вопросник/тест (Building a quiz)
После локальной установки библиотеки Google вы можете написать следующий код:
from googlesearch import search query = ‘how old is samuel l jackson’ ## Google Search query results as a Python List of URLs search_result_list = list(search(query, tld=»co.in», num=10, stop=3, pause=1))
Получив список URL-адресов из результатов поиска, мы можем выполнить запрос GET для этой веб-страницы с помощью библиотеки запросов Python. Мы также можем разобрать HTML с помощью html из LXML, а также BeautifulSoup.
import requests from lxml import html from googlesearch import search from bs4 import BeautifulSoup query = ‘how old is samuel l jackson’ ## Google Search query results as a Python List of URLs search_result_list = list(search(query, tld=»co.in», num=10, stop=3, pause=1)) page = requests.get(search_result_list[index]) tree = html.fromstring(page.content) soup = BeautifulSoup(page.content, features=»lxml»)
Все зависимости Python этого проекта можно найти в requirements.txt на GitHub.
Вот готовый файл, который наш HTTP-сервер может импортировать как зависимость. Я создал метод, который выполняет поиск в Google, получает первый
на веб-странице и возвращает его содержимое в виде строки. Если поиск не удастся каким-либо образом, ChatBot ответит: «Извините, я не могу придумать ответ для этого».
import requests import string from lxml import html from googlesearch import search from bs4 import BeautifulSoup # to search # print(chatbot_query(‘how old is samuel l jackson’)) def chatbot_query(query, index=0): fallback = ‘Sorry, I cannot think of a reply for that.’ result = » try: search_result_list = list(search(query, tld=»co.in», num=10, stop=3, pause=1)) page = requests.get(search_result_list[index]) tree = html.fromstring(page.content) soup = BeautifulSoup(page.content, features=»lxml») article_text = » article = soup.findAll(‘p’) for element in article: article_text += ‘n’ + ».join(element.findAll(text = True)) article_text = article_text.replace(‘n’, ») first_sentence = article_text.split(‘.’) first_sentence = first_sentence[0].split(‘?’)[0] chars_without_whitespace = first_sentence.translate( < ord(c): None for c in string.whitespace >) if len(chars_without_whitespace) > 0: result = first_sentence else: result = fallback return result except: if len(result) == 0: result = fallback return result
Теперь мы можем принять пользовательский ввод и выполнить поиск Google. Мы сделаем HTTP-запрос GET к первому результату поиска. Затем мы анализируем возвращенный HTML-код и выделяем первое предложение в первом
Как написать свою программу на python? #python #программирование
на этой странице. Это алгоритм ответа нашего ChatBot, машинного обучения не требуется.
Python API для простого ChatBot
Далее нам нужно создать серверное приложение, которое будет нашим API для запросов ChatBot. Он будет обслуживать ответы на HTTP-запросы. Для начала эти запросы будут поступать с простой HTML-страницы, которую мы сделаем позже.
Для начала мы импортируем библиотеки Python 3 HTTP server и socket server вместе с поисковым файлом Google, который мы сделали ранее.
import http.server import socketserver from google_search import chatbot_query PORT = 8080 DIRECTORY = ‘public’
Наш API будет обслуживаться через порт 8080, и мы будем обслуживать ресурсы веб-страниц из папки, которая называется public в родительском каталоге нашего проекта. Далее мы сделаем наш собственный обработчик для запросов GET и POST.
HTTP GET-запросы попытаются вернуть соответствующий файл из папки public . Это будут файлы HTML, CSS и JavaScript для нашего интерфейса веб-браузера. POST-запросы будут использоваться для запросов ChatBot.
class Handler(http.server.SimpleHTTPRequestHandler): def __init__(self, *args, **kwargs): super().__init__(*args, directory=DIRECTORY, **kwargs) def do_POST(self): self.send_response(200) content_length = int(self.headers[‘Content-Length’]) post_body = self.rfile.read(content_length) self.end_headers() print(‘user query’, post_body) google_search_chatbot_reply = chatbot_query(post_body) self.wfile.write(str.encode(google_search_chatbot_reply))
Наконец, мы запустим сервер и используем наш обработчик. Вот весь файл, включая приведенные фрагменты кода.
import http.server import socketserver from google_search import chatbot_queryPORT = 8080 DIRECTORY = ‘public’ class Handler(http.server.SimpleHTTPRequestHandler): def __init__(self, *args, **kwargs): super().__init__(*args, directory=DIRECTORY, **kwargs) def do_POST(self): self.send_response(200) content_length = int(self.headers[‘Content-Length’]) post_body = self.rfile.read(content_length) self.end_headers() print(‘user query’, post_body) google_search_chatbot_reply = chatbot_query(post_body) self.wfile.write(str.encode(google_search_chatbot_reply)) with socketserver.TCPServer((», PORT), Handler) as httpd: print(‘serving at port’, PORT) try: httpd.serve_forever() except KeyboardInterrupt: pass httpd.server_close()
Автоматизируем задачи на Python с помощью ChatGPT
ChatGPT — чат-бот на базе ИИ от OpenAI, который специализируется на диалогах. Мы можем сделать ChatGPT своим помощником — и не только в написании кода!
Вот несколько упорядоченных по сложности задач, которые я предложил выполнить ChatGPT (и получил впечатляющие результаты).
Задача #1. Построить линейную регрессию
Чтобы построить график линейной регрессии, достаточно просто сказать ChatGPT:
plot a linear regression with Python using matplotlib (построй график линейной регрессии с помощью Python и matplotlib).
Если не указать конкретную библиотеку, ChatGPT выберет ее сам.
Вот код Python, созданный ChatGPT (с комментариями!):
import matplotlib.pyplot as plt
import numpy as np
# Сгенерировать случайные данные
x = np.random.rand(100)
y = x + np.random.normal(0, 0.1, size=100)
# Подогнать линейную регрессию под данные
m, b = np.polyfit(x, y, 1)
# Построить график данных и подобранную линию
plt.plot(x, y, ‘o’)
plt.plot(x, m*x + b, ‘-‘)
plt.show()
А вот результат:
Это было легко. Теперь попробуем что-нибудь посложнее.
Задача #2. Отправить сообщение на WhatsApp с помощью pywhatkit
Сможет ли ChatGPT помочь со сторонними библиотеками, такими как pywhatkit? Эта библиотека позволяет отправлять сообщения с помощью Whatsapp.
send a message on Whatsapp using Python and pywhatkit (отправь сообщение на Whatsapp с помощью Python и pywhatkit).
При выполнении этой задачи я не стал сообщать ChatGPT свой номер телефона и сообщение, которое хотел отправить (нечто подобное я сделал для задачи №3).
Вот код Python, созданный ChatGPT:
import pywhatkit
# Установите время в 24-часовом формате (ЧЧ:ММ:СС), когда нужно отправить сообщение
time = «HH:MM:SS»
# Установите номер телефона, на который хотите отправить сообщение
phone_number = «1234567890»
# Напишите сообщение, которое хотите отправить
message = «Your message goes here»
# Используйте метод sendwhatmsg для отправки сообщения в указанное время
pywhatkit.sendwhatmsg(time, phone_number, message)
В дополнение к этому коду, сгенерированному ChatGPT, у вас должна быть открыта сессия WhatsApp в браузере и установлена библиотека pywhatkit.
Задача #3. Отправить электронное письмо с помощью Python
В интернете есть множество фрагментов кода, которые показывают, как отправить электронное письмо с использованием Python. Вы можете продвинуться на шаг вперед с ChatGPT:
import smtplib
# создайте объект SMTP
smtp_obj = smtplib.SMTP(‘smtp.gmail.com’, 587)
# запустите TLS-шифрование
smtp_obj.starttls()
# войдите в учетную запись электронной почты
smtp_obj.login(‘[email protected]’, ‘YOUR_PASSWORD’)
# создайте электронное письмо
message = «Subject: Email sent by ChatGPTnnChatGPT rocks!»
# отправьте письмо
smtp_obj.sendmail(‘cod[email protected]’, ‘[email protected]’, message)
# закройте SMTP-соединение
smtp_obj.quit()
После ввода кода ChatGPT предупредил о необходимости ввести пароль в поле “YOUR_PASSWORD” .
Однако в этот раз ChatGPT не сообщил о том, что для получения 16-символьного пароля в случае использования Gmail нужно включить двухэтапную верификацию.
Тем не менее ChatGPT проделал потрясающую работу. После ввода пароля я получил письмо:
Задача #4. Веб-скрейпинг с books.toscrape.com
Вероятно, самым сложным заданием, которое я дал ChatGPT, было извлечение данных с сайта. Как вы, наверное, знаете, веб-ресурсы создаются с использованием различных версий HTML, поэтому процесс веб-скрейпинга меняется в зависимости от конкретного сайта.
ChatGPT отлично справился с задачей по поиску названий книг и цен на books.toscrape.com.
web scrape https://books.toscrape.com/ using Python and beautiful soup (проведи скрейпинг https://books.toscrape.com/ с использованием Python и BeautifulSoup).
import requests
from bs4 import BeautifulSoup
# Выполните GET-запрос к сайту
response = requests.get(«https://books.toscrape.com/»)
# Проведите парсинг HTML-содержимого сайта
soup = BeautifulSoup(response.text, «html.parser»)
# Извлеките нужные данные с помощью различных методов и атрибутов BeautifulSoup
titles = soup.find_all(«h3»)
prices = soup.find_all(class_=»price_color»)
# Сохраните извлеченные данные в файл или базу данных, или используйте их в других целях
with open(«book_data.txt», «w») as file:
for title, price in zip(titles, prices):
file.write(f»: n»)
А вот извлеченные данные:
Удобно извлекать данные без самостоятельного написания кода!
Бонус: создание отчета в Excel с помощью Python
Если вы увлекаетесь автоматизацией Excel, вам будет интересно узнать, что я также попытался сгенерировать отчет в Excel, используя ChatGPT.
Я не смог придумать ничего лучшего, чем попросить ChatGPT помочь с автоматизацией отчетов в Excel следующим образом:
generate an Excel report with Python (сгенерируй отчет в Excel с помощью Python).
Вот сгенерированный код:
А вот результат:
Как видите, я получил лишь простой шаблон, но уверен, что вам нужно лишь дать ChatGPT правильную команду, чтобы достичь впечатляющих результатов.
- Как заказывали: админ-панель от Django Jet
- Обзор полезных инструментов для интроспекции объектов Python
- Обзор JavaScript на основе диалога с ChatGPT
Читайте нас в Telegram, VK и Дзен
Источник: nuancesprog.ru
Как написать программу на питоне которая будет задавать вопросы
1 апреля, 2020
Andrey K
(8 голос, значение: 3,25 из 5)
Данная статья будет полезна для учителей информатики, которые занимаются программированием с детьми внеурочно. Опыт показывает, что написание даже простых консольных игр придает мотивации для изучения программирования у детей. Сегодня мы рассмотрим процесс написания консольной игры «Поле Чудес» на Python. Что необходимо знать, чтобы понимать, о чем идет речь:
- Модуль Random
- Словари
- Циклы
- Списки и строки
При написании программы не будут использоваться функции и ООП.
Часть 1
Моделирование игры — важная часть всего процесса. Без понимания того, что должно получится, написание кода приведет к путанице.
- Компьютер загадывает слово — выбирает пару «вопрос — ответ» из словаря или считывает из файла.
- Два игрока (для упрощения) по очереди вращают барабан, где может выпасть либо какое-то количество очков, либо «банкрот» (когда все очки сгорают), либо «переход хода следующему игроку»
- Игрок в свой ход может назвать букву или отгадать слово целиком. Если буква не отгадана, очки все равно зачисляются
- Если игрок отгадывает слово, от может потратить заработанные очки на призы (призы для усложнения задачи)
- Далее спрашиваем, будет ли супер игра?
- При положительном ответе задается финальный вопрос и предлагается назвать несколько букв (количество зависит от длины слова)
- Если вопрос отгадан — игрок получает супер-приз. В противном случае теряет все призы, заработанные ранее.
Часть 2.
Приступим к написанию игры.
Сначала создадим банк вопросов для основной игры и банк вопросов для финала (более сложных)
У нас два варианта, чтобы создать базу вопросов:
- база вопросов в виде словаря
- база вопросов, записанных в файл
Рассмотрим создание базы вопросов в виде словаря:
import random # база вопросов в виде словарей questions_main = < «Язык программирования (русским алфавитом)»: «фортран», «Устройство вывода информации»: «принтер», «Электронная схема, управляющая внешним устройством»: «контроллер», «Разъемы подключения внешних устройств»: «интерфейс» >questions_final =
Теперь компьютер должен выбрать случайный вопрос из базы, вывести его на экран, а ответ на вопрос представить в виде символов * (количество звездочек равно количеству букв в слове) и так же показать их игрокам
Для того, чтобы играть было интереснее, добавим ведущего, который будет приветствовать игроков и давать комментарии. Получим следующее:
# приветственное слово ведущего print(«Добро пожаловать на игру Поле чудес.n Вам предстоит ответить на вопрос и если повезет выиграть супер приз») print(«Внимание!n») # выбираем случайный вопрос question_main = random.choice(list(questions_main.keys())) # ответ на выбранный вопрос answer_main = questions_main[question_main] # создаем переменную для хранения списка звездочек star_answer = [] for i in range(len(answer_main)): star_answer.append(«*») print(«Вопрос:», question_main) print(*star_answer)
С помощью метода random.choice() мы выбираем случайный вопрос (вопросы являются ключами словаря) в словаре questions_main.
Ответ на выбранный вопрос сохраняем в переменную answer_main (в словаре questions_main находим значение по ключу question_main)
Ответ на вопрос нам показывать нельзя. Его необходимо заменить символами *.
Так как в процессе отгадывания звездочки должны заменяться буквами, необходимо хранить их в виде списка, а не в виде строки (строка — неизменяемый тип в Python).
Для этого мы создаем список star_answer, в который записываем столько звездочек, сколько букв в загаданном слове. Ну и выводим на экран вопрос и загаданное слово в виде звездочек.
Часть 3.
Так как на барабане (который вращают игроки) лишь ограниченное количество значений, реализуем его в виде списка (можно использовать кортеж)
# список возможных очков при вращении барабана scores = [100, 200, 300, 400, 500, 0, «next», «Б»]
Вы можете создать больше возможных значений, а также, к примеру, сектор ПРИЗ)))
next — переход хода к следующему игроку
Б — банкрот (все набранные очки сгорают и ход переходит к другому игроку)
Теперь реализуем процесс вращения барабана игроками, который показывал бы случайное количество баллов.
Так как игроков в нашем случае двое, то нам нужно создать две переменные для хранения набранных очков.
- score1 — очки первого игрока
- score2 — очки второго игрока
Для реализации вращения барабана и отгадывания букв нам понадобится цикл while, так как количество ходов неизвестно. Создадим переменную gameOver = False, которая будет сигнализировать об окончании игры при разгадывании слова, если изменит свое значение на True.
Также необходимо завести переменную, отслеживающую какой игрок ходит — первый или второй (player).
Если player четное — значит речь идет об Игроке-1, если нечетное — значит об Игроке-2.
Вот такой получился код данной части программы:
score1 = 0 score2 = 0 gameOver = False player = 0 break_main = False # значение изменится на True, если кто-то ошибся, называя слово целиком while not gameOver: # Слова ведущего if player % 2 == 0: print(«nИграет Игрок-1») else: print(«nИграет Игрок-2») print(«Готовы ли вы назвать слово целиком? Введите ‘да’ или нажмите любую клавишу») if input().lower() == «да»: print(«Назовите слово целиком») answer = input().lower() if answer == answer_main: print(«Поздравляю, вы ответили правильно!») print(«Ответ», answer_main) break else: print(«К сожалению, вы ошиблись.
Вы проиграли») if player % 2 == 0: print(«Победил Игрок-2») print(«Набранное количество очков», score2) break_main = True else: print(«Победил Игрок-1») print(«Набранное количество очков», score1) break_main = True break else: print(«Вращайте барабан») play_score = random.choice(scores) if play_score == «next»: print(«Ход переходит к другому игроку») player += 1 continue elif play_score == «Б»: print(«У вас банкрот. Очки сгорают, а ход переходит к другому игроку») if player % 2 == 0: score1 = 0 player += 1 continue else: score2 = 0 player += 1 continue else: print(«Вы заработали», play_score, «очков») if player % 2 == 0: score1 += play_score else: score2 += play_score print(«Назовите букву») letter = input() nxt_plr = False for i in range(len(star_answer)): if letter == answer_main[i]: nxt_plr = True star_answer[i] = letter if nxt_plr == True: print(«Вы отгадали. Откройте пожалуйста такие буквы в слове») print(*star_answer) else: player += 1 print(*star_answer) win_score = 0 if break_main == False: # если никто не ошибся, называя слово целиком if player % 2 == 0 and break_main == False: print(«Победил Игрок-1») print(«Набранное количество очков», score1) win_score = score1 else: print(«Победил Игрок-2») print(«Набранное количество очков», score2) win_score = score2
play_score — переменная, в которой храниться выпавшее значение (очки) барабана.
При вводе слов используется метод lower(), чтобы было неважно, в каком регистре пользователь вводит буквы (заглавные или строчные).
Переменная nxt_plr отвечает за то, будет ли переход хода другому игроку или нет (принимает значение False/True)
Определять, какой игрок ходит в данный момент через четность переменной player может быть не самый лучший вариант. Можете реализовать по-своему и поделиться в комментариях.
Часть 4.
Реализуем выбор призов на заработанные очки.
Создадим словарь вида: очки — приз.
- 100 — Блокнот
- 200 — Тетрадь общая
- 300 — Калькулятор
- 500 — Флешка
- 1000 — Мини плеер
- 1500 — Телефон
- 2000 — Планшет
- 2500 — Сотовый телефон
или что-то другое:)
# список возможных подарков gifts =
Теперь сделаем так, чтобы игрок видел лишь те призы, на которые ему хватает очков и мог их выбирать. При этом, выбрав приз, количество имеющихся очков должно уменьшаться.
# отсортированный список ключей словаря gifts_keys = sorted(list(gifts.keys())) my_gifts = [] if win_score == 0: print(«У вас ноль очков. Увы, вы без подарков») else: for i in range(len(gifts_keys)): if gifts_keys[i] 0: num = int(input()) print(«Вы добавили себе в корзину», gifts[gifts_keys[num — 1]]) my_gifts.append(gifts[gifts_keys[num — 1]]) win_score -= gifts_keys[num — 1] for i in range(len(gifts_keys)): if gifts_keys[i]
Часть 5.
Осталось включить в игру супер-иргу на супер-приз!
Если игрок положительно отвечает на предложение сыграть в супер игру, выбирается случайный вопрос из questions_final Далее код программы похож на описанный в Части 3. Отсутствует вращение барабана и нет противника, которому переходит ход. Финалист называет буквы (их количество подсчитывается автоматически). Далее звездочки заменяются буквами, если таковые есть в слове. Остается отгадать слово целиком или принять поражение и попрощаться с выигранными подарками.
# супер игра print(«Готовы ли вы рискнуть всем и сыграть со мной в супер игру? Да или нет?») super_yes_no = input() if super_yes_no.lower() == «да»: print(«Вы согласились сыграть в Супер игру и получить супер приз») # выбираем случайный вопрос из списка финальных вопросов question_final = random.choice(list(questions_final.keys())) print(«Финальный вопрос: «, question_final) answer_final = questions_final[question_final] star_answer = [] for i in answer_final: star_answer.append(«*») print(*star_answer) print(«Вы можете открыть в этом слове букв — «, len(star_answer) // 2 + 1) for i in range(len(star_answer) // 2 + 1): letter = input() for j in range(len(star_answer)): if answer_final[j] == letter: star_answer[i] = letter print(*star_answer) print(«Итак, ваше слово») # вводим слово целиком word = input() if word == answer_final: print(«Вы супер-человек, вы гений, вы победитель супер игры и супер-приз ваш.n И все подарки ваши») else: print(«Увы, но вы все проиграли. Но вы пытались и это достойно уважения!») else: print(«Поздравляю вас с победой. Но вы не абсолютный чемпион!») if len(my_gifts) == 0: print(«Вы ничего не забираете домой») else: print(«Вы ничего забираете домой:», *my_gifts) print(«Спасибо за участие в игре. Увидимся»)
Источник: krivaksin.ru