ยาวไป ไม่อ่าน! มาใช้ “Transformer Model” ย่อข่าวสารการลงทุนให้เรากันดีกว่า

ในยุคของข้อมูลข่าวสารที่กว้างใหญ่และมีการเชื่อมต่อกันมากมายขนาดนี้ สิ่งที่เราหลีกหนีไม่ได้เลยก็คือ “ข้อมูลท่วม” ครับ

ไม่ว่าเราอยากจะศึกษาอะไรซักอย่างหนึง เราไปหาในกูเกิลก็จะเห็นว่า ผลการค้นหามันเยอะเหลือเกิน เช่น ถ้าเราอยากจะตามดราม่าในทวิตเตอร์ มันก็เยอะเหลือเกิน เราอยากจะประเมินข่าวเกี่ยวกับบริษัทที่เราสนใจ ข่าวมันก็ท่วมหัว สุดวิสัยที่เราจะมานั่งอ่านมันให้หมดได้จริงๆ สุดท้ายข้อมูลที่เราอุส่าไปค้นหามารวมกัน ก็มากองทับกับเป็น “กองดอง” อันเป็นที่รู้กันของคนชอบอ่านหนังสือ

Photo by Usman Yousaf on Unsplash

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

วันนี้เราเลยอยากแนะนำโมเดล Deep Learning Model ตัวหนึงที่ใช้ Mechanic ของ “Self-Attention model” มาช่วยเราสรุปย่อข้อความที่มันสำคัญจริงๆกันครับ

!pip install transformers

Import Library ที่จำเป็นตัวใหม่ที่เพิ่มขึ้นมาคือ transformers ซึ่งเป็นโมเดล attention model ซึ่งเป็น deep learning model ที่ใช้งานได้ดีในข้อมูลภาษา

ดึงข้อมูล GE_news.csv ซึ่งเป็นข้อมูลรวมข่าวของบริษัท General Electric: GE จำนวน 335 ข่าว

import pandas as pd
from transformers import pipeline

df = pd.read_csv("GE_news.csv", index_col=0)
df

ข้อมูลประกอบไปด้วย 4 Columns ชื่อข่าว เนื้อข่าว วันรายงานข่าว และ สำนักข่าว ตามลำดับ ลองดูเนื้อหาข่าวซัก 1 ข่าว

print(df.clean_text.iloc[10])'

จะเห็นว่า ข้อมูลในข่าวนั้นค่อนข้างยาว ถ้าเราต้องการสรุปข่าวนี้ให้สั้นๆ (เราอาจจะใช้โมเดลนี้กับข้อมูลทางภาษาอื่นๆดที่เราสนใจ อาจจะเป็นบทความในอินเตอร์เน็ตอื่นๆ ก็ได้) เพื่อสรุปมาว่าข่าวนั้นๆ พูดถึงบริษัทที่เราสนใจในด้านดีหรือด้านลบอย่างไร มีเนื้อหาที่สำคัญอะไรบ้าง เป็นต้น

จากนั้นเราจะเลือก pipeline ของ Transformers model มา ชื่อ pipeline มันก็ทำตามชื่อจริงๆครับ พวกเรื่องยิบย่อยจาก Tokenize ข้อมูลภาษา แปลงเป็นตัวเลขให้เราพร้อมใส่โมเดลให้เรา

summarizer = pipeline("summarization")

pipeline เราเลือก Task ที่เราอยากจะทำ ในที่นี้เราอยากจะย่อสรุปข่าว เราก็เลือก summarization ถ้าใครที่ยังไม่มีตัวนี้อยู่ในเครื่อง pipeline จะไปโหลด Pre-trained model มาให้เราครับ แล้วก็เค้าก็จะปรับโครงสร้างของ Model ให้ output ผลออกมาในรูปแบบที่เราต้องการ

เช่น ถ้าเราจะหา Sentiment ว่าข่าวนี้แง่บวกหรือลบ เราก็จะ Classification ออกมาว่าข่าวนี้ด้านไหน และบอกความมั่นใจว่ามั่นใจว่าแค่ไหน ข้อเสียอย่างหนึงคือคุณจะปรับโมเดลไม่ได้มากนัก เช่น คุณอยากจะจัดข่าวออกเป็น 5 ประเภท “บวกมาก”, “บวก”, “เฉยๆ”, “แย่”, “แย่มาก” มันก็ทำไม่ได้ ถ้าโมเดลนั้นๆ เทรนมาให้ทำนายแค่ 2 Class เราก็ต้องไปหาโมเดลใหม่ที่เหมาะกับเรา

ส่วนในกรณีของเราเค้าจะ Output เป็นการสรุปย่อข่าว ในส่วนที่ self attention คิดว่ามีความสำคัญแล้วสรุปออกมาให้เราครับ

กำหนดฟังก์ชั่น summarize_mytext ก็ไม่ได้มีอะไรมาก แค่นำข่าวไปสรุปความแล้วก็ปริ้นออกมาเทียบกันทั้งฉบับย่อ หัวข้อข่าวจริง เนื้อข่าวจริง

def summarize_mytext(text):
    result = summarizer(text.clean_text)
    print("*"*100)
    print("Summarize text: \n")
    print(result,"\n")
    print("*"*100)
    print("Original Text: \n")
    print(f"Tille:{text.title} \n")
    print(text.clean_text)
    print("*"*100)

จากนั้นเราทดลองใส่ข่าวไปดูซัก 1 ข่าวเพื่อดูเป็นตัวอย่าง

text = df.iloc[10]
summarize_mytext(text)

เราสามารถดูสรุปความของเราเทียบของจริงได้เลย แล้วดูว่ามันจับใจความได้ดีไหม อ่านรู้ไหมและสมเหตุสมผลไหม ในกรณีข่าวนี้ผมว่ามันทำงานใช้ได้ดีเดียว

ลองดูอีกซักข่าว

text = df.iloc[0]
summarize_mytext(text)

ผลออกมาจริงๆ ผมคิดว่ามีความผิดพลาดอยู่บ้าง แน่นอนว่านี่คือข่าวของ GE แต่การสรุปข่าวไม่ได้สรุป ส่วนของ GE มาเลยแต่ไปสรุปของ S&P500 NASDAQ Walt Disney, Apple หรือ รายละเอียดอย่าง Kimco realty coporation มาว่ามีผลงานอย่างไรซึ่งไม่ได้เกี่ยวกับสิ่งที่เราสนใจเลย

ซึ่งจริงๆมันก็ไม่ได้แปลกอะไร เพราะข่าวนี้เป็นข่าวของตลดหุ้นอเมริกา ที่มี GE อยู่ในนั้น และโมเดลนี้ก็ไม่มีทางรู้ได้เลยว่าจริงๆ แล้วเราสนใจ GE เป็นพิเศษ ฉะนั้นการสร้างโมเดลที่เจาะจงกับบาง Task ก็มีความสำคัญ จะเห็นได้ว่าต่างกับข่าวบน ข่าวบนนั้นเป็นเรื่องของ GE ล้วนๆครับ ย่อยังไงมันก็อยู่ในสโคปของ GE นั่นแหละ

สรุป มันก็ไม่ได้มีอะไรสมบูรณ์นะครับ แม้จะใช้ Attention model ก็เถอะ แล้วเราจะเห็นว่าโค้ดวันนี้มันน้อยมากจริงๆแล้วมันยาวนะครับ เค้าแค่ใจดี ทำ pipeline มาให้เราใช้งานง่ายๆเท่านั้นเอง

Photo by AbsolutVision on Unsplash

โค้ดทั้งหมด

https://github.com/AlgoAddict-all-about-data/Articles/tree/master/5_Transformer%20model

#!pip install transformers

import pandas as pd
from transformers import pipeline

df = pd.read_csv("GE_news.csv", index_col=0)
df.head()


print(df.clean_text.iloc[10])

summarizer = pipeline("summarization")

def summarize_mytext(text):
    result = summarizer(text.clean_text)
    print("*"*100)
    print("Summarize text: \n")
    print(result,"\n")
    print("*"*100)
    print("Original Text: \n")
    print(f"Tille:{text.title} \n")
    print(text.clean_text)
    print("*"*100)
    
text = df.iloc[10]
summarize_mytext(text)

text = df.iloc[0]
summarize_mytext(text)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s