You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Data-Science-For-Beginners/translations/et/1-Introduction/01-defining-data-science/notebook.ipynb

322 lines
11 KiB

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Väljakutse: Andmeteaduse teksti analüüs\n",
"\n",
"Selles näites teeme lihtsa harjutuse, mis hõlmab kõiki traditsioonilise andmeteaduse protsessi samme. Sa ei pea kirjutama mingit koodi, saad lihtsalt allolevatel lahtritel klikata, et neid käivitada ja tulemust vaadata. Väljakutsena soovitatakse proovida seda koodi erinevate andmetega.\n",
"\n",
"## Eesmärk\n",
"\n",
"Selles õppetükis oleme arutanud erinevaid andmeteadusega seotud mõisteid. Proovime avastada rohkem seotud mõisteid, tehes **tekstikaevandust**. Alustame tekstiga andmeteadusest, väljavõtame sellest märksõnad ja proovitame tulemuse visualiseerida.\n",
"\n",
"Tekstina kasutan Wikipedia andmeteaduse lehte:\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": [
"## Samm 1: Andmete hankimine\n",
"\n",
"Iga andmeteaduse protsessi esimene samm on andmete hankimine. Selleks kasutame `requests` teeki:\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": [
"## Samm 2: Andmete töötlemine\n",
"\n",
"Järgmine samm on andmete teisendamine protsessimiseks sobivasse vormingusse. Meie puhul oleme lehelt alla laadinud HTML algkoodi ja peame selle teisendama lihttekstiks.\n",
"\n",
"Seda saab teha mitmel moel. Me kasutame [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/), populaarset Python'i teeki HTML-i töötlemiseks. BeautifulSoup võimaldab meil sihtida konkreetseid HTML elemente, et keskenduda Wikipedia põhisisule ja vähendada mõningaid navigeerimismenüüsid, külgribasid, jaluseid ja muud ebaolulist sisu (kuigi osa malli teksti võib siiski alles jääda).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Esiteks peame HTML-i parsimiseks paigaldama BeautifulSoupi teegi:\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": [
"## Samm 3: Tõlgenduste saamine\n",
"\n",
"Kõige olulisem samm on andmete muutmine selliseks kujuks, millest saame tõlgendusi teha. Meie puhul tahame tekstist välja tuua märksõnad ja vaadata, millised märksõnad on tähendusrikkamad.\n",
"\n",
"Kasutame märksõnade väljavõtmiseks Python'i teeki nimega [RAKE](https://github.com/aneesha/RAKE). Esiteks paigaldame selle teegi juhuks, kui seda veel ei ole: \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": [
"Peamine funktsionaalsus on saadaval objektist `Rake`, mida saame kohandada mitmete parameetrite abil. Meie puhul seame märksõna miinimumpikkuseks 5 tähemärki, märksõna miinimumsageduseks dokumendis 3 ning märksõnas olevate sõnade maksimumarvuks 2. Mängi julgelt teiste väärtustega ja vaata tulemust.\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",
"Saime termini nimekirja koos seotud tähtsuse astmega. Nagu näha, on nimekirjas esikohal kõige asjakohasemad valdkonnad, nagu masinõpe ja suurandmed.\n",
"\n",
"## Samm 4: Tulemus visualiseerimine\n",
"\n",
"Inimesed suudavad andmeid kõige paremini tõlgendada visuaalses vormis. Seetõttu on sageli mõistlik andmeid visualiseerida, et teha mõningaid järeldusi. Saame kasutada Pythoni `matplotlib` teeki, et joonistada lihtne võtmesõnade ja nende asjakohasuse jaotus:\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": [
"Veelgi parem viis sõnasageduste visualiseerimiseks on **Sõnapilve** kasutamine. Me peame installima teise teegi, et joonistada sõnapilv meie märksõnalistist.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"!{sys.executable} -m pip install wordcloud"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`WordCloud` objekt vastutab kas originaalteksti või eelnevalt arvutatud sõnade sageduste nimekirja vastuvõtmise eest ning tagastab pildi, mida saab seejärel kuvada kasutades `matplotlib`-i:\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": [
"Me võime samuti anda `WordCloud`-ile algse teksti - vaatame, kas suudame saada sarnase tulemuse:\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": [
"Nüüd näete, et sõnapilv näeb välja muljetavaldavam, kuid sisaldab ka palju müra (nt mitteasuvaid sõnu nagu `Retrieved on`). Samuti saame vähem märksõnu, mis koosnevad kahest sõnast, näiteks *andmeteadlane* või *rakendusinformaatika*. See on sellepärast, et RAKE algoritm töötab tekstist head märksõnad välja valides palju paremini. See näide illustreerib andmete eeltöötluse ja puhastamise olulisust, sest selge pilt lõpus võimaldab meil teha paremaid otsuseid.\n",
"\n",
"Selles harjutuses oleme läbinud lihtsa protsessi, kuidas tuua Wikipedia tekstist välja tähendust märksõnade ja sõnapilve vormis. See näide on üsna lihtne, kuid demonstreerib hästi kõiki tüüpilisi samme, mida andmeteadlane teeb andmetega töötades, alates andmete hankimisest kuni visualiseerimiseni.\n",
"\n",
"Meie kursusel käsitleme kõiki neid samme üksikasjalikult.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Lahtiütlus**:\nSee dokument on tõlgitud kasutades AI tõlketeenust [Co-op Translator](https://github.com/Azure/co-op-translator). Kuigi me püüdleme täpsuse poole, palun pange tähele, et automatiseeritud tõlgetes võib esineda vigu või ebatäpsusi. Originaaldokument selle emakeeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitatakse kasutada professionaalset inimtõlget. Me ei vastuta selle tõlkega seotud eksimustest või valesti mõistmistest.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\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
}