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.
322 lines
17 KiB
322 lines
17 KiB
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# 챌린지: 데이터 과학에 관한 텍스트 분석\n",
|
|
"\n",
|
|
"이 예제에서는 전통적인 데이터 과학 프로세스의 모든 단계를 포함하는 간단한 연습을 해보겠습니다. 코드를 작성할 필요 없이 아래 셀을 클릭하여 실행하고 결과를 관찰하면 됩니다. 도전 과제로서, 다른 데이터로 이 코드를 시도해 보도록 권장합니다.\n",
|
|
"\n",
|
|
"## 목표\n",
|
|
"\n",
|
|
"이 수업에서는 데이터 과학과 관련된 다양한 개념들을 논의했습니다. 텍스트 마이닝을 수행하여 관련 개념들을 더 발견해 봅시다. 데이터 과학에 관한 텍스트를 시작으로, 핵심 단어를 추출하고, 그 결과를 시각화해 보겠습니다.\n",
|
|
"\n",
|
|
"텍스트로는 위키피디아의 데이터 과학 페이지를 사용할 것입니다:\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": [
|
|
"## ជំហានទី 1៖ ទទួលបានទិន្នន័យ\n",
|
|
"\n",
|
|
"ជំហានដំបូងនៅក្នុងដំណើរការវិទ្យាសាស្ត្រទិន្នន័យគឺការទទួលបានទិន្នន័យ។ យើងនឹងប្រើបណ្ណាល័យ `requests` ដើម្បីធ្វើការនោះ៖\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": [
|
|
"## ជំហានទី 2៖ ការបម្លែងទិន្នន័យ\n",
|
|
"\n",
|
|
"ជំហានបន្ទាប់គឺបម្លែងទិន្នន័យឲ្យទៅជារូបមន្តសមរម្យសម្រាប់ការគ្រប់គ្រង។ ក្នុងករណីរបស់យើង យើងបានទាញយកកូដប្រភព HTML ពីទំព័រ ហើយយើងត្រូវបម្លែងវាទៅជាអត្ថបទសាមញ្ញ។\n",
|
|
"\n",
|
|
"មានវិធីជាច្រើនដែលអាចធ្វើបាន។ យើងនឹងប្រើ [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/), ប្រមាញ់បណ្ណាល័យ Python ដែលមានប្រជាប្រិយសម្រាប់ការវិភាគ HTML។ BeautifulSoup អនុញ្ញាតឲ្យយើងបំផ្តោតលើធាតុ HTML ជាក់លាក់ ដូច្នេះ យើងអាចផ្តោតទៅលើមាតិកាចម្បងអត្ថបទពីវិគីភីឌា ហើយកាត់បន្ថយម៉ឺនុយនាវីហ្គេស៊ិន ខាងប័ររបស់ទំព័រ ខាងក្រោម និងមាតិកាដែលគ្មានទាក់ទងផ្សេងទៀត (ទោះបីជាអត្ថបទរចនាសម្ព័ន្ធខ្លះនៅតែមាន)។\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"ជាដំបូង យើងត្រូវតែដំឡើងបណ្ណាល័យ BeautifulSoup សម្រាប់វិភាគ HTML៖\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": [
|
|
"## ជំហានទី 3៖ ទទួលបានការយល់ឃើញ\n",
|
|
"\n",
|
|
"ជំហានសំខាន់បំផុតគឺបម្លែងទិន្នន័យរបស់យើងឱ្យទៅជារូបភាពមួយដែលយើងអាចទាញយកការយល់ឃើញបាន។ ក្នុងករណីរបស់យើង យើងចង់បញ្ចេញពាក្យគន្លឹះពីអត្ថបទ ហើយមើលថាពាក្យគន្លឹះណាដែលមានន័យច្រើនជាងគេ។\n",
|
|
"\n",
|
|
"យើងនឹងប្រើបណ្ណាល័យ Python ដែលមានឈ្មោះ [RAKE](https://github.com/aneesha/RAKE) សម្រាប់ការបញ្ចេញពាក្យគន្លឹះ។ ជាដំបូង យើងត្រូវតំឡើងបណ្ណាល័យនេះ ប្រសិនបើវាមិនមាននៅក្នុងប្រព័ន្ធ៖ \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": [
|
|
"មុខងារសំខាន់សំរាប់ត្រូវបានផ្តល់ពីវត្ថុ `Rake` ដែលយើងអាចផ្លាស់ប្ដូរតាមប៉ារ៉ាម៉ែត្រ។ ក្នុងករណីរបស់យើង យើងនឹងកំណត់រយៈអក្សរតិចជាងទៅរបស់ពាក្យគន្លឹះជា 5 តួអក្សរ ជ្រុលតូចបំផុតនៃការត្រួតពិនិត្យនៃពាក្យគន្លឹះក្នុងឯកសារជា 3 និងចំនួនពាក្យអតិបរមានៅក្នុងពាក្យគន្លឹះជា 2។ អ្នកអាចលេងជាមួយតម្លៃផ្សេងទៀត ហើយសង្កេតមើលលទ្ធផល។\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",
|
|
"យើងបានទទួលបញ្ជីពាក្យជារួចជាមួយនឹងកំរិតសំខាន់ដែលទាក់ទង។ ដូចដែលអ្នកអាចឃើញបាន វិស័យដែលពាក់ព័ន្ធបំផុត ដូចជាការសិក្សាចំណេះដឹងផ្លូវម៉ាស៊ីន និងទិន្នន័យធំ មានតំណែងនៅខាងលើនៃបញ្ជី។\n",
|
|
"\n",
|
|
"## ជំហានទី ៤៖ ការបង្ហាញលទ្ធផល\n",
|
|
"\n",
|
|
"មនុស្សអាចបកស្រាយទិន្នន័យបានល្អបំផុតក្នុងរូបរាងដែលអាចមើលឃើញ។ ដូច្នេះ វាធ្វើឱ្យមានអត្ថន័យក្នុងការបង្ហាញទិន្នន័យ ដើម្បីទាញយកមូលដ្ឋានចំឡែកខ្លះ។ យើងអាចប្រើបណ្ណាល័យ `matplotlib` ក្នុង Python ដើម្បីគូរដំណាក់កាលចែកចាយសាមញ្ញនៃពាក្យគន្លឹះជាមួយនឹងពាក់ព័ន្ធរបស់ពួកវា៖\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": [
|
|
"ទោះជាយ៉ាងណា មានវិធីមួយល្អជាងនេះសម្រាប់បង្ហាញភាពញឹកញាប់ពាក្យ - ការប្រើប្រាស់ **ពពកពាក្យ**។ យើងគួរតែដំឡើងបណ្ណាល័យមួយផ្សេងទៀតដើម្បីគូរសៀវភៅពពកពាក្យពីបញ្ជីពាក្យគន្លឹះរបស់យើង។ \n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"!{sys.executable} -m pip install wordcloud"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"វត្ថុ `WordCloud` មានការទទួលខុសត្រូវចំពោះការទទួលអត្ថបទដើម ឬបញ្ជីពាក្យដែលបានគណនាមុនជាមួយកម្រិតប្រេកង់របស់ពួកវា ហើយបញ្ជូនត្រឡប់វិប្បភាព ដើម្បីបង្ហាញដោយប្រើ `matplotlib`:\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": [
|
|
"យើងក៏អាចបញ្ជូនអត្ថបទដើមទៅក្នុង `WordCloud` ផងដែរ - មកមើលថាតើយើងអាចទទួលបានលទ្ធផលស្រដៀងគ្នាបានទេ៖\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": [
|
|
"អ្នកអាចមើលឃើញថាខ្យល់ពាក្យឥឡូវនេះមានរូបរាងគួរឱ្យគាប់ចិត្តច្រើនជាងមុន ប៉ុន្តែវាក៏មានសំឡេងរំខានជាច្រើនផងដែរ (ឧ. ពាក្យមិនទាក់ទងដូចជា `Retrieved on`)។ ក៏ដូចជា យើងបានទទួលពាក្យគន្លឺដែលមានពីរពាក្យច្រើនកម្ដៅតិចជាង ដូចជា *data scientist* ឬ *computer science*។ នេះគឺដោយសារវិធីសាស្រ្ត RAKE ធ្វើការជ្រើសរើសពាក្យគន្លឺបានល្អជាងពីអត្ថបទ។ ឧទាហរណ៍នេះបង្ហាញពីសារៈសំខាន់នៃការព្យួរ និងសំអាតទិន្នន័យ ព្រោះរូបភាពច្បាស់នៅចុងបញ្ចប់ នឹងអាចអោយយើងអាចធ្វើសេចក្តីសម្រេចបានល្អជាង។\n",
|
|
"\n",
|
|
"ក្នុងលំហាត់នេះ យើងបានឆ្លងកាត់ដំណើរការងាយៗមួយនៃការដកស្រង់អត្ថន័យពីអត្ថបទវីគីភីឌា ក្នុងទ្រង់ទ្រាយពាក្យគន្លឺ និងខ្យល់ពាក្យ។ ឧទាហរណ៍នេះគឺងាយស្រួល ប៉ុន្តែវាបង្ហាញបានល្អពីជំហានទាំងអស់ដែលអ្នកវិទ្យាសាស្រ្តទិន្នន័យនឹងអនុវត្តនៅពេលធ្វើការជាមួយទិន្នន័យ ដំណើរការចាប់ផ្តើមពីការទទួលទិន្នន័យ រហូតទៅដល់ការបង្ហាញទិន្នន័យ។\n",
|
|
"\n",
|
|
"ក្នុងវគ្គសិក្សារបស់យើង យើងនឹងពិភាក្សាអំពីជំហានទាំងនោះប្រាប់លម្អិត។\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**ការបដិសេធ**:\nឯកសារនេះត្រូវបានបម្លែងភាសា ដោយប្រើសេវាបម្លែងភាសា AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះយើងខ្ញុំមានក្តីប្រាថ្នាឱ្យបានច្បាស់លាស់ តែសូមយល់ដឹងថាការបម្លែងដោយស្វ័យប្រវត្តិក៏អាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមជាភាសាទីតាំងគួរត្រូវបានគេប្រើជាប្រភពច្បាស់លាស់។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឱ្យប្រើប្រាស់ការប្រែដោយមនុស្សជំនាញ។ យើងខ្ញុំមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសបន្ទាប់ពីការប្រើប្រាស់ការបម្លែងនេះនោះទេ។\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
|
|
} |