From 9d22a14bd5dd929ddddc1d94ad0ca38356290cb6 Mon Sep 17 00:00:00 2001 From: Martin Breuss Date: Mon, 20 Apr 2026 12:47:17 +0000 Subject: [PATCH 1/2] Update chatterbot materials for ChatterBot 1.2.13 Syncs the chatterbot/ folder with the revised tutorial (post 2122), including the new LLM integration step with Ollama. - requirements.txt: bump to ChatterBot 1.2.13 + modern spaCy/SQLAlchemy stack and add ollama 0.6.1 so step 6 works out of the box - chat.txt: update sample WhatsApp export dates to 2026 to match the tutorial - cleaner.py: refresh docstring/comment example dates - source_code_step_2/bot.py: reorder imports and format trainer.train() calls to match the updated tutorial listing - source_code_step_5: extract training from bot.py into a dedicated trainer.py - source_code_step_6/: new folder showing the Ollama hybrid configuration (BestMatch + OllamaLogicAdapter with llama3.2) - source_code_final/: mirror of step 6 with the Ollama-enabled bot.py - Regenerate db.sqlite3 in every step folder under ChatterBot 1.2.13, and drop the stale -shm / -wal sidecar files - README: document the trainer.py split, the step 6 Ollama setup, and the additional `spacy download en_core_web_sm` step Co-Authored-By: Claude Opus 4.7 (1M context) --- chatterbot/README.md | 49 ++-- chatterbot/requirements.txt | 65 ++++- chatterbot/source_code_final/bot.py | 23 +- chatterbot/source_code_final/chat.txt | 278 +++++++++---------- chatterbot/source_code_final/cleaner.py | 4 +- chatterbot/source_code_final/db.sqlite3 | Bin 380928 -> 73728 bytes chatterbot/source_code_final/db.sqlite3-shm | Bin 32768 -> 0 bytes chatterbot/source_code_final/db.sqlite3-wal | 0 chatterbot/source_code_final/trainer.py | 10 + chatterbot/source_code_step_1/db.sqlite3 | Bin 20480 -> 28672 bytes chatterbot/source_code_step_1/db.sqlite3-shm | Bin 32768 -> 0 bytes chatterbot/source_code_step_1/db.sqlite3-wal | 0 chatterbot/source_code_step_2/bot.py | 13 +- chatterbot/source_code_step_2/db.sqlite3 | Bin 20480 -> 28672 bytes chatterbot/source_code_step_2/db.sqlite3-shm | Bin 32768 -> 0 bytes chatterbot/source_code_step_2/db.sqlite3-wal | 0 chatterbot/source_code_step_3/bot.py | 13 +- chatterbot/source_code_step_3/chat.txt | 278 +++++++++---------- chatterbot/source_code_step_3/db.sqlite3 | Bin 20480 -> 28672 bytes chatterbot/source_code_step_3/db.sqlite3-shm | Bin 32768 -> 0 bytes chatterbot/source_code_step_3/db.sqlite3-wal | 0 chatterbot/source_code_step_4/bot.py | 13 +- chatterbot/source_code_step_4/chat.txt | 278 +++++++++---------- chatterbot/source_code_step_4/cleaner.py | 4 +- chatterbot/source_code_step_4/db.sqlite3 | Bin 20480 -> 28672 bytes chatterbot/source_code_step_4/db.sqlite3-shm | Bin 32768 -> 0 bytes chatterbot/source_code_step_4/db.sqlite3-wal | 0 chatterbot/source_code_step_5/bot.py | 9 - chatterbot/source_code_step_5/chat.txt | 278 +++++++++---------- chatterbot/source_code_step_5/cleaner.py | 4 +- chatterbot/source_code_step_5/db.sqlite3 | Bin 114688 -> 73728 bytes chatterbot/source_code_step_5/db.sqlite3-shm | Bin 32768 -> 0 bytes chatterbot/source_code_step_5/db.sqlite3-wal | 0 chatterbot/source_code_step_5/trainer.py | 10 + chatterbot/source_code_step_6/bot.py | 23 ++ chatterbot/source_code_step_6/chat.txt | 139 ++++++++++ chatterbot/source_code_step_6/cleaner.py | 57 ++++ chatterbot/source_code_step_6/trainer.py | 10 + 38 files changed, 934 insertions(+), 624 deletions(-) delete mode 100644 chatterbot/source_code_final/db.sqlite3-shm delete mode 100644 chatterbot/source_code_final/db.sqlite3-wal create mode 100644 chatterbot/source_code_final/trainer.py delete mode 100644 chatterbot/source_code_step_1/db.sqlite3-shm delete mode 100644 chatterbot/source_code_step_1/db.sqlite3-wal delete mode 100644 chatterbot/source_code_step_2/db.sqlite3-shm delete mode 100644 chatterbot/source_code_step_2/db.sqlite3-wal delete mode 100644 chatterbot/source_code_step_3/db.sqlite3-shm delete mode 100644 chatterbot/source_code_step_3/db.sqlite3-wal delete mode 100644 chatterbot/source_code_step_4/db.sqlite3-shm delete mode 100644 chatterbot/source_code_step_4/db.sqlite3-wal delete mode 100644 chatterbot/source_code_step_5/db.sqlite3-shm delete mode 100644 chatterbot/source_code_step_5/db.sqlite3-wal create mode 100644 chatterbot/source_code_step_5/trainer.py create mode 100644 chatterbot/source_code_step_6/bot.py create mode 100644 chatterbot/source_code_step_6/chat.txt create mode 100644 chatterbot/source_code_step_6/cleaner.py create mode 100644 chatterbot/source_code_step_6/trainer.py diff --git a/chatterbot/README.md b/chatterbot/README.md index 52c32dcd49..86ba33a432 100644 --- a/chatterbot/README.md +++ b/chatterbot/README.md @@ -8,36 +8,53 @@ Create and activate a [virtual environment](https://realpython.com/python-virtua $ python -m venv venv $ source venv/bin/activate (venv) $ python -m pip install -r requirements.txt +(venv) $ python -m spacy download en_core_web_sm ``` -Then you can navigate into the folder `source_code_final/` and train and start the interactive command-line interface chatbot by running `bot.py`: +Starting in `source_code_step_5/`, training is handled by a dedicated script, `trainer.py`, that reads from `chat.txt` and populates `db.sqlite3`. The interactive chatbot lives in `bot.py`: ```sh (venv) $ cd source_code_final +(venv) $ python trainer.py # (optional) retrain from chat.txt (venv) $ python bot.py ``` +A pretrained `db.sqlite3` is included in each step folder, so you can run `bot.py` right away without retraining. + After training, you'll see an interactive prompt that you can chat with: ```text > hi -🪴 Welcome, friend 🤗 -> thanks for the green welcome -🪴 I let you -> you let me be here? -🪴 It's a monsters! -> did you mean monstera? -🪴 The leafs that she had are getting dryer and dryer. But she’s also growing plenty of new ones -> who? -🪴 Do raindrops touch their leaves? -> very philosophical! -🪴 Lol -> ;) -🪴 I don't grow any crop at home -> no crops in pots -🪴 Ah, gotcha! +🪴 Hi! How's your day going so far? +> Do you talk to your plants? +🪴 I do! +> What do they like to hear? +🪴 Motivational speeches +> Do plants need sunlight? +🪴 Yes, most plants need sunlight to undergo photosynthesis, +which is how they make their own food. How's your indoor garden doing? ``` The bot will learn from the replies you give and improve its accuracy. You can quit the interactive prompt by typing any of the `exit_conditions` defined in `bot.py`. +## Folder Structure + You'll find the code for each step of the tutorial in a separate folder. The folders also include a SQLite database that contains the different phases of training at each step. Because of this, you can inspect the project at different stages and notice how it evolves when you add more data and interactions. + +- `source_code_step_1/` — minimal chatbot with no training +- `source_code_step_2/` — adds `ListTrainer` with a couple of sample exchanges +- `source_code_step_3/` — includes the WhatsApp `chat.txt` export +- `source_code_step_4/` — adds `cleaner.py` for preprocessing the chat export +- `source_code_step_5/` — splits training into `trainer.py` which trains on the cleaned chat data +- `source_code_step_6/` — adds a local LLM via `OllamaLogicAdapter` (requires Ollama) +- `source_code_final/` — same as step 6 + +## Using the Ollama integration (step 6 and final) + +Step 6 and the `source_code_final/` folder use ChatterBot's experimental [Ollama](https://ollama.com/) integration. To try it, [install Ollama](https://realpython.com/ollama/) on your system and pull a small model: + +```sh +$ ollama pull llama3.2:latest +``` + +Then run `bot.py` as usual. If you don't want to use Ollama, remove the `OllamaLogicAdapter` entry from the `logic_adapters` list in `bot.py`. diff --git a/chatterbot/requirements.txt b/chatterbot/requirements.txt index e34959c77e..413ba695f0 100644 --- a/chatterbot/requirements.txt +++ b/chatterbot/requirements.txt @@ -1,15 +1,50 @@ -ChatterBot==1.0.4 -chatterbot-corpus==1.2.0 -click==8.1.3 -joblib==1.1.0 -mathparse==0.1.2 -nltk==3.7 -Pint==0.19.2 -pymongo==3.12.3 -python-dateutil==2.7.5 -pytz==2022.2.1 -PyYAML==3.13 -regex==2022.9.11 -six==1.16.0 -SQLAlchemy==1.2.19 -tqdm==4.64.1 +annotated-doc==0.0.4 +annotated-types==0.7.0 +anyio==4.13.0 +blis==1.3.3 +catalogue==2.0.10 +certifi==2026.2.25 +charset-normalizer==3.4.7 +chatterbot==1.2.13 +click==8.3.2 +cloudpathlib==0.23.0 +confection==1.3.3 +cymem==2.0.13 +h11==0.16.0 +httpcore==1.0.9 +httpx==0.28.1 +idna==3.11 +jinja2==3.1.6 +markdown-it-py==4.0.0 +markupsafe==3.0.3 +mathparse==0.2.8 +mdurl==0.1.2 +murmurhash==1.0.15 +numpy==2.4.4 +ollama==0.6.1 +packaging==26.1 +preshed==3.0.13 +pydantic==2.13.2 +pydantic-core==2.46.2 +pygments==2.20.0 +python-dateutil==2.9.0.post0 +requests==2.33.1 +rich==15.0.0 +setuptools==82.0.1 +shellingham==1.5.4 +six==1.17.0 +smart-open==7.6.0 +spacy==3.8.13 +spacy-legacy==3.0.12 +spacy-loggers==1.0.5 +sqlalchemy==2.0.49 +srsly==2.5.3 +thinc==8.3.13 +tqdm==4.67.3 +typer==0.24.1 +typing-extensions==4.15.0 +typing-inspection==0.4.2 +urllib3==2.6.3 +wasabi==1.1.3 +weasel==1.0.0 +wrapt==2.1.2 diff --git a/chatterbot/source_code_final/bot.py b/chatterbot/source_code_final/bot.py index 7fbe51d93a..dd24be4e5b 100644 --- a/chatterbot/source_code_final/bot.py +++ b/chatterbot/source_code_final/bot.py @@ -1,15 +1,18 @@ -from chatterbot.trainers import ListTrainer -from cleaner import clean_corpus - from chatterbot import ChatBot -CORPUS_FILE = "chat.txt" - -chatbot = ChatBot("Chatpot") - -trainer = ListTrainer(chatbot) -cleaned_corpus = clean_corpus(CORPUS_FILE) -trainer.train(cleaned_corpus) +chatbot = ChatBot( + "Chatpot", + logic_adapters=[ + { + "import_path": "chatterbot.logic.BestMatch", + }, + { + "import_path": "chatterbot.logic.OllamaLogicAdapter", + "model": "llama3.2:latest", + "host": "http://localhost:11434", + }, + ], +) exit_conditions = (":q", "quit", "exit") while True: diff --git a/chatterbot/source_code_final/chat.txt b/chatterbot/source_code_final/chat.txt index b585737e91..dd585cc378 100644 --- a/chatterbot/source_code_final/chat.txt +++ b/chatterbot/source_code_final/chat.txt @@ -1,139 +1,139 @@ -9/15/22, 14:50 - Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them. Tap to learn more. -9/15/22, 14:49 - Philipp: Hi Martin, Philipp here! -9/15/22, 14:50 - Philipp: I’m ready to talk about plants! -9/15/22, 14:51 - Martin: Oh that's great! -9/15/22, 14:52 - Martin: I've been waiting for a good convo about plants for a long time -9/15/22, 14:52 - Philipp: We all have. -9/15/22, 14:52 - Martin: Did you know they need water to grow? -9/15/22, 14:52 - Philipp: I always thought that love and music was more than enough -9/15/22, 14:53 - Philipp: But water makes sense -9/15/22, 14:53 - Martin: Do you talk to your plants? -9/15/22, 14:53 - Philipp: I do! -9/15/22, 14:53 - Philipp: Some of them even have names -9/15/22, 14:54 - Martin: What do they like to hear? -9/15/22, 14:54 - Philipp: Motivational speeches -9/15/22, 14:54 - Philipp: Or stories about plants that made it and are living outside now -9/15/22, 14:54 - Martin: Oohhh 🥲 -9/15/22, 14:54 - Martin: Are you training them for independence? -9/15/22, 14:56 - Philipp: Yeah! I want them to be strong and take care of themselves at some point -9/15/22, 14:56 - Martin: That's heroic! -9/15/22, 14:57 - Martin: Sounds like you're a great plant parent -9/15/22, 14:57 - Philipp: Do you have any plant care pro tips? -9/15/22, 14:58 - Martin: Ahh, idk i just leave them be... -9/15/22, 14:58 - Martin: They are doing ok but not great -9/15/22, 14:58 - Philipp: So they are independent already! -9/15/22, 14:58 - Martin: I guess one tip would be to get plants that don't need much :P -9/15/22, 14:58 - Philipp: Like plastic plants, for example? -9/15/22, 14:59 - Martin: Haha, yes! Get independent plants! -9/15/22, 14:59 - Martin: Plastic plants are the cream of the crop -9/15/22, 14:59 - Martin: I haven't graduated to plastic plants yet -9/15/22, 14:59 - Philipp: Cream of the crop? -9/15/22, 15:00 - Philipp: I don't know what this means -9/15/22, 15:01 - Martin: Crop is a cultivated plant that is grown on a large scale commercially, especially a cereal, fruit, or vegetable -9/15/22, 15:01 - Martin: The cream must be the best of the best -9/15/22, 15:01 - Martin: Or maybe just all of it blended together? ;p -9/15/22, 15:02 - Martin: I don't grow any crop at home -9/15/22, 15:02 - Martin: And no cream, in case you wondered -9/15/22, 15:03 - Philipp: Ah, gotcha! -9/15/22, 15:03 - Philipp: Let me show you something! -9/15/22, 15:04 - Martin: I let you -9/15/22, 15:06 - Philipp: -9/15/22, 15:06 - Martin: It's a monsters! -9/15/22, 15:07 - Martin: Monstera* (auto correct...) -9/15/22, 15:07 - Philipp: I’m currently running an experiment of keeping my Monstera on the balcony -9/15/22, 15:07 - Martin: A monstera and a fluffy little monster -9/15/22, 15:07 - Philipp: Haha, yeah, hard to tell which is which -9/15/22, 15:07 - Martin: How has it been going with the monstera on the balcony? -9/15/22, 15:08 - Martin: I've tried that too over the summer -9/15/22, 15:08 - Philipp: Pretty bad -9/15/22, 15:08 - Martin: Oh really? -9/15/22, 15:08 - Martin: What happened? -9/15/22, 15:08 - Philipp: Yeah -9/15/22, 15:08 - Philipp: I mean … it’s weird. -9/15/22, 15:08 - Philipp: The leafs that she had are getting dryer and dryer. But she’s also growing plenty of new ones -9/15/22, 15:09 - Philipp: It‘s like she’s changing her summer jacket to a winter jacket -9/15/22, 15:13 - Martin: Yeah something similar happened to ours -9/15/22, 15:14 - Martin: It had thrips over the winter, so we needed to get rid of them -9/15/22, 15:14 - Philipp: Ah, thrips are those tiny little beasts that eat your plants, aren't they? -9/15/22, 15:15 - Martin: Thought that the balcony time would help get rid of them -9/15/22, 15:15 - Martin: Yeah they are horrible, really cute and tiny and deadly -9/15/22, 15:16 - Martin: Most of the monstera's leaves died, but now there are new ones coming -9/15/22, 15:16 - Martin: I think it's the amount of light, they need different leaves for stronger sunlight -9/15/22, 15:17 - Philipp: Do you have any other approaches to get rid of tiny monsters? -9/15/22, 15:17 - Philipp: (Except putting the plant on the balcony) -9/15/22, 15:17 - Martin: Tiny monstera's? -9/15/22, 15:17 - Philipp: Handling tiny monsters to grow big monsteras -9/15/22, 15:17 - Martin: Haha -9/15/22, 15:17 - Martin: Well, no. Just the balcony. This worked best -9/15/22, 15:18 - Martin: We tried applying soapy water -9/15/22, 15:18 - Martin: Which is a suggestion -9/15/22, 15:18 - Martin: And it keeps them a bit in check, but you can't get totally rid of them -9/15/22, 15:18 - Philipp: 10/10 thrips don't like this simple trick 😅 -9/15/22, 15:18 - Philipp: Oh, okay -9/15/22, 15:18 - Philipp: 8/10 thrips don't like this simple trick -9/15/22, 15:18 - Martin: I really hope they're gone now 🤞 -9/15/22, 15:18 - Martin: Lol -9/15/22, 15:19 - Martin: It's depressing when lil monstera keeps making new leaves for them just to get infected 😢 -9/15/22, 15:19 - Philipp: Yeah, nature can be harsh -9/15/22, 15:20 - Martin: Ah yes, it's a slightly strange rendering of nature though, if it's about potted plants -9/15/22, 15:20 - Martin: I feel like they could handle it better out in the wild -9/15/22, 15:21 - Martin: Good that you're making yours strong enough to leave eventually! -9/15/22, 15:22 - Philipp: For the other plants, my words help them to grow -9/15/22, 15:22 - Philipp: Inside and outside -9/15/22, 15:22 - Martin: What are the magic words? -9/15/22, 15:23 - Martin: Wait, do you make *all* plants grow??? -9/15/22, 15:24 - Philipp: Grow hastily, grow healthily, grow heartily 🪄✨🌱 -9/15/22, 15:24 - Philipp: Do you not make all your plants grow? -9/15/22, 15:24 - Martin: :)) -9/15/22, 15:25 - Martin: What do you consider 'your plants'? -9/15/22, 15:28 - Philipp: Oh, now I understand! -9/15/22, 15:29 - Philipp: I only considered the plants that live in my apartment (or my balcony) as the plant-spell-receiving plants -9/15/22, 15:29 - Philipp: But maybe they share the words? -9/15/22, 15:30 - Martin: Do raindrops touch their leaves? -9/15/22, 15:30 - Martin: I'm sure they chat with the other plants if they can -9/15/22, 15:31 - Philipp: Yeah, I heard that trees communicate in the woods with their roots -9/15/22, 15:31 - Philipp: But thinking about that makes me feel bad that my plants are potted 😬 -9/15/22, 15:31 - Martin: 😢 -9/15/22, 15:32 - Martin: Yeah... -9/15/22, 15:32 - Martin: The trees use mushrooms mycelium in the ground that's hooked to their roots to chat -9/15/22, 15:32 - Martin: Pretty cool 😎 -9/15/22, 15:33 - Martin: So i also have a Pilea -9/15/22, 15:33 - Martin: And some basil plants -9/15/22, 15:33 - Philipp: Do you have a photo of the Pilea? I don't know how it looks -9/15/22, 15:34 - Martin: And a peace lily -9/15/22, 15:34 - Martin: https://en.m.wikipedia.org/wiki/Pilea_peperomioides -9/15/22, 15:47 - Philipp: Oh, the Pilea looks cool! -9/15/22, 15:47 - Philipp: The leaves are like small umbrellas -9/15/22, 15:48 - Philipp: Did you actually manage to keep a supermarket basil alive or did you grow it yourself? -9/15/22, 16:28 - Martin: that's quite a story! -9/15/22, 16:28 - Martin: my dad had a flowering basil last year and put the seeds from that one plant into seeding pots -9/15/22, 16:29 - Martin: so many of them came up that he had about two dining room tables full of basil plants, each in their own pots... -9/15/22, 16:29 - Martin: i got three of them, so they are second gen supermarket basils with lots of siblings :) -9/15/22, 20:58 - Philipp: I always thought supermarket basil was meant to die after a few days -9/15/22, 20:58 - Philipp: But it seems it was my subpar care -9/15/22, 20:59 - Philipp: Congratulations to your basil dynasty! -9/16/22, 06:11 - Martin: Thanks! -9/16/22, 06:12 - Martin: Kudos go mostly to my dad -9/16/22, 06:12 - Martin: But you can bring them through winter -9/16/22, 06:12 - Martin: If there's no thrip infestation... -9/16/22, 06:34 - Martin: -9/16/22, 06:34 - Martin: -9/16/22, 06:35 - Martin: -9/16/22, 06:35 - Martin: Morning view of most of my house plants -9/16/22, 09:44 - Philipp: Fingers crossed 🤞 -9/16/22, 09:45 - Philipp: Are the ones on top avocados? -9/16/22, 09:53 - Martin: Yes, there are a couple of seedlings that wanted to live -9/16/22, 09:54 - Martin: Two more on the balcony of a similar size -9/16/22, 09:54 - Martin: And another seed that's one it's way 🤷‍♂️ -9/16/22, 09:55 - Philipp: I heard that it’s not easy to raise an Avodaco! -9/16/22, 09:55 - Martin: I haven't even heard of Avodacos! -9/16/22, 09:56 - Philipp: Wait, weren’t we talking about avocados? -9/16/22, 09:56 - Martin: Ah yes avocados 🥑! -9/16/22, 09:57 - Martin: I was just joking, riffing based on your typo 😝 -9/16/22, 09:57 - Philipp: Ooh! I was wondering why there was a red line under that word -9/16/22, 09:57 - Martin: Do you think there are avotacos? 🥑🌮 -9/16/22, 09:57 - Philipp: But I like that term, too -9/16/22, 09:58 - Philipp: 😂 -9/16/22, 09:58 - Philipp: If this is not a common term, then I want to make it common! -9/16/22, 09:59 - Martin: Maybe growing an avotaco plant would be a plant symbiosis between an avocado tree and some corn plants? -9/16/22, 10:19 - Philipp: Sounds like the perfect experiment! +1/15/26, 14:50 - Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them. Tap to learn more. +1/15/26, 14:49 - Philipp: Hi Martin, Philipp here! +1/15/26, 14:50 - Philipp: I’m ready to talk about plants! +1/15/26, 14:51 - Martin: Oh that's great! +1/15/26, 14:52 - Martin: I've been waiting for a good convo about plants for a long time +1/15/26, 14:52 - Philipp: We all have. +1/15/26, 14:52 - Martin: Did you know they need water to grow? +1/15/26, 14:52 - Philipp: I always thought that love and music was more than enough +1/15/26, 14:53 - Philipp: But water makes sense +1/15/26, 14:53 - Martin: Do you talk to your plants? +1/15/26, 14:53 - Philipp: I do! +1/15/26, 14:53 - Philipp: Some of them even have names +1/15/26, 14:54 - Martin: What do they like to hear? +1/15/26, 14:54 - Philipp: Motivational speeches +1/15/26, 14:54 - Philipp: Or stories about plants that made it and are living outside now +1/15/26, 14:54 - Martin: Oohhh 🥲 +1/15/26, 14:54 - Martin: Are you training them for independence? +1/15/26, 14:56 - Philipp: Yeah! I want them to be strong and take care of themselves at some point +1/15/26, 14:56 - Martin: That's heroic! +1/15/26, 14:57 - Martin: Sounds like you're a great plant parent +1/15/26, 14:57 - Philipp: Do you have any plant care pro tips? +1/15/26, 14:58 - Martin: Ahh, idk i just leave them be... +1/15/26, 14:58 - Martin: They are doing ok but not great +1/15/26, 14:58 - Philipp: So they are independent already! +1/15/26, 14:58 - Martin: I guess one tip would be to get plants that don't need much :P +1/15/26, 14:58 - Philipp: Like plastic plants, for example? +1/15/26, 14:59 - Martin: Haha, yes! Get independent plants! +1/15/26, 14:59 - Martin: Plastic plants are the cream of the crop +1/15/26, 14:59 - Martin: I haven't graduated to plastic plants yet +1/15/26, 14:59 - Philipp: Cream of the crop? +1/15/26, 15:00 - Philipp: I don't know what this means +1/15/26, 15:01 - Martin: Crop is a cultivated plant that is grown on a large scale commercially, especially a cereal, fruit, or vegetable +1/15/26, 15:01 - Martin: The cream must be the best of the best +1/15/26, 15:01 - Martin: Or maybe just all of it blended together? ;p +1/15/26, 15:02 - Martin: I don't grow any crop at home +1/15/26, 15:02 - Martin: And no cream, in case you wondered +1/15/26, 15:03 - Philipp: Ah, gotcha! +1/15/26, 15:03 - Philipp: Let me show you something! +1/15/26, 15:04 - Martin: I let you +1/15/26, 15:06 - Philipp: +1/15/26, 15:06 - Martin: It's a monsters! +1/15/26, 15:07 - Martin: Monstera* (auto correct...) +1/15/26, 15:07 - Philipp: I’m currently running an experiment of keeping my Monstera on the balcony +1/15/26, 15:07 - Martin: A monstera and a fluffy little monster +1/15/26, 15:07 - Philipp: Haha, yeah, hard to tell which is which +1/15/26, 15:07 - Martin: How has it been going with the monstera on the balcony? +1/15/26, 15:08 - Martin: I've tried that too over the summer +1/15/26, 15:08 - Philipp: Pretty bad +1/15/26, 15:08 - Martin: Oh really? +1/15/26, 15:08 - Martin: What happened? +1/15/26, 15:08 - Philipp: Yeah +1/15/26, 15:08 - Philipp: I mean … it’s weird. +1/15/26, 15:08 - Philipp: The leafs that she had are getting dryer and dryer. But she’s also growing plenty of new ones +1/15/26, 15:09 - Philipp: It‘s like she’s changing her summer jacket to a winter jacket +1/15/26, 15:13 - Martin: Yeah something similar happened to ours +1/15/26, 15:14 - Martin: It had thrips over the winter, so we needed to get rid of them +1/15/26, 15:14 - Philipp: Ah, thrips are those tiny little beasts that eat your plants, aren't they? +1/15/26, 15:15 - Martin: Thought that the balcony time would help get rid of them +1/15/26, 15:15 - Martin: Yeah they are horrible, really cute and tiny and deadly +1/15/26, 15:16 - Martin: Most of the monstera's leaves died, but now there are new ones coming +1/15/26, 15:16 - Martin: I think it's the amount of light, they need different leaves for stronger sunlight +1/15/26, 15:17 - Philipp: Do you have any other approaches to get rid of tiny monsters? +1/15/26, 15:17 - Philipp: (Except putting the plant on the balcony) +1/15/26, 15:17 - Martin: Tiny monstera's? +1/15/26, 15:17 - Philipp: Handling tiny monsters to grow big monsteras +1/15/26, 15:17 - Martin: Haha +1/15/26, 15:17 - Martin: Well, no. Just the balcony. This worked best +1/15/26, 15:18 - Martin: We tried applying soapy water +1/15/26, 15:18 - Martin: Which is a suggestion +1/15/26, 15:18 - Martin: And it keeps them a bit in check, but you can't get totally rid of them +1/15/26, 15:18 - Philipp: 10/10 thrips don't like this simple trick 😅 +1/15/26, 15:18 - Philipp: Oh, okay +1/15/26, 15:18 - Philipp: 8/10 thrips don't like this simple trick +1/15/26, 15:18 - Martin: I really hope they're gone now 🤞 +1/15/26, 15:18 - Martin: Lol +1/15/26, 15:19 - Martin: It's depressing when lil monstera keeps making new leaves for them just to get infected 😢 +1/15/26, 15:19 - Philipp: Yeah, nature can be harsh +1/15/26, 15:20 - Martin: Ah yes, it's a slightly strange rendering of nature though, if it's about potted plants +1/15/26, 15:20 - Martin: I feel like they could handle it better out in the wild +1/15/26, 15:21 - Martin: Good that you're making yours strong enough to leave eventually! +1/15/26, 15:22 - Philipp: For the other plants, my words help them to grow +1/15/26, 15:22 - Philipp: Inside and outside +1/15/26, 15:22 - Martin: What are the magic words? +1/15/26, 15:23 - Martin: Wait, do you make *all* plants grow??? +1/15/26, 15:24 - Philipp: Grow hastily, grow healthily, grow heartily 🪄✨🌱 +1/15/26, 15:24 - Philipp: Do you not make all your plants grow? +1/15/26, 15:24 - Martin: :)) +1/15/26, 15:25 - Martin: What do you consider 'your plants'? +1/15/26, 15:28 - Philipp: Oh, now I understand! +1/15/26, 15:29 - Philipp: I only considered the plants that live in my apartment (or my balcony) as the plant-spell-receiving plants +1/15/26, 15:29 - Philipp: But maybe they share the words? +1/15/26, 15:30 - Martin: Do raindrops touch their leaves? +1/15/26, 15:30 - Martin: I'm sure they chat with the other plants if they can +1/15/26, 15:31 - Philipp: Yeah, I heard that trees communicate in the woods with their roots +1/15/26, 15:31 - Philipp: But thinking about that makes me feel bad that my plants are potted 😬 +1/15/26, 15:31 - Martin: 😢 +1/15/26, 15:32 - Martin: Yeah... +1/15/26, 15:32 - Martin: The trees use mushrooms mycelium in the ground that's hooked to their roots to chat +1/15/26, 15:32 - Martin: Pretty cool 😎 +1/15/26, 15:33 - Martin: So i also have a Pilea +1/15/26, 15:33 - Martin: And some basil plants +1/15/26, 15:33 - Philipp: Do you have a photo of the Pilea? I don't know how it looks +1/15/26, 15:34 - Martin: And a peace lily +1/15/26, 15:34 - Martin: https://en.m.wikipedia.org/wiki/Pilea_peperomioides +1/15/26, 15:47 - Philipp: Oh, the Pilea looks cool! +1/15/26, 15:47 - Philipp: The leaves are like small umbrellas +1/15/26, 15:48 - Philipp: Did you actually manage to keep a supermarket basil alive or did you grow it yourself? +1/15/26, 16:28 - Martin: that's quite a story! +1/15/26, 16:28 - Martin: my dad had a flowering basil last year and put the seeds from that one plant into seeding pots +1/15/26, 16:29 - Martin: so many of them came up that he had about two dining room tables full of basil plants, each in their own pots... +1/15/26, 16:29 - Martin: i got three of them, so they are second gen supermarket basils with lots of siblings :) +1/15/26, 20:58 - Philipp: I always thought supermarket basil was meant to die after a few days +1/15/26, 20:58 - Philipp: But it seems it was my subpar care +1/15/26, 20:59 - Philipp: Congratulations to your basil dynasty! +1/16/26, 06:11 - Martin: Thanks! +1/16/26, 06:12 - Martin: Kudos go mostly to my dad +1/16/26, 06:12 - Martin: But you can bring them through winter +1/16/26, 06:12 - Martin: If there's no thrip infestation... +1/16/26, 06:34 - Martin: +1/16/26, 06:34 - Martin: +1/16/26, 06:35 - Martin: +1/16/26, 06:35 - Martin: Morning view of most of my house plants +1/16/26, 09:44 - Philipp: Fingers crossed 🤞 +1/16/26, 09:45 - Philipp: Are the ones on top avocados? +1/16/26, 09:53 - Martin: Yes, there are a couple of seedlings that wanted to live +1/16/26, 09:54 - Martin: Two more on the balcony of a similar size +1/16/26, 09:54 - Martin: And another seed that's one it's way 🤷‍♂️ +1/16/26, 09:55 - Philipp: I heard that it’s not easy to raise an Avodaco! +1/16/26, 09:55 - Martin: I haven't even heard of Avodacos! +1/16/26, 09:56 - Philipp: Wait, weren’t we talking about avocados? +1/16/26, 09:56 - Martin: Ah yes avocados 🥑! +1/16/26, 09:57 - Martin: I was just joking, riffing based on your typo 😝 +1/16/26, 09:57 - Philipp: Ooh! I was wondering why there was a red line under that word +1/16/26, 09:57 - Martin: Do you think there are avotacos? 🥑🌮 +1/16/26, 09:57 - Philipp: But I like that term, too +1/16/26, 09:58 - Philipp: 😂 +1/16/26, 09:58 - Philipp: If this is not a common term, then I want to make it common! +1/16/26, 09:59 - Martin: Maybe growing an avotaco plant would be a plant symbiosis between an avocado tree and some corn plants? +1/16/26, 10:19 - Philipp: Sounds like the perfect experiment! diff --git a/chatterbot/source_code_final/cleaner.py b/chatterbot/source_code_final/cleaner.py index 4654709549..72c534a5ba 100644 --- a/chatterbot/source_code_final/cleaner.py +++ b/chatterbot/source_code_final/cleaner.py @@ -15,7 +15,7 @@ def remove_chat_metadata(chat_export_file): date time username message --------------------------------------- - 8/26/22, 17:47 - Jane Doe: Message text + 1/16/26, 06:34 - Jane Doe: Message text This function removes all the metadata up to the text of each message. @@ -25,7 +25,7 @@ def remove_chat_metadata(chat_export_file): Returns: tuple: The text of each message in the conversation """ - date_time = r"(\d+\/\d+\/\d+,\s\d+:\d+)" # e.g. "8/26/22, 17:47" + date_time = r"(\d+\/\d+\/\d+,\s\d+:\d+)" # e.g. "1/16/26, 06:34" dash_whitespace = r"\s-\s" # " - " username = r"([\w\s]+)" # e.g. "Jane Doe" metadata_end = r":\s" # ": " diff --git a/chatterbot/source_code_final/db.sqlite3 b/chatterbot/source_code_final/db.sqlite3 index 7bacb6d6c64ea93d9f603d4acc3b979a2a41dcf1..5476f3160b71c018e949478d22cec39ee9f53dec 100644 GIT binary patch literal 73728 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 literal 380928 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 diff --git a/chatterbot/source_code_final/db.sqlite3-shm b/chatterbot/source_code_final/db.sqlite3-shm deleted file mode 100644 index c44e58660531d1c6aaa2fba392717ccbfd0766db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI)u?fOJ6b4}3z%nD)+!pR&bo{#$?(Ys0d;V_SNyeR|- z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyFc%nqd7aPg2@oJa wfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1pY1X1|xATwg3PC diff --git a/chatterbot/source_code_final/db.sqlite3-wal b/chatterbot/source_code_final/db.sqlite3-wal deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/chatterbot/source_code_final/trainer.py b/chatterbot/source_code_final/trainer.py new file mode 100644 index 0000000000..6b95736f43 --- /dev/null +++ b/chatterbot/source_code_final/trainer.py @@ -0,0 +1,10 @@ +from chatterbot import ChatBot +from chatterbot.trainers import ListTrainer +from cleaner import clean_corpus + +CORPUS_FILE = "chat.txt" + +chatbot = ChatBot("Chatpot") +trainer = ListTrainer(chatbot) +cleaned_corpus = clean_corpus(CORPUS_FILE) +trainer.train(cleaned_corpus) diff --git a/chatterbot/source_code_step_1/db.sqlite3 b/chatterbot/source_code_step_1/db.sqlite3 index e6e77e67b380c7da8f25450a203fee36766ca5bd..a70be118d2bc60e130cca3d66d52086e9cf104c1 100644 GIT binary patch delta 432 zcmZozz}WDBae_QAI|Bl+PSi0I>k{GR|G~h`b5rw5*qwu1 z9Yb6dJpEi;BNXsyQSkRufNN9Gz%(`kXs%`wE4#QM&6g*>q#ytQtHX#_ delta 895 zcmZ{j&yJH&6o+r^{E^zrZH=+IFlFMxF&4t*a-p!P*l98@rm5Ig2N~11J zCoyg(8WwJSg4uNCBj~P6cfP@7R=V^SVg}ohgb>2{o$osbIR2SC{*wDxh1=lb$bYJ7 z*Pk6i^c!py&jEUYmhfBgd{HjFE5>KV9~__GtyHVI53k}SRAP)Owa9%F34P0M9$NOk zLh1dQP~fJn6Arz>`m-4GuD0Lo*>{$M{L{ z=CurlwYnYepa=0OD#g#)mAS<4(T&9^>I=6D@C2YG`iy$0#DC>OUgrV)4o}!1A)K29 z4wNCZ_TXJ_q{xaQ%7%!EfT>BTiFJu+L?-HM&x!6$g;~&e=|^Uh-35N6ava#JK#S!s zp10fPEV#50Q4Lk|M)WENDvVfWM0Y+O`6F%*c~%P z_8*yyx;9qIpc=uN6S|3@BLwrYGl?3_t<+E4@JsY$lNypy*Hx@!qDe9%_b|@^@eZ`u zZr7_0x@NE{UsGaz=d3X`bb^z;)UTu-mH&FEk|rCJrsWy9m}5!yDFF6zRvTVh^WQO4 TiOQOR30(bVC3Y^j(l7J}EiU9A diff --git a/chatterbot/source_code_step_1/db.sqlite3-shm b/chatterbot/source_code_step_1/db.sqlite3-shm deleted file mode 100644 index fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeIuAr62r3H9QNz3jfGKrU10y|C2 zmLB#%t6th;4?R|uy2sx71==3=)~f0k=r`zIDpgev^*G=q5y^637ism66f$GaJkQK; z97_Xccc*GP27PFEk93FTxG63W;NGK@$($k5*CcbhjctHRH5P$##AOHafKmY6)*{tMfimw(zX1PA8gANFR!$Uc;{wR^Ib%w*DO zZy0B5Y~MB9>!{Umx1HfmQHUJr=d}BjaLbZ?67TH8u-tT30JOb%iEb zm{ctFP9U6EndUj~OVs=L(B0iP^kc{N>J4`7W!xWvd!zC8;1avzOx@UR2ZoN6!7%KQ;^ z+6L{|4&65n?N9o(L)~)b)UCQ&?y#cM)lJK^4zlTNVKKeDm`&46ww%kAGx?=LI$O$@ zS$7{~uk|DCiqXZ@8JUwL?y6m0lzh3c7mntOGjcpG zaUU6nP5a1LpbxvIVYTS9Z@>S>{fCG5%V%|OPVC^gsQFT%l+N8V+ve?1G#>8{msMZT zsaPsJ4qhK`wwy^Xt>jknG1H?**=nw;y%6SS+r1y!=&o{Z54}p8p^E zI-?2!2tWV=5P$##AOHafKmY;|cnt;E^ZyZYz>#0bBl0Ktn*2x($iL)=*Kn$s5(FRs z0SG_<0uX=z1Rwwb2teRv3rq@g{PU+jB5w<;{HO;y#J7YZf9Vqz;jj?r+h%AmSa4i0 zVPvpCNQg(u&A%BynFB=5$ApijgKmY;|fB*y_009U<00Iyg g5*W9`j|2sY7yG{%2(xl%THq)$ literal 20480 zcmeI2&u`mg7{{HgTj#V+T0#j-s`geDYO6J=U;j)piOx&iEuzi3EZH<97I~?+SR{5y zT()r=hyxd{J92;{{{R>6<2H$Z0*M3MIP$zUNnI!DIB}>Rt8s0=&#(9MeBU>++Ix5R z9N#8SynfH}iOel<$s~7!5RT)L@VN+|;c)>jW`;NLI}y2_cA4Y~4{i&Yzqy(DzqrgN znK!~~xWEGmAOR$R1dsp{Kmter2_OL^@P80^*_@fpUAva}%JQwpUE8;wwyeRxYdeLU8A|zAZu%< zg0wyN3%frE=#GNP(#BN#z6}5mTktlz1LzyoeRE{GUTM~WSEI$A-fI~92SG`W+v?kc zBhMY!E#Dg@iB)`t)hI!%_9H0VbFEQCRh(M(LA|eft?oE2@fQI1dsp{Kmter2_OL^fCP{L5Lfc^dd3V+CD-eg{7nwf?4&*^?zPjkYr!gs=_ zLVEu7{Qmrvx!>k~n0qw0mHH#~OX}NHmH(ap37qgi0!RP}AOR$R1dsp{m`Gsv3eTy6 zU@Qr%5A1H+>)D&+N#C*EL-ObMKfaPgNy>|*Je3L6$|@~Wt)Lc*vP|2a*M02yu*1LpXc_Wh`g{`^EOF!tw;Qh zO&~0JYPxQ}u?mtPi)tRTd#b{gfNhKX^hL}m4bJ&@ny zxkaciE39^$F-x&nC~2ywDqtB&y1B%2*=&#$2H@0+OTl`OY6U%C`ph_y$q>d9wOEb_AnCc3ob;eo}dWlq( z^k<;XwE;Ok+Ws;P8oR!1fDYcKv0Ck*?0^QDHb8_d z_0Y2-F#RnX95i@}$=SixqD=Saf!xZn0rQ@;Qd!aA!aXyTu4tls8<=g)F@!-)?DlLY z=)7D`g^OS%z6jK^s+OrA!QnZevUIuXi zGSJGHu0mUorKspd@sv19v!OWXxHyJhB83G++m;(_Lv0YrCfjYc%}ZfMIyqyo{fR}T zD3!*2BhzhOEhfVb&;_^)mN diff --git a/chatterbot/source_code_step_2/db.sqlite3-shm b/chatterbot/source_code_step_2/db.sqlite3-shm deleted file mode 100644 index fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeIuAr62r3 -9/15/22, 15:06 - Martin: It's a monsters! -9/15/22, 15:07 - Martin: Monstera* (auto correct...) -9/15/22, 15:07 - Philipp: I’m currently running an experiment of keeping my Monstera on the balcony -9/15/22, 15:07 - Martin: A monstera and a fluffy little monster -9/15/22, 15:07 - Philipp: Haha, yeah, hard to tell which is which -9/15/22, 15:07 - Martin: How has it been going with the monstera on the balcony? -9/15/22, 15:08 - Martin: I've tried that too over the summer -9/15/22, 15:08 - Philipp: Pretty bad -9/15/22, 15:08 - Martin: Oh really? -9/15/22, 15:08 - Martin: What happened? -9/15/22, 15:08 - Philipp: Yeah -9/15/22, 15:08 - Philipp: I mean … it’s weird. -9/15/22, 15:08 - Philipp: The leafs that she had are getting dryer and dryer. But she’s also growing plenty of new ones -9/15/22, 15:09 - Philipp: It‘s like she’s changing her summer jacket to a winter jacket -9/15/22, 15:13 - Martin: Yeah something similar happened to ours -9/15/22, 15:14 - Martin: It had thrips over the winter, so we needed to get rid of them -9/15/22, 15:14 - Philipp: Ah, thrips are those tiny little beasts that eat your plants, aren't they? -9/15/22, 15:15 - Martin: Thought that the balcony time would help get rid of them -9/15/22, 15:15 - Martin: Yeah they are horrible, really cute and tiny and deadly -9/15/22, 15:16 - Martin: Most of the monstera's leaves died, but now there are new ones coming -9/15/22, 15:16 - Martin: I think it's the amount of light, they need different leaves for stronger sunlight -9/15/22, 15:17 - Philipp: Do you have any other approaches to get rid of tiny monsters? -9/15/22, 15:17 - Philipp: (Except putting the plant on the balcony) -9/15/22, 15:17 - Martin: Tiny monstera's? -9/15/22, 15:17 - Philipp: Handling tiny monsters to grow big monsteras -9/15/22, 15:17 - Martin: Haha -9/15/22, 15:17 - Martin: Well, no. Just the balcony. This worked best -9/15/22, 15:18 - Martin: We tried applying soapy water -9/15/22, 15:18 - Martin: Which is a suggestion -9/15/22, 15:18 - Martin: And it keeps them a bit in check, but you can't get totally rid of them -9/15/22, 15:18 - Philipp: 10/10 thrips don't like this simple trick 😅 -9/15/22, 15:18 - Philipp: Oh, okay -9/15/22, 15:18 - Philipp: 8/10 thrips don't like this simple trick -9/15/22, 15:18 - Martin: I really hope they're gone now 🤞 -9/15/22, 15:18 - Martin: Lol -9/15/22, 15:19 - Martin: It's depressing when lil monstera keeps making new leaves for them just to get infected 😢 -9/15/22, 15:19 - Philipp: Yeah, nature can be harsh -9/15/22, 15:20 - Martin: Ah yes, it's a slightly strange rendering of nature though, if it's about potted plants -9/15/22, 15:20 - Martin: I feel like they could handle it better out in the wild -9/15/22, 15:21 - Martin: Good that you're making yours strong enough to leave eventually! -9/15/22, 15:22 - Philipp: For the other plants, my words help them to grow -9/15/22, 15:22 - Philipp: Inside and outside -9/15/22, 15:22 - Martin: What are the magic words? -9/15/22, 15:23 - Martin: Wait, do you make *all* plants grow??? -9/15/22, 15:24 - Philipp: Grow hastily, grow healthily, grow heartily 🪄✨🌱 -9/15/22, 15:24 - Philipp: Do you not make all your plants grow? -9/15/22, 15:24 - Martin: :)) -9/15/22, 15:25 - Martin: What do you consider 'your plants'? -9/15/22, 15:28 - Philipp: Oh, now I understand! -9/15/22, 15:29 - Philipp: I only considered the plants that live in my apartment (or my balcony) as the plant-spell-receiving plants -9/15/22, 15:29 - Philipp: But maybe they share the words? -9/15/22, 15:30 - Martin: Do raindrops touch their leaves? -9/15/22, 15:30 - Martin: I'm sure they chat with the other plants if they can -9/15/22, 15:31 - Philipp: Yeah, I heard that trees communicate in the woods with their roots -9/15/22, 15:31 - Philipp: But thinking about that makes me feel bad that my plants are potted 😬 -9/15/22, 15:31 - Martin: 😢 -9/15/22, 15:32 - Martin: Yeah... -9/15/22, 15:32 - Martin: The trees use mushrooms mycelium in the ground that's hooked to their roots to chat -9/15/22, 15:32 - Martin: Pretty cool 😎 -9/15/22, 15:33 - Martin: So i also have a Pilea -9/15/22, 15:33 - Martin: And some basil plants -9/15/22, 15:33 - Philipp: Do you have a photo of the Pilea? I don't know how it looks -9/15/22, 15:34 - Martin: And a peace lily -9/15/22, 15:34 - Martin: https://en.m.wikipedia.org/wiki/Pilea_peperomioides -9/15/22, 15:47 - Philipp: Oh, the Pilea looks cool! -9/15/22, 15:47 - Philipp: The leaves are like small umbrellas -9/15/22, 15:48 - Philipp: Did you actually manage to keep a supermarket basil alive or did you grow it yourself? -9/15/22, 16:28 - Martin: that's quite a story! -9/15/22, 16:28 - Martin: my dad had a flowering basil last year and put the seeds from that one plant into seeding pots -9/15/22, 16:29 - Martin: so many of them came up that he had about two dining room tables full of basil plants, each in their own pots... -9/15/22, 16:29 - Martin: i got three of them, so they are second gen supermarket basils with lots of siblings :) -9/15/22, 20:58 - Philipp: I always thought supermarket basil was meant to die after a few days -9/15/22, 20:58 - Philipp: But it seems it was my subpar care -9/15/22, 20:59 - Philipp: Congratulations to your basil dynasty! -9/16/22, 06:11 - Martin: Thanks! -9/16/22, 06:12 - Martin: Kudos go mostly to my dad -9/16/22, 06:12 - Martin: But you can bring them through winter -9/16/22, 06:12 - Martin: If there's no thrip infestation... -9/16/22, 06:34 - Martin: -9/16/22, 06:34 - Martin: -9/16/22, 06:35 - Martin: -9/16/22, 06:35 - Martin: Morning view of most of my house plants -9/16/22, 09:44 - Philipp: Fingers crossed 🤞 -9/16/22, 09:45 - Philipp: Are the ones on top avocados? -9/16/22, 09:53 - Martin: Yes, there are a couple of seedlings that wanted to live -9/16/22, 09:54 - Martin: Two more on the balcony of a similar size -9/16/22, 09:54 - Martin: And another seed that's one it's way 🤷‍♂️ -9/16/22, 09:55 - Philipp: I heard that it’s not easy to raise an Avodaco! -9/16/22, 09:55 - Martin: I haven't even heard of Avodacos! -9/16/22, 09:56 - Philipp: Wait, weren’t we talking about avocados? -9/16/22, 09:56 - Martin: Ah yes avocados 🥑! -9/16/22, 09:57 - Martin: I was just joking, riffing based on your typo 😝 -9/16/22, 09:57 - Philipp: Ooh! I was wondering why there was a red line under that word -9/16/22, 09:57 - Martin: Do you think there are avotacos? 🥑🌮 -9/16/22, 09:57 - Philipp: But I like that term, too -9/16/22, 09:58 - Philipp: 😂 -9/16/22, 09:58 - Philipp: If this is not a common term, then I want to make it common! -9/16/22, 09:59 - Martin: Maybe growing an avotaco plant would be a plant symbiosis between an avocado tree and some corn plants? -9/16/22, 10:19 - Philipp: Sounds like the perfect experiment! +1/15/26, 14:50 - Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them. Tap to learn more. +1/15/26, 14:49 - Philipp: Hi Martin, Philipp here! +1/15/26, 14:50 - Philipp: I’m ready to talk about plants! +1/15/26, 14:51 - Martin: Oh that's great! +1/15/26, 14:52 - Martin: I've been waiting for a good convo about plants for a long time +1/15/26, 14:52 - Philipp: We all have. +1/15/26, 14:52 - Martin: Did you know they need water to grow? +1/15/26, 14:52 - Philipp: I always thought that love and music was more than enough +1/15/26, 14:53 - Philipp: But water makes sense +1/15/26, 14:53 - Martin: Do you talk to your plants? +1/15/26, 14:53 - Philipp: I do! +1/15/26, 14:53 - Philipp: Some of them even have names +1/15/26, 14:54 - Martin: What do they like to hear? +1/15/26, 14:54 - Philipp: Motivational speeches +1/15/26, 14:54 - Philipp: Or stories about plants that made it and are living outside now +1/15/26, 14:54 - Martin: Oohhh 🥲 +1/15/26, 14:54 - Martin: Are you training them for independence? +1/15/26, 14:56 - Philipp: Yeah! I want them to be strong and take care of themselves at some point +1/15/26, 14:56 - Martin: That's heroic! +1/15/26, 14:57 - Martin: Sounds like you're a great plant parent +1/15/26, 14:57 - Philipp: Do you have any plant care pro tips? +1/15/26, 14:58 - Martin: Ahh, idk i just leave them be... +1/15/26, 14:58 - Martin: They are doing ok but not great +1/15/26, 14:58 - Philipp: So they are independent already! +1/15/26, 14:58 - Martin: I guess one tip would be to get plants that don't need much :P +1/15/26, 14:58 - Philipp: Like plastic plants, for example? +1/15/26, 14:59 - Martin: Haha, yes! Get independent plants! +1/15/26, 14:59 - Martin: Plastic plants are the cream of the crop +1/15/26, 14:59 - Martin: I haven't graduated to plastic plants yet +1/15/26, 14:59 - Philipp: Cream of the crop? +1/15/26, 15:00 - Philipp: I don't know what this means +1/15/26, 15:01 - Martin: Crop is a cultivated plant that is grown on a large scale commercially, especially a cereal, fruit, or vegetable +1/15/26, 15:01 - Martin: The cream must be the best of the best +1/15/26, 15:01 - Martin: Or maybe just all of it blended together? ;p +1/15/26, 15:02 - Martin: I don't grow any crop at home +1/15/26, 15:02 - Martin: And no cream, in case you wondered +1/15/26, 15:03 - Philipp: Ah, gotcha! +1/15/26, 15:03 - Philipp: Let me show you something! +1/15/26, 15:04 - Martin: I let you +1/15/26, 15:06 - Philipp: +1/15/26, 15:06 - Martin: It's a monsters! +1/15/26, 15:07 - Martin: Monstera* (auto correct...) +1/15/26, 15:07 - Philipp: I’m currently running an experiment of keeping my Monstera on the balcony +1/15/26, 15:07 - Martin: A monstera and a fluffy little monster +1/15/26, 15:07 - Philipp: Haha, yeah, hard to tell which is which +1/15/26, 15:07 - Martin: How has it been going with the monstera on the balcony? +1/15/26, 15:08 - Martin: I've tried that too over the summer +1/15/26, 15:08 - Philipp: Pretty bad +1/15/26, 15:08 - Martin: Oh really? +1/15/26, 15:08 - Martin: What happened? +1/15/26, 15:08 - Philipp: Yeah +1/15/26, 15:08 - Philipp: I mean … it’s weird. +1/15/26, 15:08 - Philipp: The leafs that she had are getting dryer and dryer. But she’s also growing plenty of new ones +1/15/26, 15:09 - Philipp: It‘s like she’s changing her summer jacket to a winter jacket +1/15/26, 15:13 - Martin: Yeah something similar happened to ours +1/15/26, 15:14 - Martin: It had thrips over the winter, so we needed to get rid of them +1/15/26, 15:14 - Philipp: Ah, thrips are those tiny little beasts that eat your plants, aren't they? +1/15/26, 15:15 - Martin: Thought that the balcony time would help get rid of them +1/15/26, 15:15 - Martin: Yeah they are horrible, really cute and tiny and deadly +1/15/26, 15:16 - Martin: Most of the monstera's leaves died, but now there are new ones coming +1/15/26, 15:16 - Martin: I think it's the amount of light, they need different leaves for stronger sunlight +1/15/26, 15:17 - Philipp: Do you have any other approaches to get rid of tiny monsters? +1/15/26, 15:17 - Philipp: (Except putting the plant on the balcony) +1/15/26, 15:17 - Martin: Tiny monstera's? +1/15/26, 15:17 - Philipp: Handling tiny monsters to grow big monsteras +1/15/26, 15:17 - Martin: Haha +1/15/26, 15:17 - Martin: Well, no. Just the balcony. This worked best +1/15/26, 15:18 - Martin: We tried applying soapy water +1/15/26, 15:18 - Martin: Which is a suggestion +1/15/26, 15:18 - Martin: And it keeps them a bit in check, but you can't get totally rid of them +1/15/26, 15:18 - Philipp: 10/10 thrips don't like this simple trick 😅 +1/15/26, 15:18 - Philipp: Oh, okay +1/15/26, 15:18 - Philipp: 8/10 thrips don't like this simple trick +1/15/26, 15:18 - Martin: I really hope they're gone now 🤞 +1/15/26, 15:18 - Martin: Lol +1/15/26, 15:19 - Martin: It's depressing when lil monstera keeps making new leaves for them just to get infected 😢 +1/15/26, 15:19 - Philipp: Yeah, nature can be harsh +1/15/26, 15:20 - Martin: Ah yes, it's a slightly strange rendering of nature though, if it's about potted plants +1/15/26, 15:20 - Martin: I feel like they could handle it better out in the wild +1/15/26, 15:21 - Martin: Good that you're making yours strong enough to leave eventually! +1/15/26, 15:22 - Philipp: For the other plants, my words help them to grow +1/15/26, 15:22 - Philipp: Inside and outside +1/15/26, 15:22 - Martin: What are the magic words? +1/15/26, 15:23 - Martin: Wait, do you make *all* plants grow??? +1/15/26, 15:24 - Philipp: Grow hastily, grow healthily, grow heartily 🪄✨🌱 +1/15/26, 15:24 - Philipp: Do you not make all your plants grow? +1/15/26, 15:24 - Martin: :)) +1/15/26, 15:25 - Martin: What do you consider 'your plants'? +1/15/26, 15:28 - Philipp: Oh, now I understand! +1/15/26, 15:29 - Philipp: I only considered the plants that live in my apartment (or my balcony) as the plant-spell-receiving plants +1/15/26, 15:29 - Philipp: But maybe they share the words? +1/15/26, 15:30 - Martin: Do raindrops touch their leaves? +1/15/26, 15:30 - Martin: I'm sure they chat with the other plants if they can +1/15/26, 15:31 - Philipp: Yeah, I heard that trees communicate in the woods with their roots +1/15/26, 15:31 - Philipp: But thinking about that makes me feel bad that my plants are potted 😬 +1/15/26, 15:31 - Martin: 😢 +1/15/26, 15:32 - Martin: Yeah... +1/15/26, 15:32 - Martin: The trees use mushrooms mycelium in the ground that's hooked to their roots to chat +1/15/26, 15:32 - Martin: Pretty cool 😎 +1/15/26, 15:33 - Martin: So i also have a Pilea +1/15/26, 15:33 - Martin: And some basil plants +1/15/26, 15:33 - Philipp: Do you have a photo of the Pilea? I don't know how it looks +1/15/26, 15:34 - Martin: And a peace lily +1/15/26, 15:34 - Martin: https://en.m.wikipedia.org/wiki/Pilea_peperomioides +1/15/26, 15:47 - Philipp: Oh, the Pilea looks cool! +1/15/26, 15:47 - Philipp: The leaves are like small umbrellas +1/15/26, 15:48 - Philipp: Did you actually manage to keep a supermarket basil alive or did you grow it yourself? +1/15/26, 16:28 - Martin: that's quite a story! +1/15/26, 16:28 - Martin: my dad had a flowering basil last year and put the seeds from that one plant into seeding pots +1/15/26, 16:29 - Martin: so many of them came up that he had about two dining room tables full of basil plants, each in their own pots... +1/15/26, 16:29 - Martin: i got three of them, so they are second gen supermarket basils with lots of siblings :) +1/15/26, 20:58 - Philipp: I always thought supermarket basil was meant to die after a few days +1/15/26, 20:58 - Philipp: But it seems it was my subpar care +1/15/26, 20:59 - Philipp: Congratulations to your basil dynasty! +1/16/26, 06:11 - Martin: Thanks! +1/16/26, 06:12 - Martin: Kudos go mostly to my dad +1/16/26, 06:12 - Martin: But you can bring them through winter +1/16/26, 06:12 - Martin: If there's no thrip infestation... +1/16/26, 06:34 - Martin: +1/16/26, 06:34 - Martin: +1/16/26, 06:35 - Martin: +1/16/26, 06:35 - Martin: Morning view of most of my house plants +1/16/26, 09:44 - Philipp: Fingers crossed 🤞 +1/16/26, 09:45 - Philipp: Are the ones on top avocados? +1/16/26, 09:53 - Martin: Yes, there are a couple of seedlings that wanted to live +1/16/26, 09:54 - Martin: Two more on the balcony of a similar size +1/16/26, 09:54 - Martin: And another seed that's one it's way 🤷‍♂️ +1/16/26, 09:55 - Philipp: I heard that it’s not easy to raise an Avodaco! +1/16/26, 09:55 - Martin: I haven't even heard of Avodacos! +1/16/26, 09:56 - Philipp: Wait, weren’t we talking about avocados? +1/16/26, 09:56 - Martin: Ah yes avocados 🥑! +1/16/26, 09:57 - Martin: I was just joking, riffing based on your typo 😝 +1/16/26, 09:57 - Philipp: Ooh! I was wondering why there was a red line under that word +1/16/26, 09:57 - Martin: Do you think there are avotacos? 🥑🌮 +1/16/26, 09:57 - Philipp: But I like that term, too +1/16/26, 09:58 - Philipp: 😂 +1/16/26, 09:58 - Philipp: If this is not a common term, then I want to make it common! +1/16/26, 09:59 - Martin: Maybe growing an avotaco plant would be a plant symbiosis between an avocado tree and some corn plants? +1/16/26, 10:19 - Philipp: Sounds like the perfect experiment! diff --git a/chatterbot/source_code_step_3/db.sqlite3 b/chatterbot/source_code_step_3/db.sqlite3 index 8cd445d9048130e4aed6a6181135f35963ceeccd..a7d3ae25ec2eecbc712171215915f1d12e77d618 100644 GIT binary patch delta 930 zcmZozz}WDBae_QAI|Bl+PSi0I>k{GR|G~h`b5rw5*qwu1 z9Yb6dJpEi;BNXsyQSkRufNN9Gz%(`kXs%`wE4#QM&6fr6otm9dePp^=`Mxw*NanPX9^LS=rbLZSj# zgS}&DgcXP%5ajP?m8jt28UisXn3+@8R@RY$mzRN{mU^fjLbe+iM=)`kn#(#03i2|9 zr{*N*=cei?q!neR=A|fnn7?GYr(cMd6_oD>@)SrAuc>AxW~Sz*9+?@L`iz`{f)EFT zxP){Wn{N_e5#V9r-@?FunEwI)7XDwruwB9*!^f=12(}v>J}ffKwv4#Kh*^@^oDr*= znOKXW;SL)#*9oRW@cVa0J#AX AfdBvi literal 20480 zcmeI2&u`mg7{{HgTj#V+T0#j-s`geDYO6J=U;j)piOx&iEuzi3EZH<97I~?+SR{5y zT()r=hyxd{J92;{{{R>6<2H$Z0*M3MIP$zUNnI!DIB}>Rt8s0=&#(9MeBU>++Ix5R z9N#8SynfH}iOel<$s~7!5RT)L@VN+|;c)>jW`;NLI}y2_cA4Y~4{i&Yzqy(DzqrgN znK!~~xWEGmAOR$R1dsp{Kmter2_OL^@P80^*_@fpUAva}%JQwpUE8;wwyeRxYdeLU8A|zAZu%< zg0wyN3%frE=#GNP(#BN#z6}5mTktlz1LzyoeRE{GUTM~WSEI$A-fI~92SG`W+v?kc zBhMY!E#Dg@iB)`t)hI!%_9H0VbFEQCRh(M(LA|eft?oE2@fQI1dsp{Kmter2_OL^fCP{L5Lfc^dd3V+CD-eg{7nwf?4&*^?zPjkYr!gs=_ zLVEu7{Qmrvx!>k~n0qw0mHH#~OX}NHmH(ap37qgi0!RP}AOR$R1dsp{m`Gsv3eTy6 zU@Qr%5A1H+>)D&+N#C*EL-ObMKfaPgNy>|*Je3L6$|@~Wt)Lc*vP|2a*M02yu*1LpXc_Wh`g{`^EOF!tw;Qh zO&~0JYPxQ}u?mtPi)tRTd#b{gfNhKX^hL}m4bJ&@ny zxkaciE39^$F-x&nC~2ywDqtB&y1B%2*=&#$2H@0+OTl`OY6U%C`ph_y$q>d9wOEb_AnCc3ob;eo}dWlq( z^k<;XwE;Ok+Ws;P8oR!1fDYcKv0Ck*?0^QDHb8_d z_0Y2-F#RnX95i@}$=SixqD=Saf!xZn0rQ@;Qd!aA!aXyTu4tls8<=g)F@!-)?DlLY z=)7D`g^OS%z6jK^s+OrA!QnZevUIuXi zGSJGHu0mUorKspd@sv19v!OWXxHyJhB83G++m;(_Lv0YrCfjYc%}ZfMIyqyo{fR}T zD3!*2BhzhOEhfVb&;_^)mN diff --git a/chatterbot/source_code_step_3/db.sqlite3-shm b/chatterbot/source_code_step_3/db.sqlite3-shm deleted file mode 100644 index fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeIuAr62r3 -9/15/22, 15:06 - Martin: It's a monsters! -9/15/22, 15:07 - Martin: Monstera* (auto correct...) -9/15/22, 15:07 - Philipp: I’m currently running an experiment of keeping my Monstera on the balcony -9/15/22, 15:07 - Martin: A monstera and a fluffy little monster -9/15/22, 15:07 - Philipp: Haha, yeah, hard to tell which is which -9/15/22, 15:07 - Martin: How has it been going with the monstera on the balcony? -9/15/22, 15:08 - Martin: I've tried that too over the summer -9/15/22, 15:08 - Philipp: Pretty bad -9/15/22, 15:08 - Martin: Oh really? -9/15/22, 15:08 - Martin: What happened? -9/15/22, 15:08 - Philipp: Yeah -9/15/22, 15:08 - Philipp: I mean … it’s weird. -9/15/22, 15:08 - Philipp: The leafs that she had are getting dryer and dryer. But she’s also growing plenty of new ones -9/15/22, 15:09 - Philipp: It‘s like she’s changing her summer jacket to a winter jacket -9/15/22, 15:13 - Martin: Yeah something similar happened to ours -9/15/22, 15:14 - Martin: It had thrips over the winter, so we needed to get rid of them -9/15/22, 15:14 - Philipp: Ah, thrips are those tiny little beasts that eat your plants, aren't they? -9/15/22, 15:15 - Martin: Thought that the balcony time would help get rid of them -9/15/22, 15:15 - Martin: Yeah they are horrible, really cute and tiny and deadly -9/15/22, 15:16 - Martin: Most of the monstera's leaves died, but now there are new ones coming -9/15/22, 15:16 - Martin: I think it's the amount of light, they need different leaves for stronger sunlight -9/15/22, 15:17 - Philipp: Do you have any other approaches to get rid of tiny monsters? -9/15/22, 15:17 - Philipp: (Except putting the plant on the balcony) -9/15/22, 15:17 - Martin: Tiny monstera's? -9/15/22, 15:17 - Philipp: Handling tiny monsters to grow big monsteras -9/15/22, 15:17 - Martin: Haha -9/15/22, 15:17 - Martin: Well, no. Just the balcony. This worked best -9/15/22, 15:18 - Martin: We tried applying soapy water -9/15/22, 15:18 - Martin: Which is a suggestion -9/15/22, 15:18 - Martin: And it keeps them a bit in check, but you can't get totally rid of them -9/15/22, 15:18 - Philipp: 10/10 thrips don't like this simple trick 😅 -9/15/22, 15:18 - Philipp: Oh, okay -9/15/22, 15:18 - Philipp: 8/10 thrips don't like this simple trick -9/15/22, 15:18 - Martin: I really hope they're gone now 🤞 -9/15/22, 15:18 - Martin: Lol -9/15/22, 15:19 - Martin: It's depressing when lil monstera keeps making new leaves for them just to get infected 😢 -9/15/22, 15:19 - Philipp: Yeah, nature can be harsh -9/15/22, 15:20 - Martin: Ah yes, it's a slightly strange rendering of nature though, if it's about potted plants -9/15/22, 15:20 - Martin: I feel like they could handle it better out in the wild -9/15/22, 15:21 - Martin: Good that you're making yours strong enough to leave eventually! -9/15/22, 15:22 - Philipp: For the other plants, my words help them to grow -9/15/22, 15:22 - Philipp: Inside and outside -9/15/22, 15:22 - Martin: What are the magic words? -9/15/22, 15:23 - Martin: Wait, do you make *all* plants grow??? -9/15/22, 15:24 - Philipp: Grow hastily, grow healthily, grow heartily 🪄✨🌱 -9/15/22, 15:24 - Philipp: Do you not make all your plants grow? -9/15/22, 15:24 - Martin: :)) -9/15/22, 15:25 - Martin: What do you consider 'your plants'? -9/15/22, 15:28 - Philipp: Oh, now I understand! -9/15/22, 15:29 - Philipp: I only considered the plants that live in my apartment (or my balcony) as the plant-spell-receiving plants -9/15/22, 15:29 - Philipp: But maybe they share the words? -9/15/22, 15:30 - Martin: Do raindrops touch their leaves? -9/15/22, 15:30 - Martin: I'm sure they chat with the other plants if they can -9/15/22, 15:31 - Philipp: Yeah, I heard that trees communicate in the woods with their roots -9/15/22, 15:31 - Philipp: But thinking about that makes me feel bad that my plants are potted 😬 -9/15/22, 15:31 - Martin: 😢 -9/15/22, 15:32 - Martin: Yeah... -9/15/22, 15:32 - Martin: The trees use mushrooms mycelium in the ground that's hooked to their roots to chat -9/15/22, 15:32 - Martin: Pretty cool 😎 -9/15/22, 15:33 - Martin: So i also have a Pilea -9/15/22, 15:33 - Martin: And some basil plants -9/15/22, 15:33 - Philipp: Do you have a photo of the Pilea? I don't know how it looks -9/15/22, 15:34 - Martin: And a peace lily -9/15/22, 15:34 - Martin: https://en.m.wikipedia.org/wiki/Pilea_peperomioides -9/15/22, 15:47 - Philipp: Oh, the Pilea looks cool! -9/15/22, 15:47 - Philipp: The leaves are like small umbrellas -9/15/22, 15:48 - Philipp: Did you actually manage to keep a supermarket basil alive or did you grow it yourself? -9/15/22, 16:28 - Martin: that's quite a story! -9/15/22, 16:28 - Martin: my dad had a flowering basil last year and put the seeds from that one plant into seeding pots -9/15/22, 16:29 - Martin: so many of them came up that he had about two dining room tables full of basil plants, each in their own pots... -9/15/22, 16:29 - Martin: i got three of them, so they are second gen supermarket basils with lots of siblings :) -9/15/22, 20:58 - Philipp: I always thought supermarket basil was meant to die after a few days -9/15/22, 20:58 - Philipp: But it seems it was my subpar care -9/15/22, 20:59 - Philipp: Congratulations to your basil dynasty! -9/16/22, 06:11 - Martin: Thanks! -9/16/22, 06:12 - Martin: Kudos go mostly to my dad -9/16/22, 06:12 - Martin: But you can bring them through winter -9/16/22, 06:12 - Martin: If there's no thrip infestation... -9/16/22, 06:34 - Martin: -9/16/22, 06:34 - Martin: -9/16/22, 06:35 - Martin: -9/16/22, 06:35 - Martin: Morning view of most of my house plants -9/16/22, 09:44 - Philipp: Fingers crossed 🤞 -9/16/22, 09:45 - Philipp: Are the ones on top avocados? -9/16/22, 09:53 - Martin: Yes, there are a couple of seedlings that wanted to live -9/16/22, 09:54 - Martin: Two more on the balcony of a similar size -9/16/22, 09:54 - Martin: And another seed that's one it's way 🤷‍♂️ -9/16/22, 09:55 - Philipp: I heard that it’s not easy to raise an Avodaco! -9/16/22, 09:55 - Martin: I haven't even heard of Avodacos! -9/16/22, 09:56 - Philipp: Wait, weren’t we talking about avocados? -9/16/22, 09:56 - Martin: Ah yes avocados 🥑! -9/16/22, 09:57 - Martin: I was just joking, riffing based on your typo 😝 -9/16/22, 09:57 - Philipp: Ooh! I was wondering why there was a red line under that word -9/16/22, 09:57 - Martin: Do you think there are avotacos? 🥑🌮 -9/16/22, 09:57 - Philipp: But I like that term, too -9/16/22, 09:58 - Philipp: 😂 -9/16/22, 09:58 - Philipp: If this is not a common term, then I want to make it common! -9/16/22, 09:59 - Martin: Maybe growing an avotaco plant would be a plant symbiosis between an avocado tree and some corn plants? -9/16/22, 10:19 - Philipp: Sounds like the perfect experiment! +1/15/26, 14:50 - Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them. Tap to learn more. +1/15/26, 14:49 - Philipp: Hi Martin, Philipp here! +1/15/26, 14:50 - Philipp: I’m ready to talk about plants! +1/15/26, 14:51 - Martin: Oh that's great! +1/15/26, 14:52 - Martin: I've been waiting for a good convo about plants for a long time +1/15/26, 14:52 - Philipp: We all have. +1/15/26, 14:52 - Martin: Did you know they need water to grow? +1/15/26, 14:52 - Philipp: I always thought that love and music was more than enough +1/15/26, 14:53 - Philipp: But water makes sense +1/15/26, 14:53 - Martin: Do you talk to your plants? +1/15/26, 14:53 - Philipp: I do! +1/15/26, 14:53 - Philipp: Some of them even have names +1/15/26, 14:54 - Martin: What do they like to hear? +1/15/26, 14:54 - Philipp: Motivational speeches +1/15/26, 14:54 - Philipp: Or stories about plants that made it and are living outside now +1/15/26, 14:54 - Martin: Oohhh 🥲 +1/15/26, 14:54 - Martin: Are you training them for independence? +1/15/26, 14:56 - Philipp: Yeah! I want them to be strong and take care of themselves at some point +1/15/26, 14:56 - Martin: That's heroic! +1/15/26, 14:57 - Martin: Sounds like you're a great plant parent +1/15/26, 14:57 - Philipp: Do you have any plant care pro tips? +1/15/26, 14:58 - Martin: Ahh, idk i just leave them be... +1/15/26, 14:58 - Martin: They are doing ok but not great +1/15/26, 14:58 - Philipp: So they are independent already! +1/15/26, 14:58 - Martin: I guess one tip would be to get plants that don't need much :P +1/15/26, 14:58 - Philipp: Like plastic plants, for example? +1/15/26, 14:59 - Martin: Haha, yes! Get independent plants! +1/15/26, 14:59 - Martin: Plastic plants are the cream of the crop +1/15/26, 14:59 - Martin: I haven't graduated to plastic plants yet +1/15/26, 14:59 - Philipp: Cream of the crop? +1/15/26, 15:00 - Philipp: I don't know what this means +1/15/26, 15:01 - Martin: Crop is a cultivated plant that is grown on a large scale commercially, especially a cereal, fruit, or vegetable +1/15/26, 15:01 - Martin: The cream must be the best of the best +1/15/26, 15:01 - Martin: Or maybe just all of it blended together? ;p +1/15/26, 15:02 - Martin: I don't grow any crop at home +1/15/26, 15:02 - Martin: And no cream, in case you wondered +1/15/26, 15:03 - Philipp: Ah, gotcha! +1/15/26, 15:03 - Philipp: Let me show you something! +1/15/26, 15:04 - Martin: I let you +1/15/26, 15:06 - Philipp: +1/15/26, 15:06 - Martin: It's a monsters! +1/15/26, 15:07 - Martin: Monstera* (auto correct...) +1/15/26, 15:07 - Philipp: I’m currently running an experiment of keeping my Monstera on the balcony +1/15/26, 15:07 - Martin: A monstera and a fluffy little monster +1/15/26, 15:07 - Philipp: Haha, yeah, hard to tell which is which +1/15/26, 15:07 - Martin: How has it been going with the monstera on the balcony? +1/15/26, 15:08 - Martin: I've tried that too over the summer +1/15/26, 15:08 - Philipp: Pretty bad +1/15/26, 15:08 - Martin: Oh really? +1/15/26, 15:08 - Martin: What happened? +1/15/26, 15:08 - Philipp: Yeah +1/15/26, 15:08 - Philipp: I mean … it’s weird. +1/15/26, 15:08 - Philipp: The leafs that she had are getting dryer and dryer. But she’s also growing plenty of new ones +1/15/26, 15:09 - Philipp: It‘s like she’s changing her summer jacket to a winter jacket +1/15/26, 15:13 - Martin: Yeah something similar happened to ours +1/15/26, 15:14 - Martin: It had thrips over the winter, so we needed to get rid of them +1/15/26, 15:14 - Philipp: Ah, thrips are those tiny little beasts that eat your plants, aren't they? +1/15/26, 15:15 - Martin: Thought that the balcony time would help get rid of them +1/15/26, 15:15 - Martin: Yeah they are horrible, really cute and tiny and deadly +1/15/26, 15:16 - Martin: Most of the monstera's leaves died, but now there are new ones coming +1/15/26, 15:16 - Martin: I think it's the amount of light, they need different leaves for stronger sunlight +1/15/26, 15:17 - Philipp: Do you have any other approaches to get rid of tiny monsters? +1/15/26, 15:17 - Philipp: (Except putting the plant on the balcony) +1/15/26, 15:17 - Martin: Tiny monstera's? +1/15/26, 15:17 - Philipp: Handling tiny monsters to grow big monsteras +1/15/26, 15:17 - Martin: Haha +1/15/26, 15:17 - Martin: Well, no. Just the balcony. This worked best +1/15/26, 15:18 - Martin: We tried applying soapy water +1/15/26, 15:18 - Martin: Which is a suggestion +1/15/26, 15:18 - Martin: And it keeps them a bit in check, but you can't get totally rid of them +1/15/26, 15:18 - Philipp: 10/10 thrips don't like this simple trick 😅 +1/15/26, 15:18 - Philipp: Oh, okay +1/15/26, 15:18 - Philipp: 8/10 thrips don't like this simple trick +1/15/26, 15:18 - Martin: I really hope they're gone now 🤞 +1/15/26, 15:18 - Martin: Lol +1/15/26, 15:19 - Martin: It's depressing when lil monstera keeps making new leaves for them just to get infected 😢 +1/15/26, 15:19 - Philipp: Yeah, nature can be harsh +1/15/26, 15:20 - Martin: Ah yes, it's a slightly strange rendering of nature though, if it's about potted plants +1/15/26, 15:20 - Martin: I feel like they could handle it better out in the wild +1/15/26, 15:21 - Martin: Good that you're making yours strong enough to leave eventually! +1/15/26, 15:22 - Philipp: For the other plants, my words help them to grow +1/15/26, 15:22 - Philipp: Inside and outside +1/15/26, 15:22 - Martin: What are the magic words? +1/15/26, 15:23 - Martin: Wait, do you make *all* plants grow??? +1/15/26, 15:24 - Philipp: Grow hastily, grow healthily, grow heartily 🪄✨🌱 +1/15/26, 15:24 - Philipp: Do you not make all your plants grow? +1/15/26, 15:24 - Martin: :)) +1/15/26, 15:25 - Martin: What do you consider 'your plants'? +1/15/26, 15:28 - Philipp: Oh, now I understand! +1/15/26, 15:29 - Philipp: I only considered the plants that live in my apartment (or my balcony) as the plant-spell-receiving plants +1/15/26, 15:29 - Philipp: But maybe they share the words? +1/15/26, 15:30 - Martin: Do raindrops touch their leaves? +1/15/26, 15:30 - Martin: I'm sure they chat with the other plants if they can +1/15/26, 15:31 - Philipp: Yeah, I heard that trees communicate in the woods with their roots +1/15/26, 15:31 - Philipp: But thinking about that makes me feel bad that my plants are potted 😬 +1/15/26, 15:31 - Martin: 😢 +1/15/26, 15:32 - Martin: Yeah... +1/15/26, 15:32 - Martin: The trees use mushrooms mycelium in the ground that's hooked to their roots to chat +1/15/26, 15:32 - Martin: Pretty cool 😎 +1/15/26, 15:33 - Martin: So i also have a Pilea +1/15/26, 15:33 - Martin: And some basil plants +1/15/26, 15:33 - Philipp: Do you have a photo of the Pilea? I don't know how it looks +1/15/26, 15:34 - Martin: And a peace lily +1/15/26, 15:34 - Martin: https://en.m.wikipedia.org/wiki/Pilea_peperomioides +1/15/26, 15:47 - Philipp: Oh, the Pilea looks cool! +1/15/26, 15:47 - Philipp: The leaves are like small umbrellas +1/15/26, 15:48 - Philipp: Did you actually manage to keep a supermarket basil alive or did you grow it yourself? +1/15/26, 16:28 - Martin: that's quite a story! +1/15/26, 16:28 - Martin: my dad had a flowering basil last year and put the seeds from that one plant into seeding pots +1/15/26, 16:29 - Martin: so many of them came up that he had about two dining room tables full of basil plants, each in their own pots... +1/15/26, 16:29 - Martin: i got three of them, so they are second gen supermarket basils with lots of siblings :) +1/15/26, 20:58 - Philipp: I always thought supermarket basil was meant to die after a few days +1/15/26, 20:58 - Philipp: But it seems it was my subpar care +1/15/26, 20:59 - Philipp: Congratulations to your basil dynasty! +1/16/26, 06:11 - Martin: Thanks! +1/16/26, 06:12 - Martin: Kudos go mostly to my dad +1/16/26, 06:12 - Martin: But you can bring them through winter +1/16/26, 06:12 - Martin: If there's no thrip infestation... +1/16/26, 06:34 - Martin: +1/16/26, 06:34 - Martin: +1/16/26, 06:35 - Martin: +1/16/26, 06:35 - Martin: Morning view of most of my house plants +1/16/26, 09:44 - Philipp: Fingers crossed 🤞 +1/16/26, 09:45 - Philipp: Are the ones on top avocados? +1/16/26, 09:53 - Martin: Yes, there are a couple of seedlings that wanted to live +1/16/26, 09:54 - Martin: Two more on the balcony of a similar size +1/16/26, 09:54 - Martin: And another seed that's one it's way 🤷‍♂️ +1/16/26, 09:55 - Philipp: I heard that it’s not easy to raise an Avodaco! +1/16/26, 09:55 - Martin: I haven't even heard of Avodacos! +1/16/26, 09:56 - Philipp: Wait, weren’t we talking about avocados? +1/16/26, 09:56 - Martin: Ah yes avocados 🥑! +1/16/26, 09:57 - Martin: I was just joking, riffing based on your typo 😝 +1/16/26, 09:57 - Philipp: Ooh! I was wondering why there was a red line under that word +1/16/26, 09:57 - Martin: Do you think there are avotacos? 🥑🌮 +1/16/26, 09:57 - Philipp: But I like that term, too +1/16/26, 09:58 - Philipp: 😂 +1/16/26, 09:58 - Philipp: If this is not a common term, then I want to make it common! +1/16/26, 09:59 - Martin: Maybe growing an avotaco plant would be a plant symbiosis between an avocado tree and some corn plants? +1/16/26, 10:19 - Philipp: Sounds like the perfect experiment! diff --git a/chatterbot/source_code_step_4/cleaner.py b/chatterbot/source_code_step_4/cleaner.py index 4654709549..72c534a5ba 100644 --- a/chatterbot/source_code_step_4/cleaner.py +++ b/chatterbot/source_code_step_4/cleaner.py @@ -15,7 +15,7 @@ def remove_chat_metadata(chat_export_file): date time username message --------------------------------------- - 8/26/22, 17:47 - Jane Doe: Message text + 1/16/26, 06:34 - Jane Doe: Message text This function removes all the metadata up to the text of each message. @@ -25,7 +25,7 @@ def remove_chat_metadata(chat_export_file): Returns: tuple: The text of each message in the conversation """ - date_time = r"(\d+\/\d+\/\d+,\s\d+:\d+)" # e.g. "8/26/22, 17:47" + date_time = r"(\d+\/\d+\/\d+,\s\d+:\d+)" # e.g. "1/16/26, 06:34" dash_whitespace = r"\s-\s" # " - " username = r"([\w\s]+)" # e.g. "Jane Doe" metadata_end = r":\s" # ": " diff --git a/chatterbot/source_code_step_4/db.sqlite3 b/chatterbot/source_code_step_4/db.sqlite3 index 8cd445d9048130e4aed6a6181135f35963ceeccd..949135c094d500056c74465e358e1c81e74a2d6d 100644 GIT binary patch delta 930 zcmZozz}WDBae_QAI|Bl+PSi0I>k{GR|G~h`b5rw5*qwu1 z9Yb6dJpEi;BNXsyQSkRufNN9Gz%(`kXs%`wE4#QM&6fr6otm9dePp^2W6nWcrLv13uHLS=rbLZSj# zgS}&DgcXP%5ajP?m8jt28UisXn3+@8R@RY$mzRN{mU^fjLbjV*Mlf-jn#(#03i2|9 zr{*N*=cei?q!neR=A|fnn7?GYr(cMd6_oD>@)SrAuc@Y%hQ=nQ9+?@L`iz`{f)EFT zxP){WT5J+v5#V9r-@?FunEwI)7XDwruwB9*!^f=12(}v>J}ffKwv4#Kh*^@^oDr*= znOKXW;SL)#*9oRW@cVa0LO+A AhX4Qo literal 20480 zcmeI2&u`mg7{{HgTj#V+T0#j-s`geDYO6J=U;j)piOx&iEuzi3EZH<97I~?+SR{5y zT()r=hyxd{J92;{{{R>6<2H$Z0*M3MIP$zUNnI!DIB}>Rt8s0=&#(9MeBU>++Ix5R z9N#8SynfH}iOel<$s~7!5RT)L@VN+|;c)>jW`;NLI}y2_cA4Y~4{i&Yzqy(DzqrgN znK!~~xWEGmAOR$R1dsp{Kmter2_OL^@P80^*_@fpUAva}%JQwpUE8;wwyeRxYdeLU8A|zAZu%< zg0wyN3%frE=#GNP(#BN#z6}5mTktlz1LzyoeRE{GUTM~WSEI$A-fI~92SG`W+v?kc zBhMY!E#Dg@iB)`t)hI!%_9H0VbFEQCRh(M(LA|eft?oE2@fQI1dsp{Kmter2_OL^fCP{L5Lfc^dd3V+CD-eg{7nwf?4&*^?zPjkYr!gs=_ zLVEu7{Qmrvx!>k~n0qw0mHH#~OX}NHmH(ap37qgi0!RP}AOR$R1dsp{m`Gsv3eTy6 zU@Qr%5A1H+>)D&+N#C*EL-ObMKfaPgNy>|*Je3L6$|@~Wt)Lc*vP|2a*M02yu*1LpXc_Wh`g{`^EOF!tw;Qh zO&~0JYPxQ}u?mtPi)tRTd#b{gfNhKX^hL}m4bJ&@ny zxkaciE39^$F-x&nC~2ywDqtB&y1B%2*=&#$2H@0+OTl`OY6U%C`ph_y$q>d9wOEb_AnCc3ob;eo}dWlq( z^k<;XwE;Ok+Ws;P8oR!1fDYcKv0Ck*?0^QDHb8_d z_0Y2-F#RnX95i@}$=SixqD=Saf!xZn0rQ@;Qd!aA!aXyTu4tls8<=g)F@!-)?DlLY z=)7D`g^OS%z6jK^s+OrA!QnZevUIuXi zGSJGHu0mUorKspd@sv19v!OWXxHyJhB83G++m;(_Lv0YrCfjYc%}ZfMIyqyo{fR}T zD3!*2BhzhOEhfVb&;_^)mN diff --git a/chatterbot/source_code_step_4/db.sqlite3-shm b/chatterbot/source_code_step_4/db.sqlite3-shm deleted file mode 100644 index fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeIuAr62r3 ") diff --git a/chatterbot/source_code_step_5/chat.txt b/chatterbot/source_code_step_5/chat.txt index b585737e91..dd585cc378 100644 --- a/chatterbot/source_code_step_5/chat.txt +++ b/chatterbot/source_code_step_5/chat.txt @@ -1,139 +1,139 @@ -9/15/22, 14:50 - Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them. Tap to learn more. -9/15/22, 14:49 - Philipp: Hi Martin, Philipp here! -9/15/22, 14:50 - Philipp: I’m ready to talk about plants! -9/15/22, 14:51 - Martin: Oh that's great! -9/15/22, 14:52 - Martin: I've been waiting for a good convo about plants for a long time -9/15/22, 14:52 - Philipp: We all have. -9/15/22, 14:52 - Martin: Did you know they need water to grow? -9/15/22, 14:52 - Philipp: I always thought that love and music was more than enough -9/15/22, 14:53 - Philipp: But water makes sense -9/15/22, 14:53 - Martin: Do you talk to your plants? -9/15/22, 14:53 - Philipp: I do! -9/15/22, 14:53 - Philipp: Some of them even have names -9/15/22, 14:54 - Martin: What do they like to hear? -9/15/22, 14:54 - Philipp: Motivational speeches -9/15/22, 14:54 - Philipp: Or stories about plants that made it and are living outside now -9/15/22, 14:54 - Martin: Oohhh 🥲 -9/15/22, 14:54 - Martin: Are you training them for independence? -9/15/22, 14:56 - Philipp: Yeah! I want them to be strong and take care of themselves at some point -9/15/22, 14:56 - Martin: That's heroic! -9/15/22, 14:57 - Martin: Sounds like you're a great plant parent -9/15/22, 14:57 - Philipp: Do you have any plant care pro tips? -9/15/22, 14:58 - Martin: Ahh, idk i just leave them be... -9/15/22, 14:58 - Martin: They are doing ok but not great -9/15/22, 14:58 - Philipp: So they are independent already! -9/15/22, 14:58 - Martin: I guess one tip would be to get plants that don't need much :P -9/15/22, 14:58 - Philipp: Like plastic plants, for example? -9/15/22, 14:59 - Martin: Haha, yes! Get independent plants! -9/15/22, 14:59 - Martin: Plastic plants are the cream of the crop -9/15/22, 14:59 - Martin: I haven't graduated to plastic plants yet -9/15/22, 14:59 - Philipp: Cream of the crop? -9/15/22, 15:00 - Philipp: I don't know what this means -9/15/22, 15:01 - Martin: Crop is a cultivated plant that is grown on a large scale commercially, especially a cereal, fruit, or vegetable -9/15/22, 15:01 - Martin: The cream must be the best of the best -9/15/22, 15:01 - Martin: Or maybe just all of it blended together? ;p -9/15/22, 15:02 - Martin: I don't grow any crop at home -9/15/22, 15:02 - Martin: And no cream, in case you wondered -9/15/22, 15:03 - Philipp: Ah, gotcha! -9/15/22, 15:03 - Philipp: Let me show you something! -9/15/22, 15:04 - Martin: I let you -9/15/22, 15:06 - Philipp: -9/15/22, 15:06 - Martin: It's a monsters! -9/15/22, 15:07 - Martin: Monstera* (auto correct...) -9/15/22, 15:07 - Philipp: I’m currently running an experiment of keeping my Monstera on the balcony -9/15/22, 15:07 - Martin: A monstera and a fluffy little monster -9/15/22, 15:07 - Philipp: Haha, yeah, hard to tell which is which -9/15/22, 15:07 - Martin: How has it been going with the monstera on the balcony? -9/15/22, 15:08 - Martin: I've tried that too over the summer -9/15/22, 15:08 - Philipp: Pretty bad -9/15/22, 15:08 - Martin: Oh really? -9/15/22, 15:08 - Martin: What happened? -9/15/22, 15:08 - Philipp: Yeah -9/15/22, 15:08 - Philipp: I mean … it’s weird. -9/15/22, 15:08 - Philipp: The leafs that she had are getting dryer and dryer. But she’s also growing plenty of new ones -9/15/22, 15:09 - Philipp: It‘s like she’s changing her summer jacket to a winter jacket -9/15/22, 15:13 - Martin: Yeah something similar happened to ours -9/15/22, 15:14 - Martin: It had thrips over the winter, so we needed to get rid of them -9/15/22, 15:14 - Philipp: Ah, thrips are those tiny little beasts that eat your plants, aren't they? -9/15/22, 15:15 - Martin: Thought that the balcony time would help get rid of them -9/15/22, 15:15 - Martin: Yeah they are horrible, really cute and tiny and deadly -9/15/22, 15:16 - Martin: Most of the monstera's leaves died, but now there are new ones coming -9/15/22, 15:16 - Martin: I think it's the amount of light, they need different leaves for stronger sunlight -9/15/22, 15:17 - Philipp: Do you have any other approaches to get rid of tiny monsters? -9/15/22, 15:17 - Philipp: (Except putting the plant on the balcony) -9/15/22, 15:17 - Martin: Tiny monstera's? -9/15/22, 15:17 - Philipp: Handling tiny monsters to grow big monsteras -9/15/22, 15:17 - Martin: Haha -9/15/22, 15:17 - Martin: Well, no. Just the balcony. This worked best -9/15/22, 15:18 - Martin: We tried applying soapy water -9/15/22, 15:18 - Martin: Which is a suggestion -9/15/22, 15:18 - Martin: And it keeps them a bit in check, but you can't get totally rid of them -9/15/22, 15:18 - Philipp: 10/10 thrips don't like this simple trick 😅 -9/15/22, 15:18 - Philipp: Oh, okay -9/15/22, 15:18 - Philipp: 8/10 thrips don't like this simple trick -9/15/22, 15:18 - Martin: I really hope they're gone now 🤞 -9/15/22, 15:18 - Martin: Lol -9/15/22, 15:19 - Martin: It's depressing when lil monstera keeps making new leaves for them just to get infected 😢 -9/15/22, 15:19 - Philipp: Yeah, nature can be harsh -9/15/22, 15:20 - Martin: Ah yes, it's a slightly strange rendering of nature though, if it's about potted plants -9/15/22, 15:20 - Martin: I feel like they could handle it better out in the wild -9/15/22, 15:21 - Martin: Good that you're making yours strong enough to leave eventually! -9/15/22, 15:22 - Philipp: For the other plants, my words help them to grow -9/15/22, 15:22 - Philipp: Inside and outside -9/15/22, 15:22 - Martin: What are the magic words? -9/15/22, 15:23 - Martin: Wait, do you make *all* plants grow??? -9/15/22, 15:24 - Philipp: Grow hastily, grow healthily, grow heartily 🪄✨🌱 -9/15/22, 15:24 - Philipp: Do you not make all your plants grow? -9/15/22, 15:24 - Martin: :)) -9/15/22, 15:25 - Martin: What do you consider 'your plants'? -9/15/22, 15:28 - Philipp: Oh, now I understand! -9/15/22, 15:29 - Philipp: I only considered the plants that live in my apartment (or my balcony) as the plant-spell-receiving plants -9/15/22, 15:29 - Philipp: But maybe they share the words? -9/15/22, 15:30 - Martin: Do raindrops touch their leaves? -9/15/22, 15:30 - Martin: I'm sure they chat with the other plants if they can -9/15/22, 15:31 - Philipp: Yeah, I heard that trees communicate in the woods with their roots -9/15/22, 15:31 - Philipp: But thinking about that makes me feel bad that my plants are potted 😬 -9/15/22, 15:31 - Martin: 😢 -9/15/22, 15:32 - Martin: Yeah... -9/15/22, 15:32 - Martin: The trees use mushrooms mycelium in the ground that's hooked to their roots to chat -9/15/22, 15:32 - Martin: Pretty cool 😎 -9/15/22, 15:33 - Martin: So i also have a Pilea -9/15/22, 15:33 - Martin: And some basil plants -9/15/22, 15:33 - Philipp: Do you have a photo of the Pilea? I don't know how it looks -9/15/22, 15:34 - Martin: And a peace lily -9/15/22, 15:34 - Martin: https://en.m.wikipedia.org/wiki/Pilea_peperomioides -9/15/22, 15:47 - Philipp: Oh, the Pilea looks cool! -9/15/22, 15:47 - Philipp: The leaves are like small umbrellas -9/15/22, 15:48 - Philipp: Did you actually manage to keep a supermarket basil alive or did you grow it yourself? -9/15/22, 16:28 - Martin: that's quite a story! -9/15/22, 16:28 - Martin: my dad had a flowering basil last year and put the seeds from that one plant into seeding pots -9/15/22, 16:29 - Martin: so many of them came up that he had about two dining room tables full of basil plants, each in their own pots... -9/15/22, 16:29 - Martin: i got three of them, so they are second gen supermarket basils with lots of siblings :) -9/15/22, 20:58 - Philipp: I always thought supermarket basil was meant to die after a few days -9/15/22, 20:58 - Philipp: But it seems it was my subpar care -9/15/22, 20:59 - Philipp: Congratulations to your basil dynasty! -9/16/22, 06:11 - Martin: Thanks! -9/16/22, 06:12 - Martin: Kudos go mostly to my dad -9/16/22, 06:12 - Martin: But you can bring them through winter -9/16/22, 06:12 - Martin: If there's no thrip infestation... -9/16/22, 06:34 - Martin: -9/16/22, 06:34 - Martin: -9/16/22, 06:35 - Martin: -9/16/22, 06:35 - Martin: Morning view of most of my house plants -9/16/22, 09:44 - Philipp: Fingers crossed 🤞 -9/16/22, 09:45 - Philipp: Are the ones on top avocados? -9/16/22, 09:53 - Martin: Yes, there are a couple of seedlings that wanted to live -9/16/22, 09:54 - Martin: Two more on the balcony of a similar size -9/16/22, 09:54 - Martin: And another seed that's one it's way 🤷‍♂️ -9/16/22, 09:55 - Philipp: I heard that it’s not easy to raise an Avodaco! -9/16/22, 09:55 - Martin: I haven't even heard of Avodacos! -9/16/22, 09:56 - Philipp: Wait, weren’t we talking about avocados? -9/16/22, 09:56 - Martin: Ah yes avocados 🥑! -9/16/22, 09:57 - Martin: I was just joking, riffing based on your typo 😝 -9/16/22, 09:57 - Philipp: Ooh! I was wondering why there was a red line under that word -9/16/22, 09:57 - Martin: Do you think there are avotacos? 🥑🌮 -9/16/22, 09:57 - Philipp: But I like that term, too -9/16/22, 09:58 - Philipp: 😂 -9/16/22, 09:58 - Philipp: If this is not a common term, then I want to make it common! -9/16/22, 09:59 - Martin: Maybe growing an avotaco plant would be a plant symbiosis between an avocado tree and some corn plants? -9/16/22, 10:19 - Philipp: Sounds like the perfect experiment! +1/15/26, 14:50 - Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them. Tap to learn more. +1/15/26, 14:49 - Philipp: Hi Martin, Philipp here! +1/15/26, 14:50 - Philipp: I’m ready to talk about plants! +1/15/26, 14:51 - Martin: Oh that's great! +1/15/26, 14:52 - Martin: I've been waiting for a good convo about plants for a long time +1/15/26, 14:52 - Philipp: We all have. +1/15/26, 14:52 - Martin: Did you know they need water to grow? +1/15/26, 14:52 - Philipp: I always thought that love and music was more than enough +1/15/26, 14:53 - Philipp: But water makes sense +1/15/26, 14:53 - Martin: Do you talk to your plants? +1/15/26, 14:53 - Philipp: I do! +1/15/26, 14:53 - Philipp: Some of them even have names +1/15/26, 14:54 - Martin: What do they like to hear? +1/15/26, 14:54 - Philipp: Motivational speeches +1/15/26, 14:54 - Philipp: Or stories about plants that made it and are living outside now +1/15/26, 14:54 - Martin: Oohhh 🥲 +1/15/26, 14:54 - Martin: Are you training them for independence? +1/15/26, 14:56 - Philipp: Yeah! I want them to be strong and take care of themselves at some point +1/15/26, 14:56 - Martin: That's heroic! +1/15/26, 14:57 - Martin: Sounds like you're a great plant parent +1/15/26, 14:57 - Philipp: Do you have any plant care pro tips? +1/15/26, 14:58 - Martin: Ahh, idk i just leave them be... +1/15/26, 14:58 - Martin: They are doing ok but not great +1/15/26, 14:58 - Philipp: So they are independent already! +1/15/26, 14:58 - Martin: I guess one tip would be to get plants that don't need much :P +1/15/26, 14:58 - Philipp: Like plastic plants, for example? +1/15/26, 14:59 - Martin: Haha, yes! Get independent plants! +1/15/26, 14:59 - Martin: Plastic plants are the cream of the crop +1/15/26, 14:59 - Martin: I haven't graduated to plastic plants yet +1/15/26, 14:59 - Philipp: Cream of the crop? +1/15/26, 15:00 - Philipp: I don't know what this means +1/15/26, 15:01 - Martin: Crop is a cultivated plant that is grown on a large scale commercially, especially a cereal, fruit, or vegetable +1/15/26, 15:01 - Martin: The cream must be the best of the best +1/15/26, 15:01 - Martin: Or maybe just all of it blended together? ;p +1/15/26, 15:02 - Martin: I don't grow any crop at home +1/15/26, 15:02 - Martin: And no cream, in case you wondered +1/15/26, 15:03 - Philipp: Ah, gotcha! +1/15/26, 15:03 - Philipp: Let me show you something! +1/15/26, 15:04 - Martin: I let you +1/15/26, 15:06 - Philipp: +1/15/26, 15:06 - Martin: It's a monsters! +1/15/26, 15:07 - Martin: Monstera* (auto correct...) +1/15/26, 15:07 - Philipp: I’m currently running an experiment of keeping my Monstera on the balcony +1/15/26, 15:07 - Martin: A monstera and a fluffy little monster +1/15/26, 15:07 - Philipp: Haha, yeah, hard to tell which is which +1/15/26, 15:07 - Martin: How has it been going with the monstera on the balcony? +1/15/26, 15:08 - Martin: I've tried that too over the summer +1/15/26, 15:08 - Philipp: Pretty bad +1/15/26, 15:08 - Martin: Oh really? +1/15/26, 15:08 - Martin: What happened? +1/15/26, 15:08 - Philipp: Yeah +1/15/26, 15:08 - Philipp: I mean … it’s weird. +1/15/26, 15:08 - Philipp: The leafs that she had are getting dryer and dryer. But she’s also growing plenty of new ones +1/15/26, 15:09 - Philipp: It‘s like she’s changing her summer jacket to a winter jacket +1/15/26, 15:13 - Martin: Yeah something similar happened to ours +1/15/26, 15:14 - Martin: It had thrips over the winter, so we needed to get rid of them +1/15/26, 15:14 - Philipp: Ah, thrips are those tiny little beasts that eat your plants, aren't they? +1/15/26, 15:15 - Martin: Thought that the balcony time would help get rid of them +1/15/26, 15:15 - Martin: Yeah they are horrible, really cute and tiny and deadly +1/15/26, 15:16 - Martin: Most of the monstera's leaves died, but now there are new ones coming +1/15/26, 15:16 - Martin: I think it's the amount of light, they need different leaves for stronger sunlight +1/15/26, 15:17 - Philipp: Do you have any other approaches to get rid of tiny monsters? +1/15/26, 15:17 - Philipp: (Except putting the plant on the balcony) +1/15/26, 15:17 - Martin: Tiny monstera's? +1/15/26, 15:17 - Philipp: Handling tiny monsters to grow big monsteras +1/15/26, 15:17 - Martin: Haha +1/15/26, 15:17 - Martin: Well, no. Just the balcony. This worked best +1/15/26, 15:18 - Martin: We tried applying soapy water +1/15/26, 15:18 - Martin: Which is a suggestion +1/15/26, 15:18 - Martin: And it keeps them a bit in check, but you can't get totally rid of them +1/15/26, 15:18 - Philipp: 10/10 thrips don't like this simple trick 😅 +1/15/26, 15:18 - Philipp: Oh, okay +1/15/26, 15:18 - Philipp: 8/10 thrips don't like this simple trick +1/15/26, 15:18 - Martin: I really hope they're gone now 🤞 +1/15/26, 15:18 - Martin: Lol +1/15/26, 15:19 - Martin: It's depressing when lil monstera keeps making new leaves for them just to get infected 😢 +1/15/26, 15:19 - Philipp: Yeah, nature can be harsh +1/15/26, 15:20 - Martin: Ah yes, it's a slightly strange rendering of nature though, if it's about potted plants +1/15/26, 15:20 - Martin: I feel like they could handle it better out in the wild +1/15/26, 15:21 - Martin: Good that you're making yours strong enough to leave eventually! +1/15/26, 15:22 - Philipp: For the other plants, my words help them to grow +1/15/26, 15:22 - Philipp: Inside and outside +1/15/26, 15:22 - Martin: What are the magic words? +1/15/26, 15:23 - Martin: Wait, do you make *all* plants grow??? +1/15/26, 15:24 - Philipp: Grow hastily, grow healthily, grow heartily 🪄✨🌱 +1/15/26, 15:24 - Philipp: Do you not make all your plants grow? +1/15/26, 15:24 - Martin: :)) +1/15/26, 15:25 - Martin: What do you consider 'your plants'? +1/15/26, 15:28 - Philipp: Oh, now I understand! +1/15/26, 15:29 - Philipp: I only considered the plants that live in my apartment (or my balcony) as the plant-spell-receiving plants +1/15/26, 15:29 - Philipp: But maybe they share the words? +1/15/26, 15:30 - Martin: Do raindrops touch their leaves? +1/15/26, 15:30 - Martin: I'm sure they chat with the other plants if they can +1/15/26, 15:31 - Philipp: Yeah, I heard that trees communicate in the woods with their roots +1/15/26, 15:31 - Philipp: But thinking about that makes me feel bad that my plants are potted 😬 +1/15/26, 15:31 - Martin: 😢 +1/15/26, 15:32 - Martin: Yeah... +1/15/26, 15:32 - Martin: The trees use mushrooms mycelium in the ground that's hooked to their roots to chat +1/15/26, 15:32 - Martin: Pretty cool 😎 +1/15/26, 15:33 - Martin: So i also have a Pilea +1/15/26, 15:33 - Martin: And some basil plants +1/15/26, 15:33 - Philipp: Do you have a photo of the Pilea? I don't know how it looks +1/15/26, 15:34 - Martin: And a peace lily +1/15/26, 15:34 - Martin: https://en.m.wikipedia.org/wiki/Pilea_peperomioides +1/15/26, 15:47 - Philipp: Oh, the Pilea looks cool! +1/15/26, 15:47 - Philipp: The leaves are like small umbrellas +1/15/26, 15:48 - Philipp: Did you actually manage to keep a supermarket basil alive or did you grow it yourself? +1/15/26, 16:28 - Martin: that's quite a story! +1/15/26, 16:28 - Martin: my dad had a flowering basil last year and put the seeds from that one plant into seeding pots +1/15/26, 16:29 - Martin: so many of them came up that he had about two dining room tables full of basil plants, each in their own pots... +1/15/26, 16:29 - Martin: i got three of them, so they are second gen supermarket basils with lots of siblings :) +1/15/26, 20:58 - Philipp: I always thought supermarket basil was meant to die after a few days +1/15/26, 20:58 - Philipp: But it seems it was my subpar care +1/15/26, 20:59 - Philipp: Congratulations to your basil dynasty! +1/16/26, 06:11 - Martin: Thanks! +1/16/26, 06:12 - Martin: Kudos go mostly to my dad +1/16/26, 06:12 - Martin: But you can bring them through winter +1/16/26, 06:12 - Martin: If there's no thrip infestation... +1/16/26, 06:34 - Martin: +1/16/26, 06:34 - Martin: +1/16/26, 06:35 - Martin: +1/16/26, 06:35 - Martin: Morning view of most of my house plants +1/16/26, 09:44 - Philipp: Fingers crossed 🤞 +1/16/26, 09:45 - Philipp: Are the ones on top avocados? +1/16/26, 09:53 - Martin: Yes, there are a couple of seedlings that wanted to live +1/16/26, 09:54 - Martin: Two more on the balcony of a similar size +1/16/26, 09:54 - Martin: And another seed that's one it's way 🤷‍♂️ +1/16/26, 09:55 - Philipp: I heard that it’s not easy to raise an Avodaco! +1/16/26, 09:55 - Martin: I haven't even heard of Avodacos! +1/16/26, 09:56 - Philipp: Wait, weren’t we talking about avocados? +1/16/26, 09:56 - Martin: Ah yes avocados 🥑! +1/16/26, 09:57 - Martin: I was just joking, riffing based on your typo 😝 +1/16/26, 09:57 - Philipp: Ooh! I was wondering why there was a red line under that word +1/16/26, 09:57 - Martin: Do you think there are avotacos? 🥑🌮 +1/16/26, 09:57 - Philipp: But I like that term, too +1/16/26, 09:58 - Philipp: 😂 +1/16/26, 09:58 - Philipp: If this is not a common term, then I want to make it common! +1/16/26, 09:59 - Martin: Maybe growing an avotaco plant would be a plant symbiosis between an avocado tree and some corn plants? +1/16/26, 10:19 - Philipp: Sounds like the perfect experiment! diff --git a/chatterbot/source_code_step_5/cleaner.py b/chatterbot/source_code_step_5/cleaner.py index 4654709549..72c534a5ba 100644 --- a/chatterbot/source_code_step_5/cleaner.py +++ b/chatterbot/source_code_step_5/cleaner.py @@ -15,7 +15,7 @@ def remove_chat_metadata(chat_export_file): date time username message --------------------------------------- - 8/26/22, 17:47 - Jane Doe: Message text + 1/16/26, 06:34 - Jane Doe: Message text This function removes all the metadata up to the text of each message. @@ -25,7 +25,7 @@ def remove_chat_metadata(chat_export_file): Returns: tuple: The text of each message in the conversation """ - date_time = r"(\d+\/\d+\/\d+,\s\d+:\d+)" # e.g. "8/26/22, 17:47" + date_time = r"(\d+\/\d+\/\d+,\s\d+:\d+)" # e.g. "1/16/26, 06:34" dash_whitespace = r"\s-\s" # " - " username = r"([\w\s]+)" # e.g. "Jane Doe" metadata_end = r":\s" # ": " diff --git a/chatterbot/source_code_step_5/db.sqlite3 b/chatterbot/source_code_step_5/db.sqlite3 index d0b54e27f3a4c6e02bed7d5db06bee1d24709d44..5a4ee6c06da93fb23bfb31076da7b4cf5311ba0b 100644 GIT binary patch literal 73728 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%0DWvD4$iHQ_{*ArAw(()*!FI z&j!}YU2;osci;j4Zv_7(_|4!~gYMw(20s*>4c-=<2~PN54vs7?wO7AXF;K-o6$4ca zy#Fy!C!O_(gOuXf(t(XjO?1B~cUx z3`5!~&P?RF7Qp$$)1(;T5tPncL%VnVHfe|Wgct0yb&d3{TzCmzsV6Pzw_N|DCoJ}V zzB|thbts0txG%*NNfQi}a1tme(k8bst3OWsg{V(<<@|o>Nl|hUd!t~M7PQ{xNInF{ zKK-aEC=QwraZ>P+riY|>OPh>4L=)O@CWQ+{e7lHlxy-pubcyOygxCiywoOQ)WoO~u zxP0x2g)cuKFOkyx&a_wW5i_tLi@X}HvJa6`nwNvE3sS9~wgU$1K2Nr( zAhM=_E1jGBQ!axoc98r@;A5az{JURz+W2J!3n~9L!bNL<^HO*RNTA_PY;w_}0XTXq zOr^fIv_w`KZFT>G3DwtBq(ZO|%3{+aUVXn9`s&9->R+B{V~uf++ILko^eL3g{S{-Sgxe5Yr?-J$%k z{JpTx`x(!n;PdY9doIP+dy4)yW0ym{fz#0%_fJNDgxEA=(XWN#k>3gw0^37>;rfC9 zmtwm2OVQUtdUPmwAo8Z~W3j!`sqm+ipNMtG{NCq-k}u|6AO4Cm9r&HdF{LT+MNh*2 z^U49KQ#!H$pS&7$WPDXk|5;C>4AcMPD>VIIF30qrvCQ9#Uos!{yy#&1pR$|&3zo)~ zO#hdt1FwzvTx39+MzN`|Ib=uU)=Qnbj7Csnfa#wtJc1r zXZoLBiRu5MsQ{d3`hUc`eqq!91ySJ!)BnTX=Wn{{e_#RA|3ls{*-iiF4b%TQYxNK# zde+zVE|~tGGgZ|jBA%whmDZP`ls@JAn1kv6WaXy+KL5{GVER9ClT81;i<|zB-z3xj zG5?!v`ag<)Z#4b);BEP)|0A??Sock)|L&l)EYtttN?5}#CkE+I8NB1c;MN6A{|8K| zH@R%#^}+e3|4#YQMNR(?;G2W#|NhmJZ0@s^ACUGh2@#WA$eCNG7;&VnA^%W5Jm9UR z?XS%A-$4_}mCbvk>@)xL7mf1A?eWcp7mVft@n)C$WUX~_5q#C;j2 zf8j;IgIuZUzgd~KoBo?jMNT8$+fDy*qLK`qxmsSAOJDL9X zlxOiq4F0iAEnf~jR6n%CsD5&kQXiFKU|9dTz3e*2~OZUh5HhFr5hV!2ArxrB* zZ(GRpfA_+s|JwJ0>0b?h#b)~7YOw+&yx$c$wy5d9h9o4~-8Sim(~}y+1J&;=)AYZk zJk$T?$ZwTt`rlNk>3<_>)Oahgp?*W;&4o?>cPwrCUmqQ+$n?JsEFLB{g`j=g7BK0f5{BN%U&Xa#Or1u)4xZOA~Mi1p>=V3V6j?b>e#Y@Yr90c#4l()qbRl`?o^2l1bz zJ_d^H|65mN|9{jP;5_?(up;~ai3;ui>q<*xrS|{(EZex|4&(phI+66peCJd<9;d*VJtCnK$NV!elh5;JqF?$Qx<~Frrk+8BvUM)* z)MbO2v4?YNPy{=~bEKG##x^T-a`H%cZGcxq7 zyjh14w6?eRr;Sia_mW%vo6L`O@2 lo_Jb*97HOCWKcJ&52w+!HHvh$Ryb*1h_!6~U)-Dd{{t30q9XtR literal 114688 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
T!Eyl4! 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 R5FkK+z%~MnZ5IElwJWfnDTe?6 diff --git a/chatterbot/source_code_step_5/db.sqlite3-wal b/chatterbot/source_code_step_5/db.sqlite3-wal deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/chatterbot/source_code_step_5/trainer.py b/chatterbot/source_code_step_5/trainer.py new file mode 100644 index 0000000000..6b95736f43 --- /dev/null +++ b/chatterbot/source_code_step_5/trainer.py @@ -0,0 +1,10 @@ +from chatterbot import ChatBot +from chatterbot.trainers import ListTrainer +from cleaner import clean_corpus + +CORPUS_FILE = "chat.txt" + +chatbot = ChatBot("Chatpot") +trainer = ListTrainer(chatbot) +cleaned_corpus = clean_corpus(CORPUS_FILE) +trainer.train(cleaned_corpus) diff --git a/chatterbot/source_code_step_6/bot.py b/chatterbot/source_code_step_6/bot.py new file mode 100644 index 0000000000..dd24be4e5b --- /dev/null +++ b/chatterbot/source_code_step_6/bot.py @@ -0,0 +1,23 @@ +from chatterbot import ChatBot + +chatbot = ChatBot( + "Chatpot", + logic_adapters=[ + { + "import_path": "chatterbot.logic.BestMatch", + }, + { + "import_path": "chatterbot.logic.OllamaLogicAdapter", + "model": "llama3.2:latest", + "host": "http://localhost:11434", + }, + ], +) + +exit_conditions = (":q", "quit", "exit") +while True: + query = input("> ") + if query in exit_conditions: + break + else: + print(f"🪴 {chatbot.get_response(query)}") diff --git a/chatterbot/source_code_step_6/chat.txt b/chatterbot/source_code_step_6/chat.txt new file mode 100644 index 0000000000..dd585cc378 --- /dev/null +++ b/chatterbot/source_code_step_6/chat.txt @@ -0,0 +1,139 @@ +1/15/26, 14:50 - Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them. Tap to learn more. +1/15/26, 14:49 - Philipp: Hi Martin, Philipp here! +1/15/26, 14:50 - Philipp: I’m ready to talk about plants! +1/15/26, 14:51 - Martin: Oh that's great! +1/15/26, 14:52 - Martin: I've been waiting for a good convo about plants for a long time +1/15/26, 14:52 - Philipp: We all have. +1/15/26, 14:52 - Martin: Did you know they need water to grow? +1/15/26, 14:52 - Philipp: I always thought that love and music was more than enough +1/15/26, 14:53 - Philipp: But water makes sense +1/15/26, 14:53 - Martin: Do you talk to your plants? +1/15/26, 14:53 - Philipp: I do! +1/15/26, 14:53 - Philipp: Some of them even have names +1/15/26, 14:54 - Martin: What do they like to hear? +1/15/26, 14:54 - Philipp: Motivational speeches +1/15/26, 14:54 - Philipp: Or stories about plants that made it and are living outside now +1/15/26, 14:54 - Martin: Oohhh 🥲 +1/15/26, 14:54 - Martin: Are you training them for independence? +1/15/26, 14:56 - Philipp: Yeah! I want them to be strong and take care of themselves at some point +1/15/26, 14:56 - Martin: That's heroic! +1/15/26, 14:57 - Martin: Sounds like you're a great plant parent +1/15/26, 14:57 - Philipp: Do you have any plant care pro tips? +1/15/26, 14:58 - Martin: Ahh, idk i just leave them be... +1/15/26, 14:58 - Martin: They are doing ok but not great +1/15/26, 14:58 - Philipp: So they are independent already! +1/15/26, 14:58 - Martin: I guess one tip would be to get plants that don't need much :P +1/15/26, 14:58 - Philipp: Like plastic plants, for example? +1/15/26, 14:59 - Martin: Haha, yes! Get independent plants! +1/15/26, 14:59 - Martin: Plastic plants are the cream of the crop +1/15/26, 14:59 - Martin: I haven't graduated to plastic plants yet +1/15/26, 14:59 - Philipp: Cream of the crop? +1/15/26, 15:00 - Philipp: I don't know what this means +1/15/26, 15:01 - Martin: Crop is a cultivated plant that is grown on a large scale commercially, especially a cereal, fruit, or vegetable +1/15/26, 15:01 - Martin: The cream must be the best of the best +1/15/26, 15:01 - Martin: Or maybe just all of it blended together? ;p +1/15/26, 15:02 - Martin: I don't grow any crop at home +1/15/26, 15:02 - Martin: And no cream, in case you wondered +1/15/26, 15:03 - Philipp: Ah, gotcha! +1/15/26, 15:03 - Philipp: Let me show you something! +1/15/26, 15:04 - Martin: I let you +1/15/26, 15:06 - Philipp: +1/15/26, 15:06 - Martin: It's a monsters! +1/15/26, 15:07 - Martin: Monstera* (auto correct...) +1/15/26, 15:07 - Philipp: I’m currently running an experiment of keeping my Monstera on the balcony +1/15/26, 15:07 - Martin: A monstera and a fluffy little monster +1/15/26, 15:07 - Philipp: Haha, yeah, hard to tell which is which +1/15/26, 15:07 - Martin: How has it been going with the monstera on the balcony? +1/15/26, 15:08 - Martin: I've tried that too over the summer +1/15/26, 15:08 - Philipp: Pretty bad +1/15/26, 15:08 - Martin: Oh really? +1/15/26, 15:08 - Martin: What happened? +1/15/26, 15:08 - Philipp: Yeah +1/15/26, 15:08 - Philipp: I mean … it’s weird. +1/15/26, 15:08 - Philipp: The leafs that she had are getting dryer and dryer. But she’s also growing plenty of new ones +1/15/26, 15:09 - Philipp: It‘s like she’s changing her summer jacket to a winter jacket +1/15/26, 15:13 - Martin: Yeah something similar happened to ours +1/15/26, 15:14 - Martin: It had thrips over the winter, so we needed to get rid of them +1/15/26, 15:14 - Philipp: Ah, thrips are those tiny little beasts that eat your plants, aren't they? +1/15/26, 15:15 - Martin: Thought that the balcony time would help get rid of them +1/15/26, 15:15 - Martin: Yeah they are horrible, really cute and tiny and deadly +1/15/26, 15:16 - Martin: Most of the monstera's leaves died, but now there are new ones coming +1/15/26, 15:16 - Martin: I think it's the amount of light, they need different leaves for stronger sunlight +1/15/26, 15:17 - Philipp: Do you have any other approaches to get rid of tiny monsters? +1/15/26, 15:17 - Philipp: (Except putting the plant on the balcony) +1/15/26, 15:17 - Martin: Tiny monstera's? +1/15/26, 15:17 - Philipp: Handling tiny monsters to grow big monsteras +1/15/26, 15:17 - Martin: Haha +1/15/26, 15:17 - Martin: Well, no. Just the balcony. This worked best +1/15/26, 15:18 - Martin: We tried applying soapy water +1/15/26, 15:18 - Martin: Which is a suggestion +1/15/26, 15:18 - Martin: And it keeps them a bit in check, but you can't get totally rid of them +1/15/26, 15:18 - Philipp: 10/10 thrips don't like this simple trick 😅 +1/15/26, 15:18 - Philipp: Oh, okay +1/15/26, 15:18 - Philipp: 8/10 thrips don't like this simple trick +1/15/26, 15:18 - Martin: I really hope they're gone now 🤞 +1/15/26, 15:18 - Martin: Lol +1/15/26, 15:19 - Martin: It's depressing when lil monstera keeps making new leaves for them just to get infected 😢 +1/15/26, 15:19 - Philipp: Yeah, nature can be harsh +1/15/26, 15:20 - Martin: Ah yes, it's a slightly strange rendering of nature though, if it's about potted plants +1/15/26, 15:20 - Martin: I feel like they could handle it better out in the wild +1/15/26, 15:21 - Martin: Good that you're making yours strong enough to leave eventually! +1/15/26, 15:22 - Philipp: For the other plants, my words help them to grow +1/15/26, 15:22 - Philipp: Inside and outside +1/15/26, 15:22 - Martin: What are the magic words? +1/15/26, 15:23 - Martin: Wait, do you make *all* plants grow??? +1/15/26, 15:24 - Philipp: Grow hastily, grow healthily, grow heartily 🪄✨🌱 +1/15/26, 15:24 - Philipp: Do you not make all your plants grow? +1/15/26, 15:24 - Martin: :)) +1/15/26, 15:25 - Martin: What do you consider 'your plants'? +1/15/26, 15:28 - Philipp: Oh, now I understand! +1/15/26, 15:29 - Philipp: I only considered the plants that live in my apartment (or my balcony) as the plant-spell-receiving plants +1/15/26, 15:29 - Philipp: But maybe they share the words? +1/15/26, 15:30 - Martin: Do raindrops touch their leaves? +1/15/26, 15:30 - Martin: I'm sure they chat with the other plants if they can +1/15/26, 15:31 - Philipp: Yeah, I heard that trees communicate in the woods with their roots +1/15/26, 15:31 - Philipp: But thinking about that makes me feel bad that my plants are potted 😬 +1/15/26, 15:31 - Martin: 😢 +1/15/26, 15:32 - Martin: Yeah... +1/15/26, 15:32 - Martin: The trees use mushrooms mycelium in the ground that's hooked to their roots to chat +1/15/26, 15:32 - Martin: Pretty cool 😎 +1/15/26, 15:33 - Martin: So i also have a Pilea +1/15/26, 15:33 - Martin: And some basil plants +1/15/26, 15:33 - Philipp: Do you have a photo of the Pilea? I don't know how it looks +1/15/26, 15:34 - Martin: And a peace lily +1/15/26, 15:34 - Martin: https://en.m.wikipedia.org/wiki/Pilea_peperomioides +1/15/26, 15:47 - Philipp: Oh, the Pilea looks cool! +1/15/26, 15:47 - Philipp: The leaves are like small umbrellas +1/15/26, 15:48 - Philipp: Did you actually manage to keep a supermarket basil alive or did you grow it yourself? +1/15/26, 16:28 - Martin: that's quite a story! +1/15/26, 16:28 - Martin: my dad had a flowering basil last year and put the seeds from that one plant into seeding pots +1/15/26, 16:29 - Martin: so many of them came up that he had about two dining room tables full of basil plants, each in their own pots... +1/15/26, 16:29 - Martin: i got three of them, so they are second gen supermarket basils with lots of siblings :) +1/15/26, 20:58 - Philipp: I always thought supermarket basil was meant to die after a few days +1/15/26, 20:58 - Philipp: But it seems it was my subpar care +1/15/26, 20:59 - Philipp: Congratulations to your basil dynasty! +1/16/26, 06:11 - Martin: Thanks! +1/16/26, 06:12 - Martin: Kudos go mostly to my dad +1/16/26, 06:12 - Martin: But you can bring them through winter +1/16/26, 06:12 - Martin: If there's no thrip infestation... +1/16/26, 06:34 - Martin: +1/16/26, 06:34 - Martin: +1/16/26, 06:35 - Martin: +1/16/26, 06:35 - Martin: Morning view of most of my house plants +1/16/26, 09:44 - Philipp: Fingers crossed 🤞 +1/16/26, 09:45 - Philipp: Are the ones on top avocados? +1/16/26, 09:53 - Martin: Yes, there are a couple of seedlings that wanted to live +1/16/26, 09:54 - Martin: Two more on the balcony of a similar size +1/16/26, 09:54 - Martin: And another seed that's one it's way 🤷‍♂️ +1/16/26, 09:55 - Philipp: I heard that it’s not easy to raise an Avodaco! +1/16/26, 09:55 - Martin: I haven't even heard of Avodacos! +1/16/26, 09:56 - Philipp: Wait, weren’t we talking about avocados? +1/16/26, 09:56 - Martin: Ah yes avocados 🥑! +1/16/26, 09:57 - Martin: I was just joking, riffing based on your typo 😝 +1/16/26, 09:57 - Philipp: Ooh! I was wondering why there was a red line under that word +1/16/26, 09:57 - Martin: Do you think there are avotacos? 🥑🌮 +1/16/26, 09:57 - Philipp: But I like that term, too +1/16/26, 09:58 - Philipp: 😂 +1/16/26, 09:58 - Philipp: If this is not a common term, then I want to make it common! +1/16/26, 09:59 - Martin: Maybe growing an avotaco plant would be a plant symbiosis between an avocado tree and some corn plants? +1/16/26, 10:19 - Philipp: Sounds like the perfect experiment! diff --git a/chatterbot/source_code_step_6/cleaner.py b/chatterbot/source_code_step_6/cleaner.py new file mode 100644 index 0000000000..72c534a5ba --- /dev/null +++ b/chatterbot/source_code_step_6/cleaner.py @@ -0,0 +1,57 @@ +import re + + +def clean_corpus(chat_export_file): + """Prepare a WhatsApp chat export for training with chatterbot.""" + message_corpus = remove_chat_metadata(chat_export_file) + cleaned_corpus = remove_non_message_text(message_corpus) + return cleaned_corpus + + +def remove_chat_metadata(chat_export_file): + """Remove WhatsApp chat metadata. + + WhatsApp chat exports come with metadata about each message: + + date time username message + --------------------------------------- + 1/16/26, 06:34 - Jane Doe: Message text + + This function removes all the metadata up to the text of each message. + + Args: + chat_export_file (str): The name of the chat export file + + Returns: + tuple: The text of each message in the conversation + """ + date_time = r"(\d+\/\d+\/\d+,\s\d+:\d+)" # e.g. "1/16/26, 06:34" + dash_whitespace = r"\s-\s" # " - " + username = r"([\w\s]+)" # e.g. "Jane Doe" + metadata_end = r":\s" # ": " + pattern = date_time + dash_whitespace + username + metadata_end + + with open(chat_export_file, "r") as corpus_file: + content = corpus_file.read() + cleaned_corpus = re.sub(pattern, "", content) + return tuple(cleaned_corpus.split("\n")) + + +def remove_non_message_text(export_text_lines): + """Remove conversation-irrelevant text from chat export. + + WhatsApp chat exports come with a standardized intro line, + and an empty line at the end of the file. + Text exports also replace media messages with text that isn't + relevant for the conversation. This function removes all that. + + Args: + export_text_lines (tuple): All lines from the export file + + Returns: + tuple: Messages that are a relevant part of the conversation + """ + messages = export_text_lines[1:-1] + + filter_out_msgs = ("",) + return tuple((msg for msg in messages if msg not in filter_out_msgs)) diff --git a/chatterbot/source_code_step_6/trainer.py b/chatterbot/source_code_step_6/trainer.py new file mode 100644 index 0000000000..6b95736f43 --- /dev/null +++ b/chatterbot/source_code_step_6/trainer.py @@ -0,0 +1,10 @@ +from chatterbot import ChatBot +from chatterbot.trainers import ListTrainer +from cleaner import clean_corpus + +CORPUS_FILE = "chat.txt" + +chatbot = ChatBot("Chatpot") +trainer = ListTrainer(chatbot) +cleaned_corpus = clean_corpus(CORPUS_FILE) +trainer.train(cleaned_corpus) From e7a2b6be26847d52f18fba971b0f57a080d8daba Mon Sep 17 00:00:00 2001 From: Martin Breuss Date: Mon, 20 Apr 2026 12:55:28 +0000 Subject: [PATCH 2/2] Apply ruff format to step_2/3/4 bot.py --- chatterbot/source_code_step_2/bot.py | 20 ++++++++++++-------- chatterbot/source_code_step_3/bot.py | 20 ++++++++++++-------- chatterbot/source_code_step_4/bot.py | 20 ++++++++++++-------- 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/chatterbot/source_code_step_2/bot.py b/chatterbot/source_code_step_2/bot.py index 7119a5e3ea..b21489c283 100644 --- a/chatterbot/source_code_step_2/bot.py +++ b/chatterbot/source_code_step_2/bot.py @@ -4,14 +4,18 @@ chatbot = ChatBot("Chatpot") trainer = ListTrainer(chatbot) -trainer.train([ - "Hi", - "Welcome, friend 🤗", -]) -trainer.train([ - "Are you a plant?", - "No, I'm the pot below the plant!", -]) +trainer.train( + [ + "Hi", + "Welcome, friend 🤗", + ] +) +trainer.train( + [ + "Are you a plant?", + "No, I'm the pot below the plant!", + ] +) exit_conditions = (":q", "quit", "exit") while True: diff --git a/chatterbot/source_code_step_3/bot.py b/chatterbot/source_code_step_3/bot.py index 7119a5e3ea..b21489c283 100644 --- a/chatterbot/source_code_step_3/bot.py +++ b/chatterbot/source_code_step_3/bot.py @@ -4,14 +4,18 @@ chatbot = ChatBot("Chatpot") trainer = ListTrainer(chatbot) -trainer.train([ - "Hi", - "Welcome, friend 🤗", -]) -trainer.train([ - "Are you a plant?", - "No, I'm the pot below the plant!", -]) +trainer.train( + [ + "Hi", + "Welcome, friend 🤗", + ] +) +trainer.train( + [ + "Are you a plant?", + "No, I'm the pot below the plant!", + ] +) exit_conditions = (":q", "quit", "exit") while True: diff --git a/chatterbot/source_code_step_4/bot.py b/chatterbot/source_code_step_4/bot.py index 7119a5e3ea..b21489c283 100644 --- a/chatterbot/source_code_step_4/bot.py +++ b/chatterbot/source_code_step_4/bot.py @@ -4,14 +4,18 @@ chatbot = ChatBot("Chatpot") trainer = ListTrainer(chatbot) -trainer.train([ - "Hi", - "Welcome, friend 🤗", -]) -trainer.train([ - "Are you a plant?", - "No, I'm the pot below the plant!", -]) +trainer.train( + [ + "Hi", + "Welcome, friend 🤗", + ] +) +trainer.train( + [ + "Are you a plant?", + "No, I'm the pot below the plant!", + ] +) exit_conditions = (":q", "quit", "exit") while True: