• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

przekierowanie pytań z kodu chatbota do pliku tekstowego

Object Storage Arubacloud
0 głosów
228 wizyt
pytanie zadane 11 lutego 2023 w Python przez Maestro_prosiak Początkujący (310 p.)

Chodzi o to aby przenieść pytania i odpowiedzi do innego pliku,  Utworzyć plik zewnętrzny z danymi i wczytać je do programu przed użyciem. 

Jak może wyglądać zapisanie pytań i odpowiedzi w oddzielnym pliku? W jaki sposób ma być importowane?  jaki format pliku txt czy może jakiś inny typu json albo CSV?

Zaznaczam że dopiero zaczynam swoją przygodę z programowaniem.

kod do którego chcę zaimplementować to rozwiązanie ( wiem że mam mały bałagan, ale staram się go uporządkować):

import random
import re
import webbrowser
from gtts import gTTS
import os
import pygame
import wikipediaapi
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

#odtwarzanie głosowe
def read_aloud(text):
    tts = gTTS(text=text, lang='pl')
    tts.save("response.mp3")
    pygame.init()
    pygame.mixer.init()
    pygame.mixer.music.load("response.mp3")
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy() == True:
        continue
    pygame.mixer.music.stop()
    pygame.quit()
    os.remove("response.mp3")

#pytania odpowiedzi
answers = {
    "jak się masz": ["Dobrze, dziękuję", "Świetnie"],
    "co robisz": ["Rozmawiam z tobą", "Odpowiadam na pytania"],
    "jakie jest twoje imię": ["mam na imię czacik", "Jestem Czacik"],
    "co tam": ["wszystko dobrze", "jest ok"],
    "mam pytanie": ["o co chodzi", "to je zadaj"],
}

#formatowanie tekstu
def preprocess_question(question):
    # usuwanie znaków zapytania i przecinków
    question = re.sub("[?,]", "", question)
    # zamiana na małe litery
    return question.lower()

#wikipedia
wiki_wiki = wikipediaapi.Wikipedia(language='pl', extract_format=wikipediaapi.ExtractFormat.WIKI)

#notatki
def create_note(title, text):
    note = title + "\n" + text
    with open(os.path.join("C:/Users/antek/Desktop/AI chatbot/notatki", title + ".txt"), "w") as f:
        f.write(note)

def open_note(title):
    with open(os.path.join("C:/Users/antek/Desktop/AI chatbot/notatki", title + ".txt"), "r") as f:
        return f.read()

#e-mail - 1
def send_email(to, subject, message):
    # Tworzenie obiektu MIMEMultipart
    msg = MIMEMultipart()
    # Dodawanie nagłówków
    msg['From'] = "mail@gmail.com"
    msg['To'] = to
    msg['Subject'] = subject
    # Dodawanie treści wiadomości
    msg.attach(MIMEText(message, 'plain'))
    # Wysyłanie wiadomości
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login("mail@gmail.com", "hasło")
    server.send_message(msg)
    server.quit()



#wikipedia - 2
def search_wikipedia(query):
    page_py = wiki_wiki.page(query)
    if page_py.exists():
        return page_py.text[0:min(len(page_py.text), 1500)]
    else:
        return "Nie znam odpowiedzi na to pytanie"

def chatbot_response(question):
    preprocessed_question = preprocess_question(question)

    # sprawdzenie, czy pytanie zaczyna się od "otworz "

    if preprocessed_question.startswith("otworz "):
        # otwieranie pliku chrome
        if preprocessed_question == "otworz chrome":
            webbrowser.open("C:/Program Files (x86)/Google/Chrome/Application/chrome.exe")
            return "Otwieranie Chrome"
        # otwieranie pliku zoom
        elif preprocessed_question == "otworz zoom":
            webbrowser.open("C:/Users/antek/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Zoom/zoom")
            return "Otwieranie Zoom"
        # otwieranie pliku "Discord"
        elif preprocessed_question == "otworz discord":
            webbrowser.open("C:/Users/antek/AppData/Local/Discord/update.exe")
            return "Otwieranie discorda"
        # otwieranie pliku minecraft
        elif preprocessed_question == "otworz minecraft":
            webbrowser.open("C:/Users/antek/AppData/Roaming/Crystal-Launcher/launcher.exe")
            return "Otwieranie minecraft"
        #otwieranie dziennika
        elif preprocessed_question == "otworz dziennik":
            webbrowser.open("https://portal.librus.pl/rodzina")
            return "Otwieranie dziennika"
        #otworz youtube
        elif preprocessed_question == "otworz youtube":
            webbrowser.open("https://youtube.com")
            return "Otwieranie youtube"
        elif preprocessed_question == "otworz youtuba":
            webbrowser.open("https://youtube.com")
            return "Otwieranie youtube"
        #facebook
        elif preprocessed_question == "otworz facebooka":
            webbrowser.open("https://facebook.com")
            return "Otwieranie facebooka"
        elif preprocessed_question == "otworz facebook":
            webbrowser.open("https://facebook.com")
            return "Otwieranie facebooka"
        else:
            return "Nieznana komenda"

    # Wyszukiwanie w google

    elif preprocessed_question.startswith("wyszukaj") or preprocessed_question.startswith("znajdź") or preprocessed_question.startswith("szukaj"  ):
        query = preprocessed_question.replace("wyszukaj", "").replace("znajdź", "").replace("szukaj", "").strip()
        webbrowser.open(f"https://www.google.com/search?q={query}")
        return f"Wyszukiwanie '{query}' w Google"

    ##################################### wikipedia ciąg dalszy

    if "wikipedia" in preprocessed_question or "wikipedii" in preprocessed_question:
        query = preprocessed_question.replace("wikipedia", "").replace("wikipedii", "").strip()
        response = search_wikipedia(query)
        return response

#mail ciąg dalszy

    elif preprocessed_question == "wyślij maila" or preprocessed_question == "mail" or preprocessed_question == "e-mail" or preprocessed_question == "wyślij e-mail":
        read_aloud("Rozpoczynanie funkcji wysyłania e-maila. Podaj adres e-mail odbiorcy:")
        recipient_email = input("Podaj adres e-mail odbiorcy: ")
        read_aloud("Podaj temat e-maila:")
        subject = input("Podaj temat e-maila: ")
        read_aloud("Podaj treść e-maila:")
        message = input("Podaj treść e-maila: ")
        send_email(recipient_email, subject, message)
        return "Wysłano e-mail"

#notatka ciąg dalszy

    if question.startswith("utwórz notatkę") or question.startswith("zrób notatkę") or question.startswith("notatka"):
        title = input("Podaj tytuł notatki: ")
        text = input("Podaj treść notatki: ")
        create_note(title, text)
        return "Notatka została utworzona"
    elif question.startswith("otwórz notatkę") or question.startswith("pokaż notatkę") or question.startswith("uruchom notatkę"):
        title = input("Podaj tytuł notatki: ")
        text = open_note(title)
        return text

#pytania i odpowiedzi 2

    elif preprocessed_question in answers:
        # losowe wybranie odpowiedzi z dostępnych
        return random.choice(answers[preprocessed_question])
    else:
        return "Nie znam odpowiedzi na to pytanie"

while True:
    question = input("Pytanie: ")
    response = chatbot_response(question)
    print("Odpowiedź: ", response)
    read_aloud(response)

while True:
    question = input("Pytanie: ")
    response = chatbot_response(question)
    print("Odpowiedź: ", response)

 

1 odpowiedź

+2 głosów
odpowiedź 11 lutego 2023 przez reaktywny Nałogowiec (41,050 p.)
wybrane 11 lutego 2023 przez Maestro_prosiak
 
Najlepsza

Wczytanie, zapisanie do pliku jest bajecznie proste - poradzisz sobie (zresztą widzę, że masz w create_note i open_note). Nie wiem dokładnie jak to ma działać, nie rozumiem całej idei, ale być może przyda się jedna z poniższych podpowiedzi:

- skoro używasz słownika, to może zapisuj do JSON-a; Nie wiem czy tu zwykły plik tekstowy będzie wygodny w użyciu.

- zapoznaj się z uproszczoną "bazą" o nazwie pickle (standardowa biblioteka py) - może się przydać, a użycie jest wyjątkowo proste

- możesz też wykorzystać prawdziwą (ale nadal łatwą w użyciu) bazę SQL - SQLite.

Skąd wiesz, że pytanie będzie w formie: np. "jakie jest twoje imię", a nie "jak masz na imię?" lub jeszcze innej?

Przydałoby się tutaj zastosowanie NLP, najbardziej przyjazna w Pythonie jest biblioteka SpaCy (jest wsparcie polskiego języka).

Polish · spaCy Models Documentation

https://spacy.io/models/pl

SpaCy po polsku – wprowadzenie | Data Science
http://gatak.pl/2020/12/26/spacy-po-polsku-wprowadzenie/

 

 

komentarz 11 lutego 2023 przez Maestro_prosiak Początkujący (310 p.)
dzięki za odpowiedź, nie pomyślałem żeby użyć tego typu bibliotek
komentarz 11 lutego 2023 przez Maestro_prosiak Początkujący (310 p.)
niestety używając biblioteki spacy muszę przebudować strukturę całego "asystenta"
komentarz 11 lutego 2023 przez reaktywny Nałogowiec (41,050 p.)
Trochę zmian będzie, ale poćwiczysz sobie.
komentarz 11 lutego 2023 przez Maestro_prosiak Początkujący (310 p.)
tak naprawdę to zaczynam od początku a tamto wywalam do kosza. moim zdaniem może być lepsze użycie nltk
komentarz 11 lutego 2023 przez reaktywny Nałogowiec (41,050 p.)
edycja 11 lutego 2023 przez reaktywny
NLTK nie znam, ale też jest dość popularne.

Tu są ciekawe linki -> https://github.com/ksopyla/awesome-nlp-polish
komentarz 11 lutego 2023 przez Maestro_prosiak Początkujący (310 p.)
udało mi się wprowadzić inną opcję czyli wyszukiwanie po słowach kluczowych . dzięki za pomoc

Podobne pytania

0 głosów
1 odpowiedź 132 wizyt
pytanie zadane 25 lipca 2020 w Python przez Bish0p Obywatel (1,940 p.)
0 głosów
1 odpowiedź 164 wizyt
pytanie zadane 27 sierpnia 2020 w C i C++ przez Bish0p Obywatel (1,940 p.)

92,579 zapytań

141,431 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...