From 19d1089d13277cde22e4b58133460e3653fd3f67 Mon Sep 17 00:00:00 2001 From: Ryszard Staruch Date: Wed, 23 Oct 2024 15:13:08 +0200 Subject: [PATCH] Update files and add examples --- 01_python.ipynb | 6 +- 02_wyrazenia_regularne.ipynb | 12 +- examples.ipynb | 235 +++++++++++++++++++++++++++++++++++ sprawy_organizacyjne.ipynb | 2 +- 4 files changed, 245 insertions(+), 10 deletions(-) create mode 100644 examples.ipynb diff --git a/01_python.ipynb b/01_python.ipynb index 163643f..3a12f29 100644 --- a/01_python.ipynb +++ b/01_python.ipynb @@ -31,7 +31,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -52,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -75,7 +75,7 @@ "source": [ "### Zadanie 3\n", "\n", - "Napisz funkcję, która wstawia polskie tłumaczenia wyrazów w danym tekście dla podanego słownika.\n", + "Napisz funkcję, która wstawia polskie tłumaczenia wyrazów w danym tekście dla podanego słownika (uwaga! proszę zachować pierwotną interpunkcję w tekście).\n", "Czyli np. dla słownika:\n", "* dogs -> psy\n", "* cats -> koty\n", diff --git a/02_wyrazenia_regularne.ipynb b/02_wyrazenia_regularne.ipynb index 455c829..dae36b9 100644 --- a/02_wyrazenia_regularne.ipynb +++ b/02_wyrazenia_regularne.ipynb @@ -79,19 +79,19 @@ "\n", "print(\"NAMES\")\n", "for name in names:\n", - " print(validate_name(name))\n", + " print(f\"{name}: {validate_name(name)}\")\n", "\n", "print(\"PHONE NUMBERS\")\n", "for phone_number in phone_numbers:\n", - " print(validate_phone_number(phone_number))\n", + " print(f\"{phone_number}: {validate_phone_number(phone_number)}\")\n", "\n", "print(\"ZIP CODES\")\n", "for code in zip_codes:\n", - " print(validate_zip_code(code))\n", + " print(f\"{code}: {validate_zip_code(code)}\")\n", "\n", "print(\"EMAILS\")\n", "for email in emails:\n", - " print(validate_email(email))" + " print(f\"{email}: {validate_email(email)}\")" ] }, { @@ -99,7 +99,7 @@ "metadata": {}, "source": [ "### Zadanie 2\n", - "Napisz funkcję, która podzieli tekst na zdania. Zdanie kończy się kropką, znakiem zapytania lub wykrzyknikiem. Wykorzystaj pojedynczy pattern z wyrażeń regularnych. " + "Napisz funkcję, która podzieli tekst na zdania. Zdanie kończy się kropką, znakiem zapytania lub wykrzyknikiem. Podzielone zdania muszą zachować pierwotną interpunkcję (czyli po podziale kropka/wykrzyknik/znak zapytania muszą występować w rozdzielonych od siebie zdaniach). Wykorzystaj pojedynczy pattern z wyrażeń regularnych. " ] }, { @@ -137,7 +137,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "base", "language": "python", "name": "python3" }, diff --git a/examples.ipynb b/examples.ipynb new file mode 100644 index 0000000..f7ed11b --- /dev/null +++ b/examples.ipynb @@ -0,0 +1,235 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### nie robimy 2 nowych linii w bloku funkcji. sentences[::2] oraz sentences[1::2] powinny być przypisane do osobnych zmiennych" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pies ten pochodzi z południowych Chin, z terenów prowincji Guangdong! \n", + "Został rozpropagowany i hodowany w celach wystawowych przez hodowców w USA. \n", + "Nazwa psa, pochodząca z chińskiego, oznacza dosłownie piaszczysta skóra. \n", + "['Pies ten pochodzi z południowych Chin, z terenów prowincji Guangdong! ', 'Został rozpropagowany i hodowany w celach wystawowych przez hodowców w USA. ', 'Nazwa psa, pochodząca z chińskiego, oznacza dosłownie piaszczysta skóra. ']\n" + ] + } + ], + "source": [ + "import re\n", + "tekst = \"Pies ten pochodzi z południowych Chin, z terenów prowincji Guangdong! Został rozpropagowany i hodowany w celach wystawowych przez hodowców w USA. Nazwa psa, pochodząca z chińskiego, oznacza dosłownie piaszczysta skóra. Chart polski polska rasa psa myśliwskiego, znana prawdopodobnie od czasów Galla Anonima, zaliczana do grupy chartów.\"\n", + "def split_sentences(text):\n", + " sentences = re.split(r'([.!?]\\s+)(?=[A-Z])', text)\n", + "\n", + "\n", + " full_sentences = [''.join(pair) for pair in zip(sentences[::2], sentences[1::2])]\n", + "\n", + "\n", + " for sentence in full_sentences:\n", + " print(sentence)\n", + " print(full_sentences)\n", + "split_sentences(tekst)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Niewłaściwa nazwa funkcji switch_letter (robi coś innego, niż nazwa na to wskazuje). Linijka z sum jest nieczytelna." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--- faja.\n" + ] + } + ], + "source": [ + "text = \"kurde faja.\"\n", + "\n", + "vulgar_words_base = [\"kurd\", \"choler\"]\n", + "\n", + "def switch_letter(word, vulgar_word_list):\n", + " word = word.lower()\n", + " for bad_word in vulgar_word_list:\n", + " switched_letters = sum(1 for a, b in zip(word, bad_word) if a != b)\n", + " if switched_letters == 1:\n", + " return True\n", + " return False\n", + "\n", + "def censor_text(text):\n", + " pattern = re.compile(r'[^\\s]*(' + '|'.join([f'{word}' for word in vulgar_words_base]) + r')[^\\s]*', re.IGNORECASE)\n", + " censored_text = pattern.sub(\"---\", text)\n", + "\n", + " censored_text_list = censored_text.split()\n", + " \n", + " for i, word in enumerate(censored_text_list):\n", + " if switch_letter(word, vulgar_words_base):\n", + " censored_text_list[i] = \"---\"\n", + " final_censored_text = \" \".join(censored_text_list)\n", + "\n", + " return final_censored_text\n", + "\n", + "print(censor_text(text))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "switch_letter(\"kurcze\", [\"kurzce\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Jeżeli nie ma takiej konieczności nie iterujemy po rozdzielonym na słowa tekście, tylko na całym tekście." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Siała baba mak.\n", + "Czy wiedziała jak?\n", + "Dziadek wiedział, nie powiedział, a to było tak!\n" + ] + } + ], + "source": [ + "# Solution 2\n", + "text = 'Siała baba mak. Czy wiedziała jak? Dziadek wiedział, nie powiedział, a to było tak!'\n", + "sentences = []\n", + "\n", + "def split_sentences(text):\n", + " sentence = ''\n", + " for word in text.split():\n", + " x = re.search(r'[a-zA-Z0-9]+[.?!]', word)\n", + " if x is None:\n", + " sentence += f'{word} '\n", + " else:\n", + " sentence += word\n", + " sentences.append(sentence)\n", + " sentence = ''\n", + " for result in sentences:\n", + " print(result)\n", + "\n", + "\n", + "split_sentences(text)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Nie stosujemy zapisu if {zmienna}, tylko if {zmienna} is True/False. Kod dla danego warunku przenosimy do nowej linii" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import re\n", + "\n", + "def validate_name(name):\n", + " valid = re.match(r'^[A-Z][a-z]{1,}',name)\n", + " if valid: return True\n", + " else: return False\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Przykład właściwego zastosowania komentarza" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def censor_text(text):\n", + " prefixes = r'(do|na|o|od|pod|po|prze|przy|roz|s|u|w|y|za|z|u)*'\n", + "\n", + " # profanities according to prof. Jerzy Bralczyk\n", + " profanities = [ \n", + " rf'\\b{prefixes}(kurw[aąeęyi]\\w*)|(ku(z|ź)w\\w*)|(kurew\\w*)\\b',\n", + " rf'\\b{prefixes}(pierd\\w*)\\b',\n", + " rf'\\b{prefixes}(chuj\\w*)\\b',\n", + " rf'\\b{prefixes}(pizd\\w*)\\b',\n", + " rf'\\b{prefixes}(jeb\\w*)\\b',\n", + " ]\n", + "\n", + " profanity_pattern = re.compile('|'.join(profanities), re.IGNORECASE)\n", + "\n", + " return profanity_pattern.sub('---', text)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/sprawy_organizacyjne.ipynb b/sprawy_organizacyjne.ipynb index 52ad337..8f19a29 100644 --- a/sprawy_organizacyjne.ipynb +++ b/sprawy_organizacyjne.ipynb @@ -37,7 +37,7 @@ "\n", "## Laboratorium \n", "\n", - "Podstawą do zaliczenia laboratorium jest uzyskanie odpowiedniej liczby punktów. Liczba punktów i stworzenie projektu są jedynymi kryteriami oceny końcowej. \n", + "Podstawą do zaliczenia laboratorium jest uzyskanie odpowiedniej liczby punktów oraz stworzenie i zaprezentowanie projektu. Liczba punktów i stworzenie projektu (wraz z jego zaprezentowaniem) są jedynymi kryteriami oceny końcowej.    \n", "\n", "Punkty otrzymuje się za rozwiązanie zadań podanych przez prowadzącego oraz projekt końcowy. \n", "\n",