{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Herausforderung: Analyse eines Textes über Data Science\n", "\n", "In diesem Beispiel machen wir eine einfache Übung, die alle Schritte eines traditionellen Data-Science-Prozesses abdeckt. Du musst keinen Code schreiben, du kannst einfach auf die Zellen unten klicken, um sie auszuführen und das Ergebnis zu beobachten. Als Herausforderung wirst du ermutigt, diesen Code mit verschiedenen Daten auszuprobieren. \n", "\n", "## Ziel\n", "\n", "In dieser Lektion haben wir verschiedene Konzepte im Zusammenhang mit Data Science besprochen. Versuchen wir, weitere verwandte Konzepte durch **Text Mining** zu entdecken. Wir beginnen mit einem Text über Data Science, extrahieren Schlüsselwörter daraus und versuchen dann, das Ergebnis zu visualisieren.\n", "\n", "Als Text werde ich die Seite über Data Science von Wikipedia verwenden:\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "url = 'https://en.wikipedia.org/wiki/Data_science'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Schritt 1: Die Daten beschaffen\n", "\n", "Der erste Schritt in jedem Datenwissenschaftsprozess ist das Beschaffen der Daten. Wir werden die `requests` Bibliothek dafür verwenden:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import requests\n", "\n", "# Define a custom header.\n", "headers = {\n", " 'User-Agent': 'DataScienceChallenge/1.0 (myemail@gmail.com)'\n", "}\n", "\n", "# Pass the headers into the get request\n", "response = requests.get(url, headers=headers)\n", "\n", "if response.status_code == 200:\n", " text = response.content.decode('utf-8')\n", " print(text[:1000])\n", "else:\n", " print(f\"Error: {response.status_code}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Schritt 2: Die Daten transformieren\n", "\n", "Der nächste Schritt besteht darin, die Daten in eine für die Verarbeitung geeignete Form zu bringen. In unserem Fall haben wir den HTML-Quellcode der Seite heruntergeladen und müssen ihn in reinen Text umwandeln.\n", "\n", "Es gibt viele Möglichkeiten, dies zu tun. Wir verwenden [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/), eine beliebte Python-Bibliothek zum Parsen von HTML. BeautifulSoup ermöglicht es uns, gezielt bestimmte HTML-Elemente anzusteuern, sodass wir uns auf den Hauptartikelinhalt von Wikipedia konzentrieren und einige Navigationsmenüs, Seitenleisten, Footer und andere irrelevante Inhalte reduzieren können (obwohl einige Boilerplate-Texte möglicherweise weiterhin vorhanden sind).\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Zuerst müssen wir die BeautifulSoup-Bibliothek für die HTML-Analyse installieren:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import sys\n", "!{sys.executable} -m pip install beautifulsoup4" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from bs4 import BeautifulSoup\n", "\n", "# Parse the HTML content\n", "soup = BeautifulSoup(text, 'html.parser')\n", "\n", "# Extract only the main article content from Wikipedia\n", "# Wikipedia uses 'mw-parser-output' class for the main article content\n", "content = soup.find('div', class_='mw-parser-output')\n", "\n", "def clean_wikipedia_content(content_node):\n", " \"\"\"Remove common non-article elements from a Wikipedia content node.\"\"\"\n", " # Strip jump links, navboxes, reference lists/superscripts, edit sections, TOC, sidebars, etc.\n", " selectors = [\n", " '.mw-jump-link',\n", " '.navbox',\n", " '.reflist',\n", " 'sup.reference',\n", " '.mw-editsection',\n", " '.hatnote',\n", " '.metadata',\n", " '.infobox',\n", " '#toc',\n", " '.toc',\n", " '.sidebar',\n", " ]\n", " for selector in selectors:\n", " for el in content_node.select(selector):\n", " el.decompose()\n", "\n", "if content:\n", " # Clean the content node to better approximate article text only.\n", " clean_wikipedia_content(content)\n", " text = content.get_text(separator=' ', strip=True)\n", " print(text[:1000])\n", "else:\n", " print(\"Could not find main content. Using full page text.\")\n", " text = soup.get_text(separator=' ', strip=True)\n", " print(text[:1000])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Schritt 3: Erkenntnisse gewinnen\n", "\n", "Der wichtigste Schritt ist, unsere Daten in eine Form zu bringen, aus der wir Erkenntnisse gewinnen können. In unserem Fall möchten wir Schlüsselwörter aus dem Text extrahieren und sehen, welche Schlüsselwörter bedeutungsvoller sind.\n", "\n", "Wir werden die Python-Bibliothek [RAKE](https://github.com/aneesha/RAKE) zur Schlüsselwortextraktion verwenden. Zuerst installieren wir diese Bibliothek, falls sie nicht vorhanden ist: \n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import sys\n", "!{sys.executable} -m pip install nlp_rake" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Die Hauptfunktionalität ist über das `Rake`-Objekt verfügbar, das wir mit einigen Parametern anpassen können. In unserem Fall setzen wir die Mindestlänge eines Schlüsselworts auf 5 Zeichen, die Mindesthäufigkeit eines Schlüsselworts im Dokument auf 3 und die maximale Anzahl von Wörtern in einem Schlüsselwort auf 2. Probieren Sie gerne andere Werte aus und beobachten Sie das Ergebnis.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import nlp_rake\n", "extractor = nlp_rake.Rake(max_words=2,min_freq=3,min_chars=5)\n", "res = extractor.apply(text)\n", "res" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Wir haben eine Liste von Begriffen zusammen mit dem zugehörigen Wichtigkeitsgrad erhalten. Wie Sie sehen können, sind die relevantesten Disziplinen, wie maschinelles Lernen und Big Data, ganz oben in der Liste vorhanden.\n", "\n", "## Schritt 4: Visualisierung des Ergebnisses\n", "\n", "Menschen können Daten am besten in visueller Form interpretieren. Daher ist es oft sinnvoll, die Daten zu visualisieren, um Erkenntnisse zu gewinnen. Wir können die `matplotlib`-Bibliothek in Python verwenden, um eine einfache Verteilung der Schlüsselwörter mit ihrer Relevanz darzustellen:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", "def plot(pair_list):\n", " k,v = zip(*pair_list)\n", " plt.bar(range(len(k)),v)\n", " plt.xticks(range(len(k)),k,rotation='vertical')\n", " plt.show()\n", "\n", "plot(res)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Es gibt jedoch eine noch bessere Möglichkeit, Wortfrequenzen zu visualisieren – mit einer **Wortwolke**. Wir müssen eine weitere Bibliothek installieren, um die Wortwolke aus unserer Schlüsselwortliste zu erstellen.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!{sys.executable} -m pip install wordcloud" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Das `WordCloud`-Objekt ist dafür verantwortlich, entweder ursprünglichen Text oder eine vorab berechnete Liste von Wörtern mit ihren Häufigkeiten zu übernehmen und ein Bild zurückzugeben, das dann mit `matplotlib` angezeigt werden kann:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from wordcloud import WordCloud\n", "import matplotlib.pyplot as plt\n", "\n", "wc = WordCloud(background_color='white',width=800,height=600)\n", "plt.figure(figsize=(15,7))\n", "plt.imshow(wc.generate_from_frequencies({ k:v for k,v in res }))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wir können auch den Originaltext an `WordCloud` übergeben – schauen wir mal, ob wir ein ähnliches Ergebnis erhalten:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.figure(figsize=(15,7))\n", "plt.imshow(wc.generate(text))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "wc.generate(text).to_file('images/ds_wordcloud.png')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sie können sehen, dass die Wortwolke jetzt beeindruckender aussieht, aber sie enthält auch viel Lärm (z. B. unzusammenhängende Wörter wie `Retrieved on`). Außerdem erhalten wir weniger Schlüsselwörter, die aus zwei Wörtern bestehen, wie *data scientist* oder *computer science*. Das liegt daran, dass der RAKE-Algorithmus bei der Auswahl guter Schlüsselwörter aus Text viel besser arbeitet. Dieses Beispiel verdeutlicht die Bedeutung der Datenvorverarbeitung und -bereinigung, da uns ein klares Bild am Ende ermöglicht, bessere Entscheidungen zu treffen.\n", "\n", "In dieser Übung haben wir einen einfachen Prozess durchlaufen, um aus Wikipedia-Texten in Form von Schlüsselwörtern und einer Wortwolke etwas Bedeutung zu extrahieren. Dieses Beispiel ist recht einfach, zeigt aber gut alle typischen Schritte, die ein Data Scientist bei der Arbeit mit Daten durchführt – von der Datenbeschaffung bis zur Visualisierung.\n", "\n", "In unserem Kurs werden wir all diese Schritte ausführlich besprechen. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n\n\n**Haftungsausschluss**:\nDieses Dokument wurde mit dem KI-Übersetzungsdienst [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner Ursprungssprache gilt als maßgebliche Quelle. Bei kritischen Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die aus der Verwendung dieser Übersetzung entstehen.\n\n" ] } ], "metadata": { "interpreter": { "hash": "c28e7b6bf4e5b397b8288a85bf0a94ea8d3585ce2b01919feb195678ec71581b" }, "kernelspec": { "display_name": "Python 3.8.11 64-bit ('base': conda)", "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.8.11" } }, "nbformat": 4, "nbformat_minor": 2 }