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.
410 lines
64 KiB
410 lines
64 KiB
# ការវិភាគអារម្មណ៍ជាមួយការពិនិត្យមតិសណ្ឋាគារ - ការបំលែងទិន្នន័យ
|
|
|
|
ក្នុងផ្នែកនេះ អ្នកនឹងប្រើបច្ចេកទេសក្នុងមេរៀនមុន ដើម្បីធ្វើការវិភាគទិន្នន័យស្វែងរកអំពីសំណុំទិន្នន័យធំមួយ។ ពេលអ្នកមានការយល់ដឹងល្អអំពីភាពមានប្រយោជន៍របស់ជួរឈរផ្សេងៗ អ្នកនឹងរៀន៖
|
|
|
|
- របៀបលុបជួរឈរដែលមិនចាំបាច់
|
|
- របៀបគណនាទិន្នន័យថ្មីមួយចំនួនដោយផ្អែកលើជួរឈរដែលមានស្រាប់
|
|
- របៀបរក្សាទុកសំណុំទិន្នន័យដែលបានទទួលសម្រាប់ប្រើប្រាស់ក្នុងបញ្ហាចុងក្រោយ
|
|
|
|
## [សំនួរប្រឡងមុនមេរៀន](https://ff-quizzes.netlify.app/en/ml/)
|
|
|
|
### អត្ថបទណែនាំ
|
|
|
|
រហូតមកទល់ពេលនេះ អ្នកបានរៀនពីរបៀបដែលទិន្នន័យអត្ថបទខុសពីប្រភេទទិន្នន័យលេខសេដ្ឋកិច្ច។ ប្រសិនបើវាជាអត្ថបទដែលបានសរសេរឬនិយាយដោយមនុស្ស វាអាចត្រូវបានវិភាគដើម្បីស្វែងរកលំនាំ និងចំនួនកើតឡើង, អារម្មណ៍និងការប្រាប់អត្ថន័យ។ មេរៀននេះនាំអ្នកចូលទៅក្នុងសំណុំទិន្នន័យពិតមួយដែលមានបញ្ហាពិតៗ៖ **[ទិន្នន័យការពិនិត្យមតិសណ្ឋាគារ ៥១៥K នៅអឺរ៉ុប](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)** ហើយរួមបញ្ចូលជាមួយ [អាជ្ញាប័ណ្ណ CC0: ផលិតផលរដ្ឋបុព្វនិយម](https://creativecommons.org/publicdomain/zero/1.0/)។ វាត្រូវបានទាញយកពី Booking.com ពីប្រភពសាធារណៈ។ អ្នកបង្កើតសំណុំទិន្នន័យនេះគឺបុគ្គលឈ្មោះ Jiashen Liu។
|
|
|
|
### ការរៀបចំ
|
|
|
|
អ្នកនឹងត្រូវការ៖
|
|
|
|
* សមត្ថភាពបើកបរប្រតិបត្តិការសៀវភៅ .ipynb ជាមួយ Python 3
|
|
* pandas
|
|
* NLTK, [ដែលអ្នកគួរតេដំឡើងនៅក្នុងកំណត់ត្រាកន្លែងរបស់អ្នក](https://www.nltk.org/install.html)
|
|
* សំណុំទិន្នន័យដែលមាននៅលើ Kaggle [ទិន្នន័យការពិនិត្យមតិសណ្ឋាគារ ៥១៥K នៅអឺរ៉ុប](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)។ វាមានទំហំប្រហែល ២៣០ MB បន្ទាប់ពីដោះសោ។ ទាញយកទៅថតបណ្តាំ `/data` ដែលភ្ជាប់ជាមួយមេរៀន NLP នេះ។
|
|
|
|
## ការវិភាគទិន្នន័យស្វែងរក
|
|
|
|
បញ្ហានេះសន្មតថាអ្នកកំពុងបង្កើតប៊ូតណែនាំសណ្ឋាគារមួយដោយប្រើវិភាគអារម្មណ៍ និងពិន្ទុការវាយតម្លៃពីភ្ញៀវ។ សំណុំទិន្នន័យដែលអ្នកនឹងប្រើរួមបញ្ចូលការវាយតម្លៃសណ្ឋាគារចំនួន ១៤៩៣ នៅក្នុង ៦ ទីក្រុងផ្សេងគ្នា។
|
|
|
|
ដោយប្រើ Python, សំណុំទិន្នន័យការពិនិត្យមតិសណ្ឋាគារ, និងវិភាគអារម្មណ៍ NLTK អ្នកអាចស្វែងយល់បាន៖
|
|
|
|
* តើពាក្យនិងវាក្យសព្ទណាដែលត្រូវបានប្រើជាញឹកញាប់បំផុតក្នុងការវាយតម្លៃ?
|
|
* តើ *ស្លាក* ផ្លូវការដែលពណ៌នាសណ្ឋាគារមានទំនាក់ទំនងជាមួយពិន្ទុការវាយតម្លៃទេ (ចំណុចឧទាហរណ៍៖ តើការវាយតម្លៃអវិជ្ជមានច្រើនសម្រាប់សណ្ឋាគារមួយសម្រាប់ *គ្រួសារដែលមានក្មេងតូច* ជាង *អ្នកដំណើរតែម្នាក់* ដែលអាចសម្រង់បានថាវាល្អសម្រាប់ *អ្នកដំណើរតែម្នាក់*?)
|
|
* តើពិន្ទុអារម្មណ៍ NLTK 'ស្របគ្នា' ឬទេ ជាមួយពិន្ទុលេខសម្រាប់អ្នកវាយតម្លៃសណ្ឋាគារ?
|
|
|
|
#### សំណុំទិន្នន័យ
|
|
|
|
ចូរធ្វើការស្វែងយល់សំណុំទិន្នន័យដែលអ្នកបានទាញយក និងរក្សាទុកជាកន្លែងមូលដ្ឋាន។ បើកឯកសារនៅកម្មវិធីកែប្រែដូចជា VS Code ឬ Excel។
|
|
|
|
ចំណងជើងក្នុងសំណុំទិន្នន័យមានដូចតទៅ៖
|
|
|
|
*Hotel_Address, Additional_Number_of_Scoring, Review_Date, Average_Score, Hotel_Name, Reviewer_Nationality, Negative_Review, Review_Total_Negative_Word_Counts, Total_Number_of_Reviews, Positive_Review, Review_Total_Positive_Word_Counts, Total_Number_of_Reviews_Reviewer_Has_Given, Reviewer_Score, Tags, days_since_review, lat, lng*
|
|
|
|
នេះជាការរៀបប្រមាណជាក្រុមដែលអាចងាយស្រួលពិនិត្យ៖
|
|
##### ជួរឈរសណ្ឋាគារ
|
|
|
|
* `Hotel_Name`, `Hotel_Address`, `lat` (រយៈកាំ), `lng` (រយៈបណ្តោយ)
|
|
* ដោយប្រើ *lat* និង *lng* អ្នកអាចផែនទីដោយជាមួយ Python ដើម្បីបង្ហាញទីតាំងសណ្ឋាគារ (ប្រហែលជាប្រែលក់ពណ៌សម្រាប់ការវាយតម្លៃអវិជ្ជមាននិងវិជ្ជមាន)
|
|
* Hotel_Address មិនច្បាស់ថាមានប្រយោជន៍សម្រាប់យើងទេ ហើយយើងប្រហែលជាចំបងប្ដូរនោះជាពាណិជ្ជកម្មសម្រាប់ជំនួសដើម្បីចាប់ផ្ដើមការរៀបចំ និងស្វែងរកបានងាយ
|
|
|
|
**ជួរឈរពិនិត្យមតិក្នុងការវាយតម្លៃសណ្ឋាគារ**
|
|
|
|
* `Average_Score`
|
|
* ផ្អែកលើអ្នកបង្កើតសំណុំទិន្នន័យ ជួរឈរនេះគឺជា *ពិន្ទុមធ្យមនៃសណ្ឋាគារ ដែលគណនាតាមមតិក្នុងឆ្នាំចុងក្រោយ*។ វាហាក់ដូចជាជារបៀបគណនាពិន្ទុមួយដែលមិនធម្មតា ប៉ុន្តែវាជាទិន្នន័យដែលបានទាញ ហើយយើងអាចទទួលយកវាជាការពិតសម្រាប់ពេលនេះ។
|
|
|
|
✅ ដោយផ្អែកលើជួរឈរផ្សេងទៀតក្នុងទិន្នន័យនេះ យ៉ាងណាអ្នកអាចយល់គំនិតពីវិធីផ្សេងទៀតក្នុងការគណនាពិន្ទុមធ្យម?
|
|
|
|
* `Total_Number_of_Reviews`
|
|
* ចំនួនសរុបនៃការវាយតម្លៃដែលសណ្ឋាគារនេះបានទទួល - វាមិនច្បាស់ (ដោយមិនត្រូវសរសេរកូដ) ថាតើវាត្រូវនិយាយពីការវាយតម្លៃក្នុងសំណុំទិន្នន័យមែនទេ។
|
|
* `Additional_Number_of_Scoring`
|
|
* នេះមានន័យថា ពិន្ទុបានផ្តល់ជូន ប៉ុន្តែមិនមានមតិវិជ្ជមានឬអវិជ្ជមានផ្សេងទៀតដែលបានសរសេរដោយអ្នកវាយតម្លៃទេ
|
|
|
|
**ជួរឈរមតិវិភាគ**
|
|
|
|
- `Reviewer_Score`
|
|
- គឺជាតម្លៃលេខដែលមានទ្រង់ទ្រាយឯកតាខ្ទង់ទសភាគ១ ដែលក្នុងចន្លោះពី ២.៥ ដល់ ១០
|
|
- វាមិនបានពណ៌នាថាទេថាហេតុអ្វីបានជាពិន្ទុល្អបំផុតគឺ ២.៥
|
|
- `Negative_Review`
|
|
- ប្រសិនបើអ្នកវាយតម្លៃមិនបានសរសេរអ្វីទេ វានឹងមាន "**មិនមានអវិជ្ជមាន**"
|
|
- សូមចំណាំថាអ្នកវាយតម្លៃអាចសរសេរមតិវិជ្ជមាននៅជួរឈរអវិជ្ជមាន (ឧ. "គ្មានអ្វីអាក្រក់អំពីសណ្ឋាគារនេះទេ")
|
|
- `Review_Total_Negative_Word_Counts`
|
|
- ចំនួនពាក្យអវិជ្ជមានខ្ពស់បង្ហាញពីពិន្ទុល្ងស់ (ដោយមិនត្រួតពិនិត្យអារម្មណ៍)
|
|
- `Positive_Review`
|
|
- ប្រសិនបើអ្នកវាយតម្លៃមិនបានសរសេរអ្វី ទៀត ទេ វានឹងមាន "**មិនមានវិជ្ជមាន**"
|
|
- សូមចំណាំថាអ្នកវាយតម្លៃអាចសរសេរមតិអវិជ្ជមាន នៅជួរឈរវិជ្ជមាន (ឧ. "គ្មានអ្វីល្អអំពីសណ្ឋាគារនេះទេ")
|
|
- `Review_Total_Positive_Word_Counts`
|
|
- ចំនួនពាក្យវិជ្ជមានខ្ពស់បង្ហាញពីពិន្ទុខ្ពស់ (ដោយមិនត្រួតពិនិត្យអារម្មណ៍)
|
|
- `Review_Date` និង `days_since_review`
|
|
- វិធានសម្រាប់ភាពថ្មីឬចាស់នៃការវាយតម្លៃអាចត្រូវបានពិនិត្យ (ការវាយតម្លៃចាស់ៗអាចមិនត្រឹមត្រូវដូចការវាយតម្លៃថ្មីៗ ព្រោះការគ្រប់គ្រងសណ្ឋាគារបានផ្លាស់ប្តូរ ឬមានការជួសជុល ឬបានបន្ថែមអាងហែលទឹកជាដើម)
|
|
- `Tags`
|
|
- នេះជាការពិពណ៌នាសង្ខេបដែលអ្នកវាយតម្លៃអាចជ្រើសរើស ដើម្បីពិពណ៌នាប្រភេទភ្ញៀវដែលពួកគេបានជួប (ឧ. ដំណើរតែម្នាក់ ឬគ្រួសារ), ប្រភេទបន្ទប់ដែលពួកគេចងក្រង, រយៈពេលស្នាក់នៅ និងរបៀបដាក់សំណើ
|
|
- ជាតិបង្ខំបាន ប្រើស្លាកទាំងនេះជារឿងលំបាក សូមពិនិត្យផ្នែកក្រោមដែលពិភាក្សាអំពីប្រយោជន៍របស់វា
|
|
|
|
**ជួរឈរអ្នកវាយតម្លៃ**
|
|
|
|
- `Total_Number_of_Reviews_Reviewer_Has_Given`
|
|
- វាអាចជា៉មូលហេតុមួយសម្រាប់ម៉ូដែលណែនាំ, ដូចជា ប្រសិនបើអ្នកអាចកំណត់បានថាអ្នកវាយតម្លៃដែលវាយតម្លៃច្រើនមានការវាយតម្លៃអវិជ្ជមានច្រើនជាងវិជ្ជមាន។ ប៉ុន្តែ អ្នកវាយតម្លៃមិនត្រូវបានកំណត់ដោយកូដជាក់លាក់ ដូច្នេះមិនអាចភ្ជាប់ទៅនឹងការវាយតម្លៃមួយជាច្រើនបាន។ មានអ្នកវាយតម្លៃ ៣០ នាក់ដែលមានការវាយតម្លៃ ១០០ ឬច្រើនជាងនេះ ប៉ុន្តែយើងមើលមិនឃើញថាវានឹងជួយម៉ូដែលណែនាំយ៉ាងដូចម្តេច។
|
|
- `Reviewer_Nationality`
|
|
- អ្នកមួយចំនួនអាចគិតថាជាតិកំណើតណាមួយអាចមានឥទ្ធិពលក្នុងការផ្តល់វិជ្ជមានឬអវិជ្ជមាន។ សូមប្រយ័ត្ននៅពេលបញ្ចូលទ្រឹស្តីបែបនេះទៅម៉ូដែលរបស់អ្នក។ ទស្សនៈទាំងនេះជាប្រភេទទំនៀមទម្លាប់ជាតិសាសន៍ (និងខ្លះគឺជាពណ៌) ហើយអ្នកវាយតម្លៃម្នាក់ៗមានការវាយតម្លៃផ្អែកលើបទពិសោធន៍ផ្ទាល់ខ្លួន។ វាអាចត្រូវបានបញ្ចូលដោយទស្សនីយភាពជាច្រើនដូចជា ការស្នាក់នៅសណ្ឋាគារកន្លងមក ចម្ងាយដំណើរ និងលក្ខណៈគំនិតផ្ទាល់ខ្លួន។ ការគិតថាជាតិនៃអ្នកវាយតម្លៃជាហេតុផលនៃពិន្ទុគឺពិបាកបដិសេធ។
|
|
|
|
##### ឧទាហរណ៍
|
|
|
|
| ពិន្ទុមធ្យម | ចំនួនការវាយតម្លៃសរុប | ពិន្ទុអ្នកវាយតម្លៃ | Negative <br />Review | Positive Review | Tags |
|
|
| -------------- | ---------------------- | ---------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- |
|
|
| 7.8 | 1945 | 2.5 | នេះមិនមែនជាសណ្ឋាគារបច្ចុប្បន្នទេប៉ុន្តែជានិងស្ថានសំណង់។ ខ្ញុំត្រូវបានរំខានពីព្រឹកដើមរហូតដល់ល្ងាច ជាមួយសំលេងសំណង់ដែលមិនអាចទ្រាំទ្របាន ខណៈពេលដែលកំពុងសម្រាកបន្ទាប់ពីដំណើរយូរ និងធ្វើការក្នុងបន្ទប់មួយ។ មនុស្សកំពុងធ្វើការទាំងថ្ងៃ ដូចជាពីការប្រើម៉ាស៊ីនចល័តនៅបន្ទប់ក្បែរ។ ខ្ញុំបានស្នើសុំផ្លាស់ប្ដូរបន្ទប់ ប៉ុន្តែបន្ទប់ស្ងាត់មិនមានទេ។ ដើម្បីធ្វើឱ្យរឿងអាក្រក់ឡើង ខ្ញុំត្រូវបង់លើស។ ខ្ញុំបានចាកចេញនៅល្ងាច ដូចជាខ្ញុំត្រូវទៅជិះយន្តហោះភ្លាមៗ ហើយបានទទួលវិក័យប័ត្រដែលត្រឹមត្រូវ។ ថ្ងៃបន្ទាប់ សណ្ឋាគារ បានកាត់ប្រាក់ម្តងទៀតដោយគ្មានការយល់ព្រមពីខ្ញុំ ជាមានកំណត់លើតម្លៃបានកក់។ វាជាទីតាំងអាក្រក់មែនទែន។ កុំទោសខ្លួនដោយការកក់នៅទីនេះ | ទីតាំងអាក្រក់ កុំទៅជិត | ដំណើរការអាជីវកម្ម គូស្នាក់នៅ បន្ទប់ទ្វេក្បាល ស្នាក់ ២ យប់ |
|
|
|
|
ដូចដែលអ្នកបានឃើញភ្ញៀវនេះមិនមានការសប្បាយចិត្តខ្លាំងលើការស្នាក់នៅសណ្ឋាគារនេះទេ។ សណ្ឋាគារមានពិន្ទុមធ្យមល្អ ៧.៨ និងការវាយតម្លៃ៤ ១៩៤៥ ប៉ុន្តែអ្នកវាយតម្លៃនេះបានផ្តល់ត្រឹម ២.៥ និងបានសរសេរចំនួន ១១៥ ពាក្យអំពីភាពអវិជ្ជមានរបស់ពួកគេ។ ប្រសិនបើពួកគេមិនបានសរសេរអ្វីនៅជួរឈរ Positive_Review អ្នកអាចសន្និដ្ឋានបានថាមិនមានអ្វីវិជ្ជមានទេ ប៉ុន្តែពួកគេបានសរសេរពាក្យរាបសារជាចំនួន ៧ ពាក្យ។ បើពួកគេគិតគណនាពាក្យតែប៉ុណ្ណោះ ដោយមិនគិតពីអត្ថន័យ អារម្មណ៍ នៃពាក្យពួកគេ ការយល់ឃើញអំពីចេតនារបស់អ្នកវាយតម្លៃអាចមានការប្រែក្លាយ។ វាហាក់ដូចជាពិន្ទុ ២.៥ របស់ពួកគេច្រឡំ ព្រោះប្រសិនបើស្នាក់នៅសណ្ឋាគារនេះអាក្រក់ពេក ហេតុអ្វីបានផ្តល់ពិន្ទុសោះ? ពិនិត្យយ៉ាងជិតជាង អ្នកនឹងឃើញថាពិន្ទុកំពូលតិចបំផុតគឺ ២.៥ មិនមែន ០ ទេ។ ពិន្ទុកំពូលបំផុតគឺ ១០។
|
|
|
|
##### ស្លាក Tags
|
|
|
|
ដូចបានបញ្ចាក់ខាងលើ ជាមើលមិនឃើញបញ្ហា ការប្រើ `Tags` ដើម្បីចាត់ថ្នាក់ប្រភេទទិន្នន័យហាក់ដូចមានហេតុផលល្អ។ ជាអកិសរណ៏ទាំងនេះមិនមានគោលស្តង់ដារ ដែលមានន័យថា នៅសណ្ឋាគារមួយ អាចមានជម្រើសជា *បន្ទប់តែម្នាក់* , *បន្ទប់សង្វាក់ទ្វេ* និង *បន្ទប់ទ្វេក្បាល* ប៉ុន្តែនៅសណ្ឋាគារផ្សេងទៀត មានជា *បន្ទប់តែម្នាក់ឈុតលម្អ* , *បន្ទប់គ្រីនថ្នាក់មធ្យម* និង *បន្ទប់អគ្គិសនី*។ វាហាក់ដូចជាធាតុដូចគ្នា ប៉ុន្តែមានករណីជាច្រើន ដែលការជ្រើសរើសចាំបាច់៖
|
|
|
|
1. ព្យាយាមផ្លាស់ប្ដូរជាភាសាតែមួយ ដែលមានការលំបាកខ្លាំង ព្រោះមិនច្បាស់ថាមីនិយមន៍ផ្លាស់ប្ដូរជួរមានអ្វីនៅក្នុងករណីនីមួយៗ (ឧ. *បន្ទប់តែម្នាក់គ្រីនថ្នាក់* ត្រូវជាបន្ទប់តែម្នាក់ ប៉ុន្តែ *បន្ទប់គ្រីនថ្នាក់លើសហាងសួនចម្ការឬមើលទីក្រុង* ពិបាកផ្លាស់ប្ដូរជាង)
|
|
|
|
1. អាចយកវិធី NLP សម្រាប់វាស់ទំហំទិដ្ឋភាពនៃពាក្យជាក់លាក់ដូចជា *Solo*, *អ្នកដំណើរអាជីវកម្ម*, ឬ *គ្រួសារដែលមានកូនតូច* ដែលមានទំនាក់ទំនងទៅនឹងសណ្ឋាគារនីមួយៗ ហើយស្នើសុំរួមបញ្ចូលវាទៅក្នុងការរៀបចំ
|
|
|
|
ស្លាកទាញ តែជាធម្មតា (ប៉ុន្តែមិនខំប្រកាន់) ជាជួរឈរដែលមានតែមួយ ដែលមានបញ្ជីតម្លៃបំបែកជាមួយគ្នាចំនួន ៥ ដល់ ៦ ដោយបំបែកជាក្បួនក្បាលទៅ *ប្រភេទដំណើរ*, *ប្រភេទភ្ញៀវ*, *ប្រភេទបន្ទប់*, *ចំនួនយប់*, និង *ប្រភេទឧបករណ៍ដែលបានដាក់សំណើ*។ ប៉ុន្តែព្រោះអ្នកវាយតម្លៃខ្លះមិនបំពេញទាំងអស់ (ខ្លះអាចទុកទទេមួយ), តម្លៃមិនត្រឹមត្រូវជារបៀបដូចគ្នានៅគ្រប់កន្លែងទេ។
|
|
|
|
ជាឧទាហរណ៌ ចូរយក *ប្រភេទក្រុម*។ មានជម្រើសតែមួយគត់ចំនួន ១០២៥ នៅក្នុងជួរឈរ `Tags` ដែលមិនគ្រប់ចេញពីក្រុមទេ (ខ្លះគឺជាប្រភេទបន្ទប់ ល.)។ ប្រសិនបើអ្នកចំណាត់ថ្នាក់តែវាដែលត្រូវនិយាយពីគ្រួសារ លទ្ធផលនោះមាន *បន្ទប់គ្រួសារ*។ ប្រសិនបើអ្នកបញ្ចូលពាក្យ *ជាមួយ*, ឧ. រាប់ *គ្រួសារជាមួយ*, លទ្ធផលល្អជាងគេ មានច្រើនជាង ៨០,០០០ ក្នុងចំណោម ៥១៥,០០០ ដែលមានប្រយោបល់ថា "គ្រួសារជាមួយក្មេងតូច" ឬ "គ្រួសារជាមួយក្មេងចាស់"។
|
|
|
|
នេះមានន័យថាជួរឈរ Tags មិនមែនគ្មានប្រយោជន៍ជាសះស្បើយទេ ប៉ុន្តែមិនមែនរឿងងាយដើម្បីផ្លាស់ប្ដូរឲ្យមានប្រយោជន៍។
|
|
|
|
##### ពិន្ទុមធ្យមសណ្ឋាគារ
|
|
|
|
មានបញ្ហាចម្លែក និងភាពមិនស្របគ្នាខ្លះៗក្នុងសំណុំទិន្នន័យ ដែលខ្ញុំមិនអាចកំណត់បាន ប៉ុន្តែបានបង្ហាញនៅទីនេះដើម្បីឲ្យអ្នកយល់ពីពេលកំពុងបង្កើតម៉ូដែល។ ប្រសិនបើអ្នកជឿជាក់ សូមប្រាប់យើងនៅផ្នែកពិភាក្សា!
|
|
|
|
សំណុំទិន្នន័យមានជួរឈរដូចខាងក្រោមការពាក់ព័ន្ធនឹងពិន្ទុមធ្យម និងចំនួនការវាយតម្លៃ៖
|
|
|
|
1. Hotel_Name
|
|
2. Additional_Number_of_Scoring
|
|
3. Average_Score
|
|
4. Total_Number_of_Reviews
|
|
5. Reviewer_Score
|
|
|
|
សណ្ឋាគារចំនួនតែ១ដែលមានការវាយតម្លៃច្រើនបំផុតក្នុងសំណុំទិន្នន័យនេះគឺ *Britannia International Hotel Canary Wharf* មានការវាយតម្លៃ 4789 ក្នុងចំណោម 515,000។ ប៉ុន្តែប្រសិនបើយើងមើលតម្លៃ `Total_Number_of_Reviews` សម្រាប់សណ្ឋាគារនេះ វាគឺ 9086។ អ្នកអាចគិតថាមានពិន្ទុច្រើនដែលមិនមានមតិតា តែប្រហែលជាអ្នកគួរបញ្ចូលតម្លៃជួរឈរ `Additional_Number_of_Scoring`។ តម្លៃនោះគឺ 2682 ហើយបន្ថែមទៅ 4789 យើងបាន 7,471 ដែលនៅតែខ្វះ 1615 នៃតម្លៃ `Total_Number_of_Reviews`។
|
|
|
|
ប្រសិនបើអ្នកយកជួរឈរ `Average_Score` អ្នកអាចគិតថាវាត្រូវជាពិន្ទុមធ្យមនៃការវាយតម្លៃក្នុងសំណុំទិន្នន័យ ប៉ុន្តែការពណ៌នាពី Kaggle គឺ "*ពិន្ទុមធ្យមនៃសណ្ឋាគារ ដែលគណនាតាមមតិក្នុងឆ្នាំចុងក្រោយ*"។ វាហាក់ដូចជាយ៉ាងមិនមានប្រយោជន៍ ប៉ុន្តែយើងអាចគណនាពិន្ទុមធ្យមផ្ទាល់ពីការវាយតម្លៃក្នុងសំណុំទិន្នន័យ។ ទៅលើសណ្ឋាគារដូចជាឧទាហរណ៍ អ្នកមានពិន្ទុ ៧.១ ប៉ុន្តែការគណនាពិន្ទុ (ពិន្ទុនักវាយតម្លៃបញ្ចូលក្នុងសំណុំទិន្នន័យ) គឺ ៦.៨។ នេះស្ទើរត្រឹមត្រូវ ប៉ុន្តែមិនមែនតម្លៃដូចគ្នា ហើយយើងអាចគ្រាន់តែសន្មត់ថាពិន្ទូក្នុងការវាយតម្លៃ `Additional_Number_of_Scoring` បានបន្ថែមពិន្ទុមធ្យមទៅ ៧.១។ បិសាចមិនមានវិធីសាកល្បងឲ្យដឹង លំបាកក្នុងការប្រើប្រាស់ ឬ ជឿទុកចិត្ត `Average_Score`, `Additional_Number_of_Scoring` និង `Total_Number_of_Reviews` ព្រោះវាគឺផ្អែកលើទិន្នន័យដែលយើងមិនមាន។
|
|
|
|
ដើម្បីបន្ថែមភាពចម្រុះ សណ្ឋាគារដែលមានការវាយតម្លៃច្រើនជាងទីពីរមានពិន្ទុស្មើ ៨.១២ ហើយសំណុំទិន្នន័យ `Average_Score` គឺ ៨.១។ តើពិន្ទុនេះត្រឹមត្រូវ ដោយឱកាស ឬវិវាតញានក្នុងសណ្ឋាគារដំបូង?
|
|
អំពីសក្តានុពលដែលសណ្ឋាគារទាំងនេះអាចជាអវត្តមាន និងថាប្រៀបធៀបជាច្រើនតម្លៃត្រូវគ្នា (ប៉ុន្តែមានខ្លះមិនត្រូវគ្នាដោយហេតុផលខ្លះៗ) យើងនឹងសរសេរកម្មវិធីខ្លីមួយនៅខាងក្រោមដើម្បីស្វែងយល់តម្លៃក្នុងឧទDatasetនិងកំណត់ការប្រើប្រាស់ត្រឹមត្រូវ (ឬមិនប្រើប្រាស់) នៃតម្លៃទាំងនេះ។
|
|
|
|
> 🚨 សេចក្តីរំពឹងប្រយ័ត្ន
|
|
>
|
|
> នៅពេលធ្វើការជាមួយឧទនេះ អ្នកនឹងសរសេរកូដដែលគណនាអ្វីមួយពីអត្ថបទដោយមិនចាំបាច់អាន ឬវិភាគអត្ថបទដោយខ្លួនឯង។ នេះជាគ្រឹះនៃ NLP គឺការបកស្រាយអត្ថន័យ ឬអារម្មណ៍ដោយមិនចាំបាច់ឲ្យមនុស្សធ្វើវា។ ទោះយ៉ាងណា អាចមានករណីដែលអ្នកអានមតិអវិជ្ជមានខ្លះ។ ខ្ញុំស្នើអ្នកកុំអាន ព្រោះអ្នកមិនចាំបាច់អាននោះទេ។ មតិខ្លះពេកលេងសើច ឬមតិអវិជ្ជមានអំពីសណ្ឋាគារដែលមិនពាក់ព័ន្ធ ដូចជា "អាកាសធាតុខុសគ្នា" ដែលជាពីលើការគ្រប់គ្រងរបស់សណ្ឋាគារ ឬមនុស្សណាមួយ។ ប៉ុន្តែនៅមានមុខងារឈ្មួញក្នុងមតិខ្លះផងដែរ។ ពេលខ្លះមតិអវិជ្ជមានជានរណារវាងជាតិសាសន៍ ភេទ ឬវ័យ។ នេះគឺជាករណីអស្ចារ្យ ប៉ុន្តែនឹងប្រកបដោយការរំពឹងបានក្នុងឧទDatasetដែលបានទាញយកពីគេហទំព័រផ្សាយសាធារណៈ។ អ្នកពិនិត្យមតិខ្លះ ទុកមតិដែលអ្នកអាចយកចិត្តទុកដាក់ មិនស្រួល ឬធ្វើឲ្យអ្នកមានអារម្មណ៍មិនល្អ។ កាន់តែប្រសើរជាងនេះ ឲ្យកូដវាស់អារម្មណ៍ ជំនួសអ្នកអានផ្ទាល់ មិនឲ្យមានអារម្មណ៍រិះគន់ឡើងវិញ។ ទោះបីជាមានតែមនុស្សតិច ដែលសរសេរអ្វីបែបនេះ ក៏ពួកគេស្ថិតនៅតែមាន។
|
|
|
|
## ហាត់ការណ៍ - ការស្វែងយល់ទិន្នន័យ
|
|
### ផ្ទុកទិន្នន័យ
|
|
|
|
គឺគ្រប់គ្រាន់សម្រាប់ការត្រួតពិនិត្យទិន្នន័យដោយកាន់តែម៉ត់ចត់។ ឥឡូវនេះ អ្នកនឹងសរសេរកូដខ្លីមួយក្នុងការស្វែងរកនិងទទួលបានចម្លើយ! ផ្នែកនេះប្រើបណ្ណាល័យ pandas។ ភារកិច្ចដំបូងរបស់អ្នកគឺធានាថាអ្នកអាចផ្ទុក និងអានទិន្នន័យ CSV បាន។ បណ្ណាល័យ pandas មានកម្មវិធីផ្ទុក CSV ដែលលឿន ហើយលទ្ធផលត្រូវបានដាក់នៅក្នុង dataframe ដូចក្នុងមេរៀនមុនៗ។ CSV ដែលយើងកំពុងផ្ទុកមានជួរដេកលើសប្រាំលានជួរ តែក្នុងមានតែ ១៧ បន្ទាត់។ pandas ផ្តល់ឱ្យអ្នកនូវវិធីអនុវត្តច្រើនចំពោះ dataframe រួមទាំងការធ្វើបណ្តុលលើគ្រប់ជួរដេក។
|
|
|
|
ចាប់ពីនេះបន្តទៅក្នុងមេរៀននេះ នឹងមានកូដខ្លីៗ និងការពន្យល់ខ្លះៗពីកូដ និងការពិភាក្សាអំពីអ្វីដែលលទ្ធផលមានន័យជា។ ប្រើ _notebook.ipynb_ ដដែលសម្រាប់កូដរបស់អ្នក។
|
|
|
|
ចាប់ផ្តើមដោយផ្ទុកឯកសារទិន្នន័យដែលអ្នកនឹងប្រើ៖
|
|
|
|
```python
|
|
# បញ្ចូលការពិនិត្យសណ្ឋាគារពី CSV
|
|
import pandas as pd
|
|
import time
|
|
# នាំចូលម៉ោង ដើម្បីអាចប្រើម៉ោងចាប់ផ្តើម និងបញ្ចប់សម្រាប់គណនាពេលវេលាបញ្ចូលឯកសារ
|
|
print("Loading data file now, this could take a while depending on file size")
|
|
start = time.time()
|
|
# df គឺជា 'DataFrame' - ត្រូវប្រាកដថាអ្នកបានទាញយកឯកសារទៅក្នុងថតទិន្នន័យហើយ
|
|
df = pd.read_csv('../../data/Hotel_Reviews.csv')
|
|
end = time.time()
|
|
print("Loading took " + str(round(end - start, 2)) + " seconds")
|
|
```
|
|
|
|
ឥឡូវនេះ ទិន្នន័យត្រូវបានផ្ទុករួចហើយ យើងអាចអនុវត្តបណ្តុលលើវាបាន។ រក្សាកូដនេះនៅលើជំពូកកម្មវិធីរបស់អ្នកសម្រាប់ផ្នែកបន្ទាប់។
|
|
|
|
## ស្វែងរកទិន្នន័យ
|
|
|
|
ករណីនេះ ទិន្នន័យគឺ *ស្អាត* រួចហើយ មានន័យថាវាត្រៀមសម្រាប់ប្រើប្រាស់ ហើយគ្មានតួអក្សរនៅក្នុងភាសាផ្សេងទៀតដែលអាចធ្វើឲ្យអាលហ្គរីធម៍ដែលរំពឹងអក្សរអង់គ្លេសតែម្ដងឆ្លងកាត់។
|
|
|
|
✅ ប្រហែលជាអ្នកត្រូវប្រើបញ្ ដាញ់ទិន្នន័យដែលតម្រូវការជំហ៊ានដំបូងក្នុងការរៀបចំវា មុនពេលប្រើបច្ចេកទេស NLP ប៉ុន្តានៅពេលនេះ មិនត្រូវធ្វើមេរៀននេះទេ។ បើត្រូវធ្វើ តើអ្នកនឹងដោះស្រាយតួអក្សរផ្សេងភាសាយ៉ាងដូចម្តេច?
|
|
|
|
យកពេលខ្លះដើម្បីធានាថាអន្ទាន់ពេលទិន្នន័យត្រូវបានផ្ទុក អ្នកអាចស្វែងរកវាដោយប្រើកូដ។ វាងាយស្រួលណាស់ក្នុងការភ្ជាប់ចំណាប់អារម្មណ៍ទៅកាន់បន្ទាត់ `Negative_Review` និង `Positive_Review`។ ពួកវាត្រូវបានបំពេញដោយអត្ថបទធម្មជាតិសម្រាប់អាល់ហ្គរីធម៍ NLP របស់អ្នកដំណើរការ។ ប៉ុន្តែមុនចូលទៅកាន់ NLP និងអារម្មណ៍ អ្នកគួរតែអនុវត្តកូដខាងក្រោមដើម្បីបញ្ជាក់ថាតម្លៃដែលផ្តល់ក្នុងឧទDataset ត្រូវគ្នាទៅនឹងតម្លៃដែលអ្នកគណនាដោយ pandas ឬអត់។
|
|
|
|
## ប្រតិបត្តិការលើ Dataframe
|
|
|
|
ភារកិច្ចដំបូងក្នុងមេរៀននេះគឺពិនិត្យមើលថាតើការបញ្ជាក់ខាងក្រោមត្រឹមត្រូវឬអត់ ដោយសរសេរកូដស្រាវជ្រាវលើ dataframe (ដោយមិនប្តូរវា)។
|
|
|
|
> ដូចជាភារកិច្ចកម្មវិធីជាច្រើន មានវិធីជាច្រើនក្នុងការសម្រេចបាន តែដំណើរការល្អគឺធ្វើវាឲ្យបានសាមញ្ញ និងងាយយល់ ជាពិសេសបើអ្នកនឹងត្រឡប់មកកូដនេះម្ដងទៀតនៅពេលអនាគត។ ជាមួយ dataframes មាន API គ្រប់គ្រាន់ហើយជាទូទៅមានវិធីសាស្រ្តមួយទៅមួយសម្រាប់ធ្វើអ្វីដែលអ្នកចង់បានយ៉ាងសមហេតុផល។
|
|
|
|
ច treatសំនួរខាងក្រោមជាភារកិច្ចកូដ និងព្យាយាមឆ្លើយដោយមិនមើលដំណោះស្រាយ។
|
|
|
|
1. បោះពុម្ព out *shape* នៃ dataframe ដែលអ្នកទើបផ្ទុក (shape គឺជាចំនួនជួរដេក និងបន្ទាត់)
|
|
2. គណនាចំនួនល្បិចសម្រាប់ជាតិសញ្ជាតិអ្នកទស្សនាៈ
|
|
1. មានតម្លៃផ្សេងទៀតប៉ុន្មានសម្រាប់ជួរ `Reviewer_Nationality` ហើយអ្វីខ្លះ?
|
|
2. ជាតិសញ្ជាតិិកណ្តាលបំផុតក្នុងDatasetនេះមានអ្វីខ្លះ (បោះពុម្ពប្រទេស និងចំនួនមតិ)?
|
|
3. តើជាតិសញ្ជាតិទាំង ១០ បន្ទាប់ដែលមានចំនួនខ្លួនយ៉ាងទៀងទាត់ជាងគេជាអ្វីខ្លះ និងចំនួន?
|
|
3. តើសណ្ឋាគារណាដែលមានការពិនិត្យខ្ពស់បំផុតសម្រាប់ជាតិសញ្ជាតិទាំង ១០ ចំណាត់ថ្នាក់ខ្ពស់បំផុត?
|
|
4. មានមតិប៉ុន្មានសម្រាប់សណ្ឋាគារមួយៗ (ចំនួនមតិសម្រាប់សណ្ឋាគារ) នៅក្នុងDataset?
|
|
5. ទោះបីមានជួរ `Average_Score` សម្រាប់សណ្ឋាគារនីមួយៗ នៅក្នុងDataset អ្នកក៏អាចគណនាគម្លាតមធ្យមសម្រាប់ម៉ាយវាណដែរ (យកគម្លាតមធ្យមនៃពិន្ទុអ្នកពិនិត្យទាំងអស់សម្រាប់សណ្ឋាគារនីមួយៗ)។ បន្ថែមជួរថ្មី `Calc_Average_Score` ទៅក្នុង dataframe ដែលមានគម្លាតមធ្យមបានគណនាថែមទៀត។
|
|
6. តើមានសណ្ឋាគារណាដែលមានលក្ខណៈដូចគ្នា (កែសម្រួលទៅ១ទសភាគ) រវាង `Average_Score` និង `Calc_Average_Score`?
|
|
1. សាកល្បងសរសេរមុខងារ Python មួយដែលទទួលអនុគមន៍ Series (ជួរដេក) និងប្រៀបធៀបតម្លៃ ហើយបោះពុម្ពសារ នៅពេលតម្លៃមិនស្មើគ្នា។ បន្ទាប់មកប្រើវិធី `.apply()` ដើម្បីដំណើរការជួរទាំងអស់។
|
|
7. គណនា និងបោះពុម្ពចំនួនជួរដេកដែលមានតម្លៃជួរ `Negative_Review` ជា "No Negative"
|
|
8. គណនា និងបោះពុម្ពចំនួនជួរដេកដែលមានតម្លៃជួរ `Positive_Review` ជា "No Positive"
|
|
9. គណនា និងបោះពុម្ពចំនួនជួរដេកដែលមានតម្លៃជួរ `Positive_Review` ជា "No Positive" **និង** `Negative_Review` ជា "No Negative"
|
|
### កូដចម្លើយ
|
|
|
|
1. បោះពុម្ព out *shape* នៃ dataframe ដែលអ្នកទើបផ្ទុក (shape គឺជាចំនួនជួរដេក និងបន្ទាត់)
|
|
|
|
```python
|
|
print("The shape of the data (rows, cols) is " + str(df.shape))
|
|
> The shape of the data (rows, cols) is (515738, 17)
|
|
```
|
|
|
|
2. គណនាចំនួនល្បិចសម្រាប់ជាតិសញ្ជាតិអ្នកទស្សនាៈ
|
|
|
|
1. មានតម្លៃផ្សេងទៀតប៉ុន្មានសម្រាប់ជួរ `Reviewer_Nationality` ហើយអ្វីខ្លះ?
|
|
2. ជាតិសញ្ជាតិិកណ្តាលបំផុតក្នុងDatasetនេះមានអ្វីខ្លះ (បោះពុម្ពប្រទេស និងចំនួនមតិ)?
|
|
|
|
```python
|
|
# value_counts() បង្កើតអอบ្សជាប់ Series ដែលមាន index និងតម្លៃ ក្នុងករណីនេះ ជាប្រទេស និងប្រេកង់ដែលពួកវាប្រារព្ធក្នុងជាតិសាសន៍អ្នកពិនិត្យ
|
|
nationality_freq = df["Reviewer_Nationality"].value_counts()
|
|
print("There are " + str(nationality_freq.size) + " different nationalities")
|
|
# បោះពុម្ពជួរដំបូង និងចុងក្រោយរបស់ Series ។ ផ្លាស់ប្ដូរទៅ nationality_freq.to_string() ដើម្បីបោះពុម្ពទិន្នន័យទាំងអស់
|
|
print(nationality_freq)
|
|
|
|
There are 227 different nationalities
|
|
United Kingdom 245246
|
|
United States of America 35437
|
|
Australia 21686
|
|
Ireland 14827
|
|
United Arab Emirates 10235
|
|
...
|
|
Comoros 1
|
|
Palau 1
|
|
Northern Mariana Islands 1
|
|
Cape Verde 1
|
|
Guinea 1
|
|
Name: Reviewer_Nationality, Length: 227, dtype: int64
|
|
```
|
|
|
|
3. តើជាតិសញ្ជាតិទាំង ១០ បន្ទាប់ដែលមានចំនួនខ្លួនយ៉ាងទៀងទាត់ជាងគេជាអ្វីខ្លះ និងចំនួន?
|
|
|
|
```python
|
|
print("The highest frequency reviewer nationality is " + str(nationality_freq.index[0]).strip() + " with " + str(nationality_freq[0]) + " reviews.")
|
|
# សូមចំណាំថាមានចន្លោះមួយនៅចំពោះមុខតម្លៃ strip() នឹងលុបចេញសម្រាប់ការបោះពុម្ព
|
|
# តើជាតិសម្លញ ១០អันดับខ្នងជាងគេមានអ្វីខ្លះ និងប្រេកង់របស់ពួកវា?
|
|
print("The next 10 highest frequency reviewer nationalities are:")
|
|
print(nationality_freq[1:11].to_string())
|
|
|
|
The highest frequency reviewer nationality is United Kingdom with 245246 reviews.
|
|
The next 10 highest frequency reviewer nationalities are:
|
|
United States of America 35437
|
|
Australia 21686
|
|
Ireland 14827
|
|
United Arab Emirates 10235
|
|
Saudi Arabia 8951
|
|
Netherlands 8772
|
|
Switzerland 8678
|
|
Germany 7941
|
|
Canada 7894
|
|
France 7296
|
|
```
|
|
|
|
3. តើសណ្ឋាគារណាដែលមានការពិនិត្យខ្ពស់បំផុតសម្រាប់ជាតិសញ្ជាតិទាំង ១០ ចំណាត់ថ្នាក់ខ្ពស់បំផុត?
|
|
|
|
```python
|
|
# សណ្ឋាគារណាមួយដែលមានការពិនិត្យច្រើនបំផុតសម្រាប់ជនជាតិ ១០ ប្រភេទលំដាប់ខាងលើ
|
|
# ជាធម្មតាជាមួយ pandas អ្នកនឹងជៀសវាងការបញ្ច្រាសរុំទម្រង់ដែលច្បាស់លាស់ ប៉ុន្តកចង់បង្ហាញការបង្កើត dataframe ថ្មីដោយការជ្រើសរើសលក្ខណៈពិសេស (កុំធ្វើនេះជាមួយទិន្នន័យច្រើនព្រោះវាអាចយឺតខ្លាំង)
|
|
for nat in nationality_freq[:10].index:
|
|
# ជាលើកដំបូងដកបន្ទាត់ទាំងអស់ដែលផ្គូផ្គងនឹងលក្ខខណ្ឌចូលទៅក្នុង dataframe ថ្មី
|
|
nat_df = df[df["Reviewer_Nationality"] == nat]
|
|
# ឥឡូវទទួលបានប្រេកង់សណ្ឋាគារ
|
|
freq = nat_df["Hotel_Name"].value_counts()
|
|
print("The most reviewed hotel for " + str(nat).strip() + " was " + str(freq.index[0]) + " with " + str(freq[0]) + " reviews.")
|
|
|
|
The most reviewed hotel for United Kingdom was Britannia International Hotel Canary Wharf with 3833 reviews.
|
|
The most reviewed hotel for United States of America was Hotel Esther a with 423 reviews.
|
|
The most reviewed hotel for Australia was Park Plaza Westminster Bridge London with 167 reviews.
|
|
The most reviewed hotel for Ireland was Copthorne Tara Hotel London Kensington with 239 reviews.
|
|
The most reviewed hotel for United Arab Emirates was Millennium Hotel London Knightsbridge with 129 reviews.
|
|
The most reviewed hotel for Saudi Arabia was The Cumberland A Guoman Hotel with 142 reviews.
|
|
The most reviewed hotel for Netherlands was Jaz Amsterdam with 97 reviews.
|
|
The most reviewed hotel for Switzerland was Hotel Da Vinci with 97 reviews.
|
|
The most reviewed hotel for Germany was Hotel Da Vinci with 86 reviews.
|
|
The most reviewed hotel for Canada was St James Court A Taj Hotel London with 61 reviews.
|
|
```
|
|
|
|
4. មានមតិប៉ុន្មានសម្រាប់សណ្ឋាគារមួយៗ (ចំនួនមតិសម្រាប់សណ្ឋាគារ) នៅក្នុងDataset?
|
|
|
|
```python
|
|
# ជាដំបូង បង្កើត dataframe ថ្មីមួយ ដោយផ្អែកលើតារាងចាស់ ហើយយកចេញពីជួរឈរដែលមិនចាំបាច់
|
|
hotel_freq_df = df.drop(["Hotel_Address", "Additional_Number_of_Scoring", "Review_Date", "Average_Score", "Reviewer_Nationality", "Negative_Review", "Review_Total_Negative_Word_Counts", "Positive_Review", "Review_Total_Positive_Word_Counts", "Total_Number_of_Reviews_Reviewer_Has_Given", "Reviewer_Score", "Tags", "days_since_review", "lat", "lng"], axis = 1)
|
|
|
|
# ក្រុមជួរដេកតាម Hotel_Name រាប់និយាយ ហើយដាក់លទ្ធផលក្នុងជួរឈរថ្មី Total_Reviews_Found
|
|
hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count')
|
|
|
|
# កំចាត់ជួរដេកដែលមានចម្លងទាំងអស់
|
|
hotel_freq_df = hotel_freq_df.drop_duplicates(subset = ["Hotel_Name"])
|
|
display(hotel_freq_df)
|
|
```
|
|
| Hotel_Name | Total_Number_of_Reviews | Total_Reviews_Found |
|
|
| :----------------------------------------: | :---------------------: | :-----------------: |
|
|
| Britannia International Hotel Canary Wharf | 9086 | 4789 |
|
|
| Park Plaza Westminster Bridge London | 12158 | 4169 |
|
|
| Copthorne Tara Hotel London Kensington | 7105 | 3578 |
|
|
| ... | ... | ... |
|
|
| Mercure Paris Porte d Orleans | 110 | 10 |
|
|
| Hotel Wagner | 135 | 10 |
|
|
| Hotel Gallitzinberg | 173 | 8 |
|
|
|
|
អ្នកអាចសង្កេតឃើញថាលទ្ធផល *គណនាទៅនូវតម្លៃក្នុងDataset* មិនត្រូវគ្នាជាមួយតម្លៃនៅក្នុង `Total_Number_of_Reviews`។ មិនច្បាស់ថាតម្លៃនេះក្នុងDatasetតំណាងឲ្យចំនួនមតិសរុបដែលសណ្ឋាគារមាន ឬមិនទាំងអស់ត្រូវបានទាញយកបាន ឬជាគណនាផ្សេងទៀត។ ដោយសារ `Total_Number_of_Reviews` មិនត្រូវបានប្រើក្នុងម៉ូដែលព្រោះករណីមិនច្បាស់នេះ។
|
|
|
|
5. ទោះបីមានជួរ `Average_Score` សម្រាប់សណ្ឋាគារនីមួយៗ នៅក្នុងDataset អ្នកក៏អាចគណនាគម្លាតមធ្យមសម្រាប់ម៉ាយវាណដែរ (យកគម្លាតមធ្យមនៃពិន្ទុអ្នកពិនិត្យទាំងអស់សម្រាប់សណ្ឋាគារនីមួយៗ)។ បន្ថែមជួរថ្មី `Calc_Average_Score` ទៅក្នុង dataframe ដែលមានគម្លាតមធ្យមបានគណនាថែមទៀត។ បោះពុម្ពជួរ `Hotel_Name`, `Average_Score`, និង `Calc_Average_Score`។
|
|
|
|
```python
|
|
# កំណត់មុខងារមួយដែលទទួលជួរដេកមួយហើយបំពេញការគណនាមួយជាមួយវា
|
|
def get_difference_review_avg(row):
|
|
return row["Average_Score"] - row["Calc_Average_Score"]
|
|
|
|
# 'mean' ជាពាក្យគណិតវិទ្យាសម្រាប់ 'មធ្យម'
|
|
df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)
|
|
|
|
# បន្ថែមជួរឈរថ្មីមួយដែលមានភាពខុសគ្នារវ่างពិន្ទុមធ្យមពីរដែលមាន
|
|
df["Average_Score_Difference"] = df.apply(get_difference_review_avg, axis = 1)
|
|
|
|
# បង្កើត df ដោយគ្មានច្បាប់ចម្លងទាំងអស់នៃ Hotel_Name (ដូច្នេះមានតែ 1 ជួរដេកសម្រាប់សណ្ឋាគារ)
|
|
review_scores_df = df.drop_duplicates(subset = ["Hotel_Name"])
|
|
|
|
# តម្រៀប dataframe ដើម្បីស្វែងរកភាពខ្ពស់ និងទាបបំផុតនៃភាពខុសគ្នារវាងពិន្ទុមធ្យម
|
|
review_scores_df = review_scores_df.sort_values(by=["Average_Score_Difference"])
|
|
|
|
display(review_scores_df[["Average_Score_Difference", "Average_Score", "Calc_Average_Score", "Hotel_Name"]])
|
|
```
|
|
|
|
អ្នកអាចសួរផងដែរអំពីតម្លៃ `Average_Score` និងហេតុអ្វីបានជា ពេលខ្លះខុសពីគម្លាតមធ្យមដែលគណនា។ ពិចារណាថាយើងមិនអាចដឹងថា ហេតុអ្វីខ្លះប៉ុន្មានតម្លៃត្រូវគ្នា ប៉ុន្តែខ្លះមានការប្រែប្រួលដូច្នេះ។ វាជាការប្រសើរបំផុតក្នុងករណីនេះ សម្រាប់ប្រើពិន្ទុពិនិត្យដែលយើងមានដើម្បីគណនាគម្លាតមធ្យមដោយខ្លួនឯង។ ទោះជាយ៉ាងណា ការប្រែប្រួលភាគច្រើនមានតិចណាស់។ នៅទីនេះគឺជាសណ្ឋាគារដែលមានភាពខុសគ្នាច្រើនបំផុតរវាងគម្លាតមធ្យមនៅក្នុងDataset និងគម្លាតមធ្យមដែលគណនា៖
|
|
|
|
| ផ្សេងគ្នាគម្លាតមធ្យម | គម្លាតមធ្យម | គម្លាតមធ្យមគណនា | ឈ្មោះសណ្ឋាគារ |
|
|
| :----------------------: | :-----------: | :----------------: | ------------------------------------------: |
|
|
| -0.8 | 7.7 | 8.5 | Best Western Hotel Astoria |
|
|
| -0.7 | 8.8 | 9.5 | Hotel Stendhal Place Vend me Paris MGallery |
|
|
| -0.7 | 7.5 | 8.2 | Mercure Paris Porte d Orleans |
|
|
| -0.7 | 7.9 | 8.6 | Renaissance Paris Vendome Hotel |
|
|
| -0.5 | 7.0 | 7.5 | Hotel Royal Elys es |
|
|
| ... | ... | ... | ... |
|
|
| 0.7 | 7.5 | 6.8 | Mercure Paris Op ra Faubourg Montmartre |
|
|
| 0.8 | 7.1 | 6.3 | Holiday Inn Paris Montparnasse Pasteur |
|
|
| 0.9 | 6.8 | 5.9 | Villa Eugenie |
|
|
| 0.9 | 8.6 | 7.7 | MARQUIS Faubourg St Honor Relais Ch teaux |
|
|
| 1.3 | 7.2 | 5.9 | Kube Hotel Ice Bar |
|
|
|
|
មានតែសណ្ឋាគារមួយតែប៉ុណ្ណោះដែលមានភាពខុសគ្នានៃពិន្ទុលើស ១ នេះមានន័យថាយើងអាចអបអរសាទរនូវការមិនគិតពីភាពខុសគ្នា និងប្រើគម្លាតមធ្យមដែលគណនាផ្ទាល់បាន។
|
|
|
|
6. គណនា និងបោះពុម្ពចំនួនជួរដេកដែលមានតម្លៃជួរ `Negative_Review` ជា "No Negative"
|
|
|
|
7. គណនា និងបោះពុម្ពចំនួនជួរដេកដែលមានតម្លៃជួរ `Positive_Review` ជា "No Positive"
|
|
|
|
8. គណនា និងបោះពុម្ពចំនួនជួរដេកដែលមានតម្លៃជួរ `Positive_Review` ជា "No Positive" **និង** `Negative_Review` ជា "No Negative"
|
|
|
|
```python
|
|
# ជាមួយ lambdas:
|
|
start = time.time()
|
|
no_negative_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" else False , axis=1)
|
|
print("Number of No Negative reviews: " + str(len(no_negative_reviews[no_negative_reviews == True].index)))
|
|
|
|
no_positive_reviews = df.apply(lambda x: True if x['Positive_Review'] == "No Positive" else False , axis=1)
|
|
print("Number of No Positive reviews: " + str(len(no_positive_reviews[no_positive_reviews == True].index)))
|
|
|
|
both_no_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" and x['Positive_Review'] == "No Positive" else False , axis=1)
|
|
print("Number of both No Negative and No Positive reviews: " + str(len(both_no_reviews[both_no_reviews == True].index)))
|
|
end = time.time()
|
|
print("Lambdas took " + str(round(end - start, 2)) + " seconds")
|
|
|
|
Number of No Negative reviews: 127890
|
|
Number of No Positive reviews: 35946
|
|
Number of both No Negative and No Positive reviews: 127
|
|
Lambdas took 9.64 seconds
|
|
```
|
|
|
|
## វិធីផ្សេងទៀត
|
|
|
|
វិធីផ្សេងទៀតដើម្បីរាប់ធាតុនៅគ្មាន Lambdas ហើយប្រើ sum ដើម្បីរាប់ជួរដេក៖
|
|
|
|
```python
|
|
# ដោយគ្មាន lambdas (ប្រើការលាយបញ្ចូលនៃកំណត់ត្រាដើម្បីបង្ហាញថាអ្នកអាចប្រើទាំងពីរបាន)
|
|
start = time.time()
|
|
no_negative_reviews = sum(df.Negative_Review == "No Negative")
|
|
print("Number of No Negative reviews: " + str(no_negative_reviews))
|
|
|
|
no_positive_reviews = sum(df["Positive_Review"] == "No Positive")
|
|
print("Number of No Positive reviews: " + str(no_positive_reviews))
|
|
|
|
both_no_reviews = sum((df.Negative_Review == "No Negative") & (df.Positive_Review == "No Positive"))
|
|
print("Number of both No Negative and No Positive reviews: " + str(both_no_reviews))
|
|
|
|
end = time.time()
|
|
print("Sum took " + str(round(end - start, 2)) + " seconds")
|
|
|
|
Number of No Negative reviews: 127890
|
|
Number of No Positive reviews: 35946
|
|
Number of both No Negative and No Positive reviews: 127
|
|
Sum took 0.19 seconds
|
|
```
|
|
|
|
អ្នកអាចមានចំណាប់អារម្មណ៍ថា មាន១២៧ជួរដេកដែលមានទាំង "No Negative" និង "No Positive" សម្រាប់ជួរ `Negative_Review` និង `Positive_Review` ដែលមានតំលៃនោះតាមលំដាប់។ នេះមានន័យថាអ្នកពិនិត្យបានផ្តល់ពិន្ទុត្រួតពិនិត្យសណ្ឋាគារ ប៉ុន្តែបានច្រានចោលមិនសរសេរពត៌មានវិជ្ជមាន ឬអវិជ្ជមានឡើយ។ អំណោយឥតបល់ មានតែមតិគត់ប៉ុណ្ណោះ (១២៧ ក្នុងចំនួន ៥១៥៧៣៨, ប្រហែល ០.០២%) ដូច្នេះវា ប្រហែលមិនប៉ះពាល់ឬឧបាំងពីលទ្ធផលម៉ូដែល ឬលទ្ធផលណាមួយទេ ប៉ុន្តែអ្នកប្រហែលមិនរំពឹងទុកថា dataset មួយដែលមានជាបន្ទាត់មតិ មានជួរដេកគ្មានមតិដែលសរសេរឡើយ ដូច្នេះវាគួរតែមានការស្វែងរកជ្រុងតម្កើងយ៉ាងណាមួយ។
|
|
|
|
ឥឡូវនេះអ្នកបានស្វែងរកឧទម្ដងហើយ មេរៀនបន្ទាប់ អ្នកនឹងតែងតែត្រងទិន្នន័យ និងបន្ថែមការវិភាគអារម្មណ៍។
|
|
|
|
---
|
|
## 🚀 បញ្ហា
|
|
|
|
មេរៀននេះបង្ហាញថា ដូចដែលយើងបានឃើញក្នុងមេរៀនមុនៗ វាសំខាន់យ៉ាងខ្លាំងក្នុងការយល់ដឹងអំពីទិន្នន័យរបស់អ្នក និងចំណុចខ្សោយរបស់វា មុនធ្វើប្រតិបត្តិការណ៍លើវា។ ទិន្នន័យផ្អែកលើអត្ថបទ ជាពិសេស ត្រូវការត្រួតពិនិត្យយ៉ាងប្រុងប្រយ័ត្ន។ រុករកដោយDatasetដែលមានអត្ថបទច្រើន និងស្វែងរកតំបន់ដែលអាចនាំឲ្យមានចំណោទធ្វើឲ្យម៉ូដែលមានអារម្មណ៍ក្រិតប្រើប្រាស់ ឬបង្វិលភ្នែក។
|
|
|
|
## [កម្រងសម្រាប់បញ្ញត្តិក្រៅម៉ោង](https://ff-quizzes.netlify.app/en/ml/)
|
|
|
|
## ការត្រួតពិនិត្យ និងរៀនដោយខ្លួនឯង
|
|
|
|
ចូលរួម [ផ្លូវការសិក្សាអំពី NLP](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77952-leestott) ដើម្បីស្វែងរកឧបករណ៍ដែលអាចប្រើបង្កើតម៉ូដែលសន្ទស្សន៍និងអត្ថបទច្រើន។
|
|
|
|
## ភារកិច្ច
|
|
|
|
[NLTK](assignment.md)
|
|
|
|
---
|
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
|
**ការបដិសេធៈ**
|
|
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំប្រឹងប្រែងស្វែងរកភាពត្រឹមត្រូវ សូមយល់ព្រមថាការបកប្រែដោយស្វ័យប្រវត្តិក្នុងខ្លះអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមនៅក្នុងភាសំបុរាណគួរត្រូវបានពិចារណាថាជាផ្លូវការជាព័ត៌មានសំខាន់។ សម្រាប់ព័ត៌មានសំខាន់ណាស់ យើងបញ្ជាក់ថាការបកប្រែដោយមនុស្សវិជ្ជាជីវៈគឺត្រូវបានណែនាំ។ យើងមិនដាក់ចំណាយខ្ចីចំពោះការយល់មិនត្រឹមត្រូវ ឬការបកប្រែខុសពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER END --> |