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

มันจะดีกว่าไหม ถ้าเราสามารถตัดสินใจได้ว่า อะไรกันแน่ที่สำคัญต่อเราจริงๆ ทำให้ข้อมูลมันสั้นๆ กระชับ แต่ได้ใจความ เพื่อให้เราได้นำไปใช้ตัดสินใจในเรื่องที่เราสนใจต่อไป
วันนี้เราเลยอยากแนะนำโมเดล 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 มาให้เราใช้งานง่ายๆเท่านั้นเอง

โค้ดทั้งหมด
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)