การทำ Text Mining เพื่อช่วยหาคำตอบ ในการตัดสินใจ

แชร์ความรู้ภาษา Python ไพทอน การเขียนโปรแกรมภาษาไพทอน

Moderator: mindphp, ผู้ดูแลกระดาน

rangsan
PHP Hero Member
PHP Hero Member
โพสต์: 199
ลงทะเบียนเมื่อ: 30/04/2018 9:44 am

การทำ Text Mining เพื่อช่วยหาคำตอบ ในการตัดสินใจ

โพสต์โดย rangsan » 11/05/2018 11:38 am

การทำ Text Mining

ต้องบอกก่อนว่าการทำ Text Mining นั้นเปรียบเสมือนการที่เราเอาข้อมูลต่าง ๆมาทำการกรองเพื่อจะแยกสิ่งที่เราต้องการที่จะทราบ ตัวอย่างในการทำ Text Mining ที่ผมจะยกมาคือการที่เราจะใช้ข้อมูลของ Twitter เกี่ยวกับข้อมูลของคำว่า Hbase กับ Cassandra ว่าคนพูดถึงคำไหนมากกว่ากัน

ขั้นตอนแรกนั้นเราจะต้องทำการ import library ที่จำเป็นมาเพื่อเตรียมใช้งาน

โค้ด: เลือกทั้งหมด

%matplotlib inline
import json
import pandas as pd
import matplotlib.pyplot as plt
import re


หลังจากนั้นก็ทำการอ่านไฟล์ข้อมูลที่เรามีอยู่

โค้ด: เลือกทั้งหมด

tweets_data_path = '../twitter_data.txt'

tweets_data = []
tweets_file = open(tweets_data_path, "r")

# Append Data to the variables
for line in tweets_file:
    try:
        tweet = json.loads(line)
        tweets_data.append(tweet)
    except:
        continue


ลองเช็คข้อมูลที่เราอ่านมาว่ามีจำนวนเท่าไหร่ครับ

โค้ด: เลือกทั้งหมด

print len(tweets_data)


ผลลัพธ์ที่ได้
ไฟล์แนป Selection_075.png ไม่มีอยู่แล้ว


เมื่อเราได้ข้อความมาแล้วนั้นขั้นต่อไปเราจะทำการสร้าง Data Frame ด้วย pandas

โค้ด: เลือกทั้งหมด

tweets = pd.DataFrame()

# Create 3 columns consist of text, lang, and country
tweets['text'] = map(lambda tweet: tweet['text'], tweets_data)
tweets['lang'] = map(lambda tweet: tweet['lang'], tweets_data)
tweets['country'] = map(lambda tweet: tweet['place']['country'] if tweet['place'] != None else None, tweets_data)


เมื่อเราได้ Data Frame มาแล้วนั้นต่อไปเราจะมาดูข้อมูลที่ได้จาก Data Frame ในรูปแบบของกราฟโดยใช้คำสั่งนี้

โค้ด: เลือกทั้งหมด

tweets_by_lang = tweets['lang'].value_counts()

fig, ax = plt.subplots()
ax.tick_params(axis='x', labelsize=15)
ax.tick_params(axis='y', labelsize=10)
ax.set_xlabel('Languages', fontsize=15)
ax.set_ylabel('Number of tweets' , fontsize=15)
ax.set_title('Top 5 languages', fontsize=15, fontweight='bold')
tweets_by_lang[:5].plot(ax=ax, kind='bar', color='red')
plt.show()


ผลลัพธ์
Selection_076.png
Selection_076.png (12.72 KiB) เปิดดู 164 ครั้ง


ต่อมาเราจะทำการสร้าง Function เพื่อใช้ค้นหาคำที่อยู่ในข้อความ โดยคำที่เราต้องการคือ Hbase กับ Cassandra

โค้ด: เลือกทั้งหมด

def word_in_text(word, text):
    word = word.lower()
    text = text.lower()
    match = re.search(word, text)
    if match:
        return True
    return False


ทำการจัดกลุ่มข้อความระหว่างทั้ง 2 คำโดยการสร้าง column เพิ่มใน Data Frame

โค้ด: เลือกทั้งหมด

tweets['hbase'] = tweets['text'].apply(lambda tweet: word_in_text('hbase', tweet))
tweets['cassandra'] = tweets['text'].apply(lambda tweet: word_in_text('cassandra', tweet))


