Kódím.cz
7

Soubory: čtení a zápis

Naučíme se jak číst a zapisovat data do souborů na disku a tím v naších programech zpracovávat větší objemy dat.

Čtení na doma: Vytvoření velmi jednoduchého chatbota

Vyzkoušíme si naprogramovat velice jednoduchého chatbota, který provozuje vysoká škola v USA. V našem jednoduchém případě zvládá odpovědět pouze na dvě otázky - otázku o školném (fees) a otázku o nabízených kurzech (course).

Verze 1

První verze umí odpovědět pouze na otázku o školném. V seznamu patterns_fees máme příklady otázek, které může uživatel položit. Pokud uživatel položí jednu z otázek ze seznamu, program zobrazí řetězec uložený v proměnné response_fees. Jinak zobrazí obecnou odpověď unknown_question_response.

patterns_fees = [
  "information about fee",
  "college fee",
  "how much is the fees",
  "fees",
]
response_fees = "The annual tuition fees for undergraduate students is $20,000. Graduate students can expect to pay $25,000 per year."
unknown_question_response = "I'm sorry, I don't have an answer for that at this time. Is there something else I can help you with?"

question = input("Please ask your question: ")
if question in patterns_fees:
    print(response_fees)
else:
    print(unknown_question_response)

Verze 2

Ve verzi 2 přibyla otázka o kurzech, které je možné na univerzitě studovat. Otázky přibyly do samostatného seznamu patterns_courses a odpovědi jsme vložili do slovníku.

patterns_fees = [
  "information about fee",
  "college fee",
  "how much is the fees",
  "fees",
]

patterns_courses = [
  "list of courses",
  "list of courses offered",
  "courses",
  "courses offered",
]

responses = {
    "fees": "The annual tuition fees for students is $20,000 per semestr.",
    "courses": "Our university offers Information Technology, Computer Engineering, Mechanical engineering, Chemical engineering, Civil engineering and extc Engineering."
} 
unknown_question_response = "I'm sorry, I don't have an answer for that at this time. Is there something else I can help you with?"

question = input("Please ask your question: ")
if question in patterns_fees:
    print(responses["fees"])
elif question in patterns_courses:
    print(responses["courses"])
else:
    print(unknown_question_response)

Verze 3

V průběhu času můžeme například sbírat otázky, kterým chatbot nerozuměl, a upravovat podle nich naše vstupní data. Abychom kvůli tomu nemuseli zasahovat do programu, můžeme si vstupní otázky vložit do souboru. Soubor obsahuje dva sloupce - pattern (vzor pro otázku) a id (podle něj dohledáme odpověď).

Soubor si můžeš stáhnout patterns.csv.

pattern id
information about fee fees
college fee fees
how much is the fees fees
fees fees
list of courses courses
list of courses offered courses
courses courses
courses offered courses
lines = []

with open('patterns.csv', encoding='utf-8') as file:
    for line in file:
        line = line.strip().split(",")
        lines.append(line)

responses = {
    "fees": "The annual tuition fees for students is $20,000 per semestr.",
    "courses": "Our university offers Information Technology, Computer Engineering, Mechanical engineering, Chemical engineering, Civil engineering and extc Engineering."
}

question = input("Please ask your question: ")
for row in lines:
    if question == row[0]:
        id = row[1]
        print(responses[id])

Verze 4

Nyní přidáme porovnání řetězců pomocí funkce. Ve funkci můžeme například provádět drobné úpravy řetězců, které zvýší naši šanci poskytnout správnou odpověď (například odstranění zbytečných mezer, otazníku atd.).

def compare_strings(user_input, pattern):
    user_input = user_input.lower()
    user_input = user_input.strip()
    user_input = user_input.replace("?", "")
    if user_input == pattern:
        return True
    else:
        return False

lines = []

with open('patterns.csv', encoding='utf-8') as file:
    for line in file:
        line = line.strip().split(",")
        lines.append(line)

responses = {
    "fees": "The annual tuition fees for students is $20,000 per semestr.",
    "courses": "Our university offers Information Technology, Computer Engineering, Mechanical engineering, Chemical engineering, Civil engineering and extc Engineering."
}

question = input("Please ask your question: ")
for row in lines:
    if compare_strings(question, row[0]):
        id = row[1]
        print(responses[id])