|
3 | 3 | { |
4 | 4 | "cell_type": "markdown", |
5 | 5 | "source": [ |
6 | | - "# Udfordring: Analyse af tekst om Data Science\n", |
| 6 | + "# Udfordring: Analyse af tekst om datalogi\n", |
7 | 7 | "\n", |
8 | | - "I dette eksempel skal vi lave en simpel øvelse, der dækker alle trin i en traditionel data science-proces. Du behøver ikke skrive nogen kode, du kan blot klikke på cellerne nedenfor for at udføre dem og observere resultatet. Som en udfordring opfordres du til at prøve denne kode med forskellige data.\n", |
| 8 | + "I dette eksempel laver vi en simpel øvelse, der dækker alle trin i en traditionel datalogiproces. Du behøver ikke at skrive nogen kode, du kan blot klikke på cellerne nedenfor for at køre dem og observere resultatet. Som en udfordring opfordres du til at prøve denne kode med forskellige data.\n", |
9 | 9 | "\n", |
10 | 10 | "## Mål\n", |
11 | 11 | "\n", |
12 | | - "I denne lektion har vi diskuteret forskellige begreber relateret til Data Science. Lad os prøve at opdage flere relaterede begreber ved at lave noget **tekstmining**. Vi starter med en tekst om Data Science, udtrækker nøgleord fra den og forsøger derefter at visualisere resultatet.\n", |
| 12 | + "I denne lektion har vi diskuteret forskellige begreber relateret til datalogi. Lad os prøve at opdage flere relaterede begreber ved at lave noget **tekstmining**. Vi starter med en tekst om datalogi, udtrækker nøgleord fra den og prøver derefter at visualisere resultatet.\n", |
13 | 13 | "\n", |
14 | | - "Som tekst vil jeg bruge siden om Data Science fra Wikipedia:\n" |
| 14 | + "Som tekst vil jeg bruge siden om datalogi fra Wikipedia:\n" |
15 | 15 | ], |
16 | 16 | "metadata": {} |
17 | 17 | }, |
|
32 | 32 | { |
33 | 33 | "cell_type": "markdown", |
34 | 34 | "source": [ |
35 | | - "## Trin 1: Hente dataene\n", |
| 35 | + "## Trin 1: Hent dataene\n", |
36 | 36 | "\n", |
37 | | - "Første trin i enhver datavidenskabelig proces er at hente dataene. Vi vil bruge biblioteket `requests` til dette:\n" |
| 37 | + "Første trin i enhver data science-proces er at hente dataene. Vi vil bruge `requests` biblioteket til det:\n" |
38 | 38 | ], |
39 | 39 | "metadata": {} |
40 | 40 | }, |
|
68 | 68 | "source": [ |
69 | 69 | "## Trin 2: Transformering af data\n", |
70 | 70 | "\n", |
71 | | - "Det næste trin er at omdanne dataene til en form, der er egnet til behandling. I vores tilfælde har vi downloadet HTML-kildekoden fra siden, og vi skal konvertere den til ren tekst.\n", |
| 71 | + "Det næste trin er at konvertere dataene til en form egnet til behandling. I vores tilfælde har vi downloadet HTML-kildekoden fra siden, og vi skal konvertere den til almindelig tekst.\n", |
72 | 72 | "\n", |
73 | | - "Der er mange måder, dette kan gøres på. Vi vil bruge det enkleste indbyggede objekt, [HTMLParser](https://docs.python.org/3/library/html.parser.html), fra Python. Vi skal oprette en underklasse af `HTMLParser`-klassen og definere koden, der vil indsamle al tekst inde i HTML-tags, undtagen `<script>`- og `<style>`-tags.\n" |
| 73 | + "Der er mange måder, hvorpå dette kan gøres. Vi vil bruge [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/), et populært Python-bibliotek til at analysere HTML. BeautifulSoup giver os mulighed for at målrette specifikke HTML-elementer, så vi kan fokusere på hovedartiklens indhold fra Wikipedia og reducere nogle navigationsmenuer, sidepaneler, sidefødder og andet irrelevant indhold (selvom noget standardsprog stadig kan være tilbage).\n" |
74 | 74 | ], |
75 | 75 | "metadata": {} |
76 | 76 | }, |
| 77 | + { |
| 78 | + "cell_type": "markdown", |
| 79 | + "source": [ |
| 80 | + "Først skal vi installere BeautifulSoup-biblioteket til HTML-parsing:\n" |
| 81 | + ], |
| 82 | + "metadata": {} |
| 83 | + }, |
| 84 | + { |
| 85 | + "cell_type": "code", |
| 86 | + "execution_count": null, |
| 87 | + "source": [ |
| 88 | + "import sys\r\n", |
| 89 | + "!{sys.executable} -m pip install beautifulsoup4" |
| 90 | + ], |
| 91 | + "outputs": [], |
| 92 | + "metadata": {} |
| 93 | + }, |
77 | 94 | { |
78 | 95 | "cell_type": "code", |
79 | 96 | "execution_count": 64, |
80 | 97 | "source": [ |
81 | | - "from html.parser import HTMLParser\r\n", |
82 | | - "\r\n", |
83 | | - "class MyHTMLParser(HTMLParser):\r\n", |
84 | | - " script = False\r\n", |
85 | | - " res = \"\"\r\n", |
86 | | - " def handle_starttag(self, tag, attrs):\r\n", |
87 | | - " if tag.lower() in [\"script\",\"style\"]:\r\n", |
88 | | - " self.script = True\r\n", |
89 | | - " def handle_endtag(self, tag):\r\n", |
90 | | - " if tag.lower() in [\"script\",\"style\"]:\r\n", |
91 | | - " self.script = False\r\n", |
92 | | - " def handle_data(self, data):\r\n", |
93 | | - " if str.strip(data)==\"\" or self.script:\r\n", |
94 | | - " return\r\n", |
95 | | - " self.res += ' '+data.replace('[ edit ]','')\r\n", |
96 | | - "\r\n", |
97 | | - "parser = MyHTMLParser()\r\n", |
98 | | - "parser.feed(text)\r\n", |
99 | | - "text = parser.res\r\n", |
100 | | - "print(text[:1000])" |
| 98 | + "from bs4 import BeautifulSoup\r\n\r\n# Parse the HTML content\r\nsoup = BeautifulSoup(text, 'html.parser')\r\n\r\n# Extract only the main article content from Wikipedia\r\n# Wikipedia uses 'mw-parser-output' class for the main article content\r\ncontent = soup.find('div', class_='mw-parser-output')\r\n\r\ndef clean_wikipedia_content(content_node):\r\n \"\"\"Remove common non-article elements from a Wikipedia content node.\"\"\"\r\n # Strip jump links, navboxes, reference lists/superscripts, edit sections, TOC, sidebars, etc.\r\n selectors = [\r\n '.mw-jump-link',\r\n '.navbox',\r\n '.reflist',\r\n 'sup.reference',\r\n '.mw-editsection',\r\n '.hatnote',\r\n '.metadata',\r\n '.infobox',\r\n '#toc',\r\n '.toc',\r\n '.sidebar',\r\n ]\r\n for selector in selectors:\r\n for el in content_node.select(selector):\r\n el.decompose()\r\n\r\nif content:\r\n # Clean the content node to better approximate article text only.\r\n clean_wikipedia_content(content)\r\n text = content.get_text(separator=' ', strip=True)\r\n print(text[:1000])\r\nelse:\r\n print(\"Could not find main content. Using full page text.\")\r\n text = soup.get_text(separator=' ', strip=True)\r\n print(text[:1000])" |
101 | 99 | ], |
102 | 100 | "outputs": [ |
103 | 101 | { |
104 | 102 | "output_type": "stream", |
105 | 103 | "name": "stdout", |
106 | 104 | "text": [ |
107 | | - " Data science - Wikipedia Data science From Wikipedia, the free encyclopedia Jump to navigation Jump to search Interdisciplinary field of study focused on deriving knowledge and insights from data Not to be confused with information science . The existence of Comet NEOWISE (here depicted as a series of red dots) was discovered by analyzing astronomical survey data acquired by a space telescope , the Wide-field Infrared Survey Explorer . Part of a series on Machine learning and data mining Problems Classification Clustering Regression Anomaly detection AutoML Association rules Reinforcement learning Structured prediction Feature engineering Feature learning Online learning Semi-supervised learning Unsupervised learning Learning to rank Grammar induction Supervised learning ( classification • regression ) Decision trees Ensembles Bagging Boosting Random forest k -NN Linear regression Naive Bayes Artificial neural networks Logistic regression Perceptron Relevance vector machine \n" |
| 105 | + "Data science From Wikipedia, the free encyclopedia Interdisciplinary field of study focused on deriving knowledge and insights from data Data science is an interdisciplinary academic field that uses statistics, scientific computing, scientific methods, processes, algorithms and systems to extract or extrapolate knowledge and insights from noisy, structured, and unstructured data. Data science also integrates domain knowledge from the underlying application domain. Data science is multifaceted and can be described as a science, a research paradigm, a research method, a discipline, a workflow, and a profession.\n" |
108 | 106 | ] |
109 | 107 | } |
110 | 108 | ], |
|
115 | 113 | "source": [ |
116 | 114 | "## Trin 3: Få indsigt\n", |
117 | 115 | "\n", |
118 | | - "Det vigtigste trin er at omdanne vores data til en form, hvorfra vi kan udlede indsigt. I vores tilfælde ønsker vi at udtrække nøgleord fra teksten og se, hvilke nøgleord der er mest meningsfulde.\n", |
| 116 | + "Det vigtigste trin er at omdanne vores data til en form, hvorfra vi kan udlede indsigt. I vores tilfælde vil vi udtrække nøgleord fra teksten og se, hvilke nøgleord der er mere meningsfulde.\n", |
119 | 117 | "\n", |
120 | | - "Vi vil bruge et Python-bibliotek kaldet [RAKE](https://github.com/aneesha/RAKE) til nøgleordsudtrækning. Først skal vi installere dette bibliotek, hvis det ikke allerede er til stede:\n" |
| 118 | + "Vi vil bruge Python-biblioteket kaldet [RAKE](https://github.com/aneesha/RAKE) til nøgleordsudtrækning. Først skal vi installere dette bibliotek, hvis det ikke allerede er til stede: \n" |
121 | 119 | ], |
122 | 120 | "metadata": {} |
123 | 121 | }, |
|
162 | 160 | { |
163 | 161 | "cell_type": "markdown", |
164 | 162 | "source": [ |
165 | | - "Den primære funktionalitet er tilgængelig fra `Rake`-objektet, som vi kan tilpasse ved hjælp af nogle parametre. I vores tilfælde vil vi indstille den minimale længde af et nøgleord til 5 tegn, den minimale frekvens af et nøgleord i dokumentet til 3, og det maksimale antal ord i et nøgleord til 2. Du er velkommen til at eksperimentere med andre værdier og observere resultatet.\n" |
| 163 | + "Hovedfunktionen er tilgængelig fra `Rake`-objektet, som vi kan tilpasse ved hjælp af nogle parametre. I vores tilfælde vil vi sætte den minimale længde af et nøgleord til 5 tegn, den minimale hyppighed af et nøgleord i dokumentet til 3, og maksimalt antal ord i et nøgleord til 2. Du er velkommen til at eksperimentere med andre værdier og observere resultatet.\n" |
166 | 164 | ], |
167 | 165 | "metadata": {} |
168 | 166 | }, |
|
211 | 209 | { |
212 | 210 | "cell_type": "markdown", |
213 | 211 | "source": [ |
214 | | - "Vi har fået en liste over termer sammen med deres tilknyttede vigtighedsgrad. Som du kan se, er de mest relevante discipliner, såsom maskinlæring og big data, til stede på listen i de øverste positioner.\n", |
| 212 | + "Vi har opnået en liste over termer sammen med tilknyttet grad af vigtighed. Som du kan se, er de mest relevante discipliner, såsom maskinlæring og big data, til stede øverst på listen.\n", |
215 | 213 | "\n", |
216 | 214 | "## Trin 4: Visualisering af resultatet\n", |
217 | 215 | "\n", |
218 | | - "Folk kan bedst fortolke data i visuel form. Derfor giver det ofte mening at visualisere dataene for at få nogle indsigter. Vi kan bruge `matplotlib`-biblioteket i Python til at plotte en simpel fordeling af nøgleordene med deres relevans:\n" |
| 216 | + "Folk kan bedst fortolke data i visuel form. Derfor giver det ofte mening at visualisere dataene for at opnå nogle indsigter. Vi kan bruge `matplotlib`-biblioteket i Python til at plotte simpel fordeling af nøgleordene med deres relevans:\n" |
219 | 217 | ], |
220 | 218 | "metadata": {} |
221 | 219 | }, |
|
252 | 250 | { |
253 | 251 | "cell_type": "markdown", |
254 | 252 | "source": [ |
255 | | - "Der er dog en endnu bedre måde at visualisere ordfrekvenser på - ved hjælp af **Word Cloud**. Vi skal installere et andet bibliotek for at plotte ordskyen fra vores nøgleordsliste.\n" |
| 253 | + "Der er dog en endnu bedre måde at visualisere ordhyppigheder på - ved hjælp af **Word Cloud**. Vi skal installere et andet bibliotek for at plotte word cloud fra vores nøgleords liste.\n" |
256 | 254 | ], |
257 | 255 | "metadata": {} |
258 | 256 | }, |
|
268 | 266 | { |
269 | 267 | "cell_type": "markdown", |
270 | 268 | "source": [ |
271 | | - "`WordCloud`-objektet er ansvarligt for at tage enten originaltekst eller en forudberegnet liste over ord med deres frekvenser og returnerer et billede, som derefter kan vises ved hjælp af `matplotlib`:\n" |
| 269 | + "`WordCloud`-objektet er ansvarligt for at tage enten original tekst eller en forudberegnet liste over ord med deres frekvenser, og returnerer et billede, som derefter kan vises ved hjælp af `matplotlib`:\n" |
272 | 270 | ], |
273 | 271 | "metadata": {} |
274 | 272 | }, |
|
372 | 370 | { |
373 | 371 | "cell_type": "markdown", |
374 | 372 | "source": [ |
375 | | - "Du kan se, at ordskyen nu ser mere imponerende ud, men den indeholder også en del støj (f.eks. irrelevante ord som `Retrieved on`). Derudover får vi færre nøgleord, der består af to ord, såsom *data scientist* eller *computer science*. Dette skyldes, at RAKE-algoritmen gør et langt bedre stykke arbejde med at udvælge gode nøgleord fra teksten. Dette eksempel illustrerer vigtigheden af dataforbehandling og -rensning, da et klart billede i sidste ende vil give os mulighed for at træffe bedre beslutninger.\n", |
| 373 | + "Du kan se, at ordsky nu ser mere imponerende ud, men den indeholder også en masse støj (f.eks. ikke-relaterede ord som `Retrieved on`). Desuden får vi færre nøgleord, der består af to ord, såsom *data scientist* eller *computer science*. Det skyldes, at RAKE-algoritmen gør et langt bedre stykke arbejde med at udvælge gode nøgleord fra teksten. Dette eksempel illustrerer vigtigheden af dataforbehandling og rengøring, fordi et klart billede til sidst vil gøre os i stand til at træffe bedre beslutninger.\n", |
376 | 374 | "\n", |
377 | | - "I denne øvelse har vi gennemgået en simpel proces med at udtrække mening fra Wikipedia-tekst i form af nøgleord og en ordsky. Dette eksempel er ret enkelt, men det viser tydeligt alle de typiske trin, en data scientist vil tage, når de arbejder med data, fra dataindsamling til visualisering.\n", |
| 375 | + "I denne øvelse har vi gennemgået en simpel proces til at udtrække mening fra Wikipedia-tekst i form af nøgleord og ordsky. Dette eksempel er ret enkelt, men det demonstrerer godt alle typiske trin, en data scientist vil tage, når han arbejder med data, startende fra dataindhentning til visualisering.\n", |
378 | 376 | "\n", |
379 | 377 | "I vores kursus vil vi diskutere alle disse trin i detaljer.\n" |
380 | 378 | ], |
|
394 | 392 | "cell_type": "markdown", |
395 | 393 | "metadata": {}, |
396 | 394 | "source": [ |
397 | | - "\n---\n\n**Ansvarsfraskrivelse**: \nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.\n" |
| 395 | + "---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Ansvarsfraskrivelse**:\nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n" |
398 | 396 | ] |
399 | 397 | } |
400 | 398 | ], |
|
418 | 416 | }, |
419 | 417 | "interpreter": { |
420 | 418 | "hash": "c28e7b6bf4e5b397b8288a85bf0a94ea8d3585ce2b01919feb195678ec71581b" |
421 | | - }, |
422 | | - "coopTranslator": { |
423 | | - "original_hash": "50c0f0a5204a18405611cbe7e0fec56b", |
424 | | - "translation_date": "2025-09-01T23:30:25+00:00", |
425 | | - "source_file": "1-Introduction/01-defining-data-science/notebook.ipynb", |
426 | | - "language_code": "da" |
427 | 419 | } |
428 | 420 | }, |
429 | 421 | "nbformat": 4, |
|
0 commit comments