เช็คผลที่ได้จากคำทั้ง 2 คำ

โค้ด: เลือกทั้งหมด

print tweets['hbase'].value_counts()[True]
print tweets['cassandra'].value_counts()[True]


ผลลัพธ์ที่ได้คือ
Selection_079.png
Selection_079.png (1.6 KiB) เปิดดู 164 ครั้ง


ลองดูในรูปแบบของกราฟ

โค้ด: เลือกทั้งหมด

db_type = ['hbase', 'cassandra']
tweets_by_db_type = [tweets['hbase'].value_counts()[True],
                    tweets['cassandra'].value_counts()[True]]

x_pos = list(range(len(db_type)))
width = 0.8
fig, ax = plt.subplots()
plt.bar(x_pos, tweets_by_db_type, width, alpha=1,color='g')
ax.set_ylabel('Number of tweets', fontsize=15)
ax.set_title('Rankging: hbase vs. cassandra (Raw data)', fontsize=10, fontweight='bold')
ax.set_xticks([p + 0.4 * width for p in x_pos])
ax.set_xticklabels(db_type)
plt.grid()
plt.show()


ผลลัพธ์ดังนี้
Selection_080.png
Selection_080.png (11.55 KiB) เปิดดู 164 ครั้ง


แต่ข้อมูลที่เราได้มานั้นจะเห็นได้ว่ามีความต่างกันมาก เพราะว่าไม่ได้เน้นไปที่คำใดคำนึงเช่น คำว่า Cassandra ที่เราต้องการนั้นเป็นเกี่ยวกับพวก Database, BigData และอื่น ๆ ซึ่งโปรแกรมไม่สามารถรู้ได้ดังนั้นเราต้องทำการกรองก่อน

คำสั่งเพื่อทำการกรองคำเชิงลึก
โดยเราจะกรองคำที่เกี่ยวข้องกับ คำว่า “bigdata”, “database”, “parallel”, “nosql”

โค้ด: เลือกทั้งหมด

tweets['relevant'] = tweets['text'].apply(lambda tweet: word_in_text('bigdata', tweet) or word_in_text('database', tweet) or word_in_text('parallel',tweet) or word_in_text('nosql', tweet))


ลองเช็คผลลัพธ์ที่ได้จากการกรองคำ

โค้ด: เลือกทั้งหมด

print tweets[tweets['relevant'] == True]['hbase'].value_counts()[True]
print tweets[tweets['relevant'] == True]['cassandra'].value_counts()[True]


ผลลัพธ์ที่ได้
Selection_081.png
Selection_081.png (1.28 KiB) เปิดดู 164 ครั้ง


จากผลลัพธ์จะเห็นได้ว่าเมื่อเราทำการกรองแล้วนั้นคำที่ออกมาจะน้อยลงไปมาก
เราลองมาดูในส่วนของกราฟกันต่อ

โค้ด: เลือกทั้งหมด

tweets_by_db_type = [tweets[tweets['relevant'] == True]['hbase'].value_counts()[True],
                     tweets[tweets['relevant'] == True]['cassandra'].value_counts()[True]]


width = 0.8
fig, ax = plt.subplots()
plt.bar(x_pos, tweets_by_db_type, width, alpha=1, color='r')
ax.set_ylabel('Number of tweets', fontsize=15)
ax.set_title('Ranking: hbase vs. cassandra (Relevant data)', fontsize=10, fontweight='bold')
ax.set_xticks([p + 0.4 * width for p in x_pos])
ax.set_xticklabels(db_type)
plt.grid()
plt.show()


ผลลัพธ์ของการทำกราฟ
Selection_082.png
Selection_082.png (11.51 KiB) เปิดดู 164 ครั้ง


เห็นได้ว่าคำว่า Cassandra นั้นลดลงเยอะมากนี่เป็นส่วนหนึ่งในการทำ Text Mining เพื่อดูตรวจสอบในสิ่งที่เราต้องการจะรู้ซึ่งข้อมูลที่ได้มานั้นอาจจะไม่ถูกต้อง 100% ขึ้นอยู่กับการตัดสินใจของเราเอง

อ้างอิง : lukkiddd.com
It’s never too late to start again.

ย้อนกลับไปยัง

ผู้ใช้งานขณะนี้

กำลังดูบอร์ดนี้: 4 และ บุคคลทั่วไป 0 ท่าน