Skip to content

Commit 77a8b33

Browse files
authored
Add new exercises
1 parent 100a3fa commit 77a8b33

File tree

2 files changed

+858
-0
lines changed

2 files changed

+858
-0
lines changed

exercises/Aufgaben_Tag_1.ipynb

+385
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,385 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"id": "b548150e-e77b-4aa0-b021-36d2135bdabe",
6+
"metadata": {},
7+
"source": [
8+
"# Programmieren für Geisteswissenschaftler - Workshop II\n",
9+
"# Tag 1\n",
10+
"\n",
11+
"## Datenstukturen in Jupyter Notebooks\n",
12+
"\n",
13+
"Lernen Sie das Jupyter Notebook kennen: \n",
14+
"Ein Jupyter Notebook enthält einen Python-Interpreter und verschiedene Zellen. \n",
15+
"In den Zellen können Sie entweder Text oder Code eingeben. \n",
16+
"Jede Zelle mit Code kann *einzeln* ausgeführt werden. \n",
17+
"\n",
18+
"Hinweis: \n",
19+
"Sie können zudem unter \"Edit\" oder der rechten Maustaste die Funktion \"Clear Outputs\" / \"Clear All Outputs\" nutzen, um das Notebook weiterhin übersichtlich zu halten.\n",
20+
"\n",
21+
"Lernziele:\n",
22+
"\n",
23+
"* Was sind die Vorteile von Jupyter Notebooks?\n",
24+
"* Wie kann ich in Python Dateien einlesen?\n",
25+
"* Wie kann ich Dateien schreiben?\n",
26+
"* Wie kann ich aus unstrukturierten Daten strukturierte Daten erzeugen?\n",
27+
"* Wie halte ich mehrere Daten in einer Datenstruktur?\n",
28+
"* Welche Datenstrukturen gibt es?\n",
29+
"* Wie exportiere ich Daten in Standardformate?\n",
30+
"* Wie nutze ich bestehende Bibliotheken in Python?"
31+
]
32+
},
33+
{
34+
"cell_type": "markdown",
35+
"id": "0fb5ce41-c3cc-42db-95bd-6735d7c3bb9f",
36+
"metadata": {},
37+
"source": [
38+
"## Aufgabe 1\n",
39+
"\n",
40+
"Machen Sie sich mit dem Jupyter Hub vertraut.\n",
41+
"\n",
42+
"Erzeugen Sie zwei neue Zellen. Eine für Markdown Text und eine formatiert für Code. \n",
43+
"\n",
44+
"Schreiben Sie in die Textzelle einen Satz und heben Sie dabei ein Wort mit **Fettdruck** hervor. \n",
45+
"Schreiben Sie anschließend `Hello Wrld`(sic!) in eine Variable. \n",
46+
"Nutzen Sie Ersetzen Funktion von Pythons String-Objekt, um das fehlerhafte Wort mit dem korrekten Wort zu ersetzen.\n",
47+
"\n",
48+
"Geben Sie die Variable aus."
49+
]
50+
},
51+
{
52+
"cell_type": "markdown",
53+
"id": "745859b2-12c3-4cf7-b7d1-b05e3d96d43c",
54+
"metadata": {},
55+
"source": [
56+
"Diese Zelle enthält einen **Fettdruck**"
57+
]
58+
},
59+
{
60+
"cell_type": "markdown",
61+
"id": "6ad79205-3766-4fe4-b3e4-6613ccd8ebae",
62+
"metadata": {},
63+
"source": [
64+
"## Aufgabe 2\n",
65+
"\n",
66+
"Laden Sie, wenn nicht bereits geschehen, von Github das Repo zu diesem Workshop unter [NLP-Workshop](https://github.com/SCDH/python-nlp-workshop) als ZIP Datei herunter. \n",
67+
"Entpacken Sie diese Datei in einem Ordner auf Ihrem PC. Öffnen Sie diesen Ordner. Erstellen Sie nun im Hub einen Ordner namens `data` und kopieren Sie alle Textdateien dort hinein. Sie können die Dateien direkt von Ihrem Explorer hier in das Hub ziehen. \n",
68+
"\n",
69+
"Lesen Sie nun die Datei `bpb_text_ki_im_klassenzimmer.txt` im Ordner `data` ein.\n",
70+
"Benutzen Sie dabei den Context Manager von Python. Infos dazu finden Sie im Infomaterial: \n",
71+
"https://github.com/SCDH/python-nlp-workshop/blob/main/Infomaterial.md#dateien-%C3%B6ffnenlesen\n",
72+
"\n",
73+
"Geben Sie anschließend den Text aus.\n",
74+
"\n",
75+
"Tipp: Schauen Sie immer wieder in das Infomaterial, wenn Sie sich nicht sicher sind. "
76+
]
77+
},
78+
{
79+
"cell_type": "code",
80+
"execution_count": null,
81+
"id": "bed40fa8-f3e0-47f7-af6f-22eb6b8f7424",
82+
"metadata": {
83+
"tags": []
84+
},
85+
"outputs": [],
86+
"source": []
87+
},
88+
{
89+
"cell_type": "markdown",
90+
"id": "572f8ea6-ed22-43e1-9fe7-2d922d8fb98e",
91+
"metadata": {},
92+
"source": [
93+
"## Aufgabe 3\n",
94+
"\n",
95+
"Laden Sie nun alle fünf Texte mittels Python zunächst einmal in eine Liste. \n",
96+
"Hierbei soll jedes Element der Liste ein Text (d.h. ein String des gesamten Textes) sein. \n",
97+
"Prüfen Sie, ob Sie alle fünf Texte geladen haben. \n",
98+
"\n",
99+
"Sie können die Bibliothek `glob` (ein Abkömmling des Unix-Tools \"global\" von 1971) nutzen, um eine Liste aller Dateien aus dem Dateisystem zu bekommen. \n",
100+
"Die Methode `glob` in der gleichnamigen Bibliothek bekommt einen Pfad als Parameter. \n",
101+
"Sie können hier auch sog. \"Wildcards\" verwenden. Mehr dazu im Infomaterial. "
102+
]
103+
},
104+
{
105+
"cell_type": "code",
106+
"execution_count": null,
107+
"id": "109798e5-f4c6-403e-9919-aa9d6e2b6633",
108+
"metadata": {
109+
"tags": []
110+
},
111+
"outputs": [],
112+
"source": []
113+
},
114+
{
115+
"cell_type": "markdown",
116+
"id": "3d42aa79-c660-4e8f-947c-aa35759ce363",
117+
"metadata": {},
118+
"source": [
119+
"## Optional: Aufgabe 4\n",
120+
"\n",
121+
"Vertiefen Sie in dieser optionalen Aufgaben das Arbeiten mit Dateien. \n",
122+
"\n",
123+
"Schreiben Sie alle Texte aus Ihrer Liste wieder in das Dateisystem zurück. \n",
124+
"Nutzen Sie dazu erneut eine for-Schleife, mit deren Hilfe Sie über die Elemente Ihrer Liste iterieren. \n",
125+
"Um die Dateien zu schreiben können sie vorher einen separaten Ordner erstellen. \n",
126+
"\n",
127+
"Tipp: Egal, ob Sie in einen neuen oder den bestehenden Ordner schreiben, Sie müssen sicher sein, dass dieser Ordner existiert. \n",
128+
"Python hat dazu in der Library `os` die Methode `makedirs()`: `os.makedirs(output_folder, exist_ok=True)`\n",
129+
"\n",
130+
"Hinzu kommt, dass Sie für jede Datei einen Dateinamen brauchen. Überlegen Sie sich, wie sie einen eindeutigen Namen für jede Datei erzeugen können. "
131+
]
132+
},
133+
{
134+
"cell_type": "code",
135+
"execution_count": null,
136+
"id": "f017a4a2-14db-4762-8659-c50888afc58a",
137+
"metadata": {},
138+
"outputs": [],
139+
"source": []
140+
},
141+
{
142+
"cell_type": "markdown",
143+
"id": "7fa4c13c-f937-4d13-b8ed-643bdba5eb27",
144+
"metadata": {},
145+
"source": [
146+
"## Aufgabe 5\n",
147+
"\n",
148+
"Schauen Sie in die Texte (entweder öffnen Sie die Dateien oder Sie lassen sich den Inhalt ihrer Textliste hier ausgeben). \n",
149+
"Sie erkennen dort in den ersten Zeilen wichtige Metainformationen zu den Texten. \n",
150+
"Zunächst wird die Kategorie genannt, dann der Titel, das Datum und schließlich die Autoren.\n",
151+
"\n",
152+
"Überlegen Sie sich eine geeignet Datenstruktur für diese Metadaten mithilfe von Python Dictionaries."
153+
]
154+
},
155+
{
156+
"cell_type": "code",
157+
"execution_count": null,
158+
"id": "f98aa6b7-e806-4281-a5f5-6607206d2abd",
159+
"metadata": {},
160+
"outputs": [],
161+
"source": []
162+
},
163+
{
164+
"cell_type": "markdown",
165+
"id": "2e94be55-d25f-41b0-aca0-ebb54eb1c0ec",
166+
"metadata": {},
167+
"source": [
168+
"## Aufgabe 6\n",
169+
"\n",
170+
"Bisher haben wir die Texte nur als Elemente einer Liste vorliegen. \n",
171+
"Wir möchten die Daten aber mehr strukturieren. \n",
172+
"\n",
173+
"Iterieren Sie über ihre Liste `texts` und nutzten Sie Pythons Methode `split()`, um den Text an Zeilenumbrüchen zu trennen. \n",
174+
"Sie werden dann eine Liste an \"Zeilen\" bekommen.\n",
175+
"\n",
176+
"Hinweis: `split()` erwartet als Parameter das Zeichen, an dem getrennt werden soll. Übergeben Sie keinen, wird standardmäßig das Leerzeichen verwendet. \n",
177+
"\n",
178+
"Überlegen Sie anschließend, wie Sie in derselben Schleife ihr Dictionary für die Metadaten befüllen können. "
179+
]
180+
},
181+
{
182+
"cell_type": "code",
183+
"execution_count": null,
184+
"id": "9f99ce68-81eb-4a52-a3c1-95b0174702f7",
185+
"metadata": {
186+
"tags": []
187+
},
188+
"outputs": [],
189+
"source": []
190+
},
191+
{
192+
"cell_type": "markdown",
193+
"id": "bd0055d5-26d7-4778-b671-b8a6399655db",
194+
"metadata": {},
195+
"source": [
196+
"## Aufgabe 7\n",
197+
"\n",
198+
"Wir wollen nun unsere strukturierten Daten auch strukturiert speichern. \n",
199+
"Dictionaries sind Datenstrukturen, die nur zur Laufzeit des Python Scripts existieren. \n",
200+
"Um Sie persistent zu speichern, müssen wir Sie in eine Datei schreiben. \n",
201+
"\n",
202+
"Tatsächlich ist es möglich, Dictionaries zu speichern. Aber wir halten uns an dieser Stelle lieber an verbreitertere Standards. \n",
203+
"Ein Standard ist CSV, Comma-Separated Values, das vom Prinzip her dieselbe Grundlage hat wie Excel Tabellen und auch in Excel verarbeitet werden können. \n",
204+
"\n",
205+
"Wollen wir also unsere Metadaten tabellarisch speichern, bietet sich das CSV-Format an. \n",
206+
"\n",
207+
"Eine Bibliothek, die in den letzten Jahren immer beliebter wurde, ist [Pandas](https://pandas.pydata.org/). \n",
208+
"Pandas kann hervorragend mit großen Tabellen umgehen. Das liegt daran, dass Tabellen sich mathematisch als Matrizen darstellen lassen. \n",
209+
"Und dafür hat Pandas einige sehr performante Methoden parat. "
210+
]
211+
},
212+
{
213+
"cell_type": "markdown",
214+
"id": "c0195395-308f-43a0-ad47-59ad44f8f20c",
215+
"metadata": {},
216+
"source": [
217+
"Installieren Sie Pandas in Ihre Umgebung, indem Sie in eine Zelle `!pip install pandas` schreiben. \n",
218+
"\n",
219+
"Nutzen Sie dazu [Pip](https://pip.pypa.io/en/stable/), den Python Package Manager. \n",
220+
"Das Installieren von Packages über den Package Manager benötigt i.d.R. ein Terminal, auch [Shell](https://wiki.ubuntuusers.de/Shell/) genannt. \n",
221+
"Einige Befehle lassen sich jedoch auch über Notebooks ausführen, wenn man ein `!` voranstellt.\n",
222+
"\n",
223+
"PIP wird Pandas installieren, sodass Sie anschließend mit `import pandas as pd` Pandas nutzen können. \n",
224+
"(Die Abkürzung `pd` hat sich in Bezug auf Pandas etabliert.)\n",
225+
"\n",
226+
"Hinweis: Das Installieren von Bibliotheken müssen Sie pro Umgebung nur einmal machen. D.h. Sie können den Befehl nach dem ersten erfolgreichen Durchlauf auskommentieren."
227+
]
228+
},
229+
{
230+
"cell_type": "code",
231+
"execution_count": null,
232+
"id": "51f160f3-9193-4cc0-97dc-7401ac5562fb",
233+
"metadata": {},
234+
"outputs": [],
235+
"source": []
236+
},
237+
{
238+
"cell_type": "markdown",
239+
"id": "846256a9-b9e7-4503-8978-8ab6bb1f89ab",
240+
"metadata": {},
241+
"source": [
242+
"## Aufgabe 8\n",
243+
"\n",
244+
"Erstellen Sie nun einen Pandas DataFrame bei dem Sie ihre Metadaten als Parameter übergeben. \n",
245+
"\n",
246+
"Speichern Sie anschließend den DataFrame in einer CSV Datei."
247+
]
248+
},
249+
{
250+
"cell_type": "code",
251+
"execution_count": null,
252+
"id": "2ab32459-036a-4db0-98f3-a3381d1c0829",
253+
"metadata": {},
254+
"outputs": [],
255+
"source": []
256+
},
257+
{
258+
"cell_type": "markdown",
259+
"id": "176e1785-9b78-43af-bb6a-ac851330ee20",
260+
"metadata": {},
261+
"source": [
262+
"## Optional: Aufgabe 9\n",
263+
"\n",
264+
"In dieser Übung wollen wir die Probleme verstehen, die entstehen, wenn wir Texte einfach mittels Zeichen trennen. \n",
265+
"\n",
266+
"Iterieren Sie wieder über ihre Texte. Überlegen Sie sich, an welchen Zeichen Sie trennen müssen, um \"Sätze\" zu erzeugen. \n",
267+
"Bedenken Sie auch, wie Sie das in Python lösen bzw. welche Probleme hier auftauchen. \n",
268+
"\n",
269+
"Sie können dann die Sätze in Ihrer Datenstruktur speichern. Am besten unter einem Schlüssel namens `sentences`. "
270+
]
271+
},
272+
{
273+
"cell_type": "code",
274+
"execution_count": null,
275+
"id": "4bd47813-b225-45d5-bdf4-8dd7e17dae43",
276+
"metadata": {
277+
"tags": []
278+
},
279+
"outputs": [],
280+
"source": []
281+
},
282+
{
283+
"cell_type": "markdown",
284+
"id": "8ffc2385-a321-4d2b-b743-ed9ddb56b009",
285+
"metadata": {},
286+
"source": [
287+
"## Aufgabe 10\n",
288+
"\n",
289+
"Als Vorübung zur finalen Aufgabe geht es nun darum, die fünf Texte an ihren Wortgrenzen aufzusplitten, um an die Wörter zu kommen. \n",
290+
"Danach müssen alle Wörter zu einer großen Wortmenge vereinigt werden. \n",
291+
"\n",
292+
"Überlegen Sie sich, wie sie ihre Liste an Texten verarbeiten können, um dies zu erreichen. \n",
293+
"Wenn Sie bereits Aufgabe 9 erledigt haben, sollten Sie davon bereits ein Verständnis haben.\n",
294+
"\n",
295+
"Schreiben Sie am Ende alle Wörter in die Variable `bow` (Bag of Words). \n",
296+
"Prüfen Sie, ob Sie auf ca. 6700 Wörter für alle fünf Texte kommen."
297+
]
298+
},
299+
{
300+
"cell_type": "code",
301+
"execution_count": null,
302+
"id": "cc2324b7-5e7d-4985-86c9-b0620821f972",
303+
"metadata": {
304+
"tags": []
305+
},
306+
"outputs": [],
307+
"source": []
308+
},
309+
{
310+
"cell_type": "markdown",
311+
"id": "79c55711-961f-4131-a6b6-45ba7844e07a",
312+
"metadata": {},
313+
"source": [
314+
"## Finale Aufgabe\n",
315+
"\n",
316+
"Als Abschluss wollen wir eine kleine Statistik über unsere Texte erstellen. \n",
317+
"Wir möchten die Wordhäufigkeit (word frequency) ermitteln. \n",
318+
"\n",
319+
"Dazu können Sie sich einmal überlegen, wie Sie die Wörter aus ihren fünf Texten zählen können. \n",
320+
"Neben dem Wort an sich wollen wir also auch die Anzahl der Vorkommnisse des Wortes ermitteln und speichern. \n",
321+
"\n",
322+
"Welche Datenstruktur wäre dazu geeignet? \n",
323+
"\n",
324+
"Bitte schreiben Sie keinen Code, sondern überlegen nur theoretisch!"
325+
]
326+
},
327+
{
328+
"cell_type": "code",
329+
"execution_count": null,
330+
"id": "c18eed89-48ed-4b8b-9ec9-6721fc139194",
331+
"metadata": {},
332+
"outputs": [],
333+
"source": [
334+
"# Hier ist Platz für ihre Notizen"
335+
]
336+
},
337+
{
338+
"cell_type": "markdown",
339+
"id": "c0238cde-88e2-40f2-80a2-e5c3a336457a",
340+
"metadata": {},
341+
"source": [
342+
"Der Grund für diesen theoretischen Ansatz ist einfach: Python besitzt bereits eine Library, die das erledigt. \n",
343+
"Wenn Sie aus der Library `collections` die Klasse `Counter` importieren, haben Sie ein umfangreiches Werkzeug für diese Aufgabe.\n",
344+
"\n",
345+
"Übergeben Sie Counter einfach ihre Liste an Wörtern mit:\n",
346+
"\n",
347+
"```python\n",
348+
"word_count = Counter(words)\n",
349+
"```\n"
350+
]
351+
},
352+
{
353+
"cell_type": "code",
354+
"execution_count": null,
355+
"id": "86bf9499-5a01-467c-aa86-b7f4a760526b",
356+
"metadata": {
357+
"tags": []
358+
},
359+
"outputs": [],
360+
"source": []
361+
}
362+
],
363+
"metadata": {
364+
"kernelspec": {
365+
"display_name": "Python 3 (ipykernel)",
366+
"language": "python",
367+
"name": "python3"
368+
},
369+
"language_info": {
370+
"codemirror_mode": {
371+
"name": "ipython",
372+
"version": 3
373+
},
374+
"file_extension": ".py",
375+
"mimetype": "text/x-python",
376+
"name": "python",
377+
"nbconvert_exporter": "python",
378+
"pygments_lexer": "ipython3",
379+
"version": "3.10.8"
380+
},
381+
"toc-autonumbering": false
382+
},
383+
"nbformat": 4,
384+
"nbformat_minor": 5
385+
}

0 commit comments

Comments
 (0)