Botnoi Classroom — มาทำความรู้จักกับ Natural Language Processing กันดีกว่า

Arissara Chotivichit
botnoi-classroom
Published in
3 min readOct 24, 2019

Botnoi Classroom ได้เข้ามาสู่สัปดาห์ที่ 3 แล้ว สำหรับใครที่ยังไม่ได้อ่าน Medium ก่อนๆของ Botnoi ก็สามารถเข้าไปอ่านได้ตามลิ้งค์ด้านล่างเลยนะคะ

Data Science Pipeline

Features Extraction

Clustering

Artificial Neural Network

เพื่อไม่เป็นการเสียเวลาเรามาดูกันเลยว่า NLP นั้น คืออะไรค่ะ

NLP (Natural Language Processing)

NLP คือการทำให้คอมพิวเตอร์ของเราเข้าใจภาษามนุษย์ ซึ่งมันสามารถนำมาใช้ประโยชน์ในหลายๆด้าน อย่างเช่น การแปลภาษา, การตรวจสอบไวยากรณ์, personal assistant หรือ chatbot อย่าง Botnoi ที่สามารถโต้ตอบกับเราได้เปรียบเสมือนคุยกับคนจริงๆ, การแยกแยะและจัดกลุ่มบทความหรือข่าวต่างๆ, หรือแม้แต่ data science ที่ใช้ predict ลูกค้า

พอได้อ่าน Application คร่าวๆแล้ว เรามาเจาะลึกกันดีกว่าว่า NLP จริงๆแล้วมีวิธีการทำงานหรือหลักการยังไงบ้าง

เนื่องจากว่าตัว machine learning ของเราไม่สามารถประมวลผลไฟล์หรือข้อมูลต่างๆที่เป็นตัวอักษรได้ แต่สามารถประมวลข้อมูลที่เป็นตัวเลข (0101) ได้อย่างเดียว เราจึงต้องหาวิธีแปลงข้อมูลเหล่านั้นให้เป็นตัวเลข ซึ่งในบทความนี้ก็จะมาพูดถึงวิธีที่นิยมและใช้ง่ายที่สุดนั่นก็คือ Bag of words มาใช้เพื่อตอบสนองความต้องการนี้ และเพื่อให้เห็นภาพมากขึ้น เราจะใช้ dataset ของ Truemove ที่จะทำนายว่าลูกค้าต้องการจะสอบถามหรือรู้ข้อมูลอะไรค่ะ

Bag of words

ตามที่อธิบายไปด้านบน bag of words คือการ extract features จาก text ให้เป็นข้อมูลที่เป็นตัวเลขแล้วเก็บข้อมูลเหล่านั้นไว้ในรูปแบบของ dictionary {key:value} ซึ่ง dictionary จะมีทุกคำศัพท์ใน database จัดเรียงกัน จะใหญ่แค่ไหนก็ได้ มีตั้งแต่ ก-ฮ ก็ได้เลย

แต่ก่อนที่เราจะทำ อย่างแรกที่ต้องทำเลยคือการ tokenize หรือการแบ่งคำนั่นเอง บางภาษาอย่างเช่นภาษาอังกฤษนั้นการแบ่งคำๆนึงนั้นเป็นเรื่องง่ายมาก เพราะว่ามีการเว้นวรรคที่ใช้ในการแบ่งคำอยู่แล้ว ส่วนภาษาไทย การแบ่งคำนั้นเป็นสิ่งที่ทำได้ยากเพราะไม่มีสัญลักษณ์อะไรเลยที่บ่งบอกว่านี่คือคนละคำกัน แต่ไม่ต้องห่วงค่ะ เราสามารถใช้ library ที่ชื่อว่า pythainlp เพื่อช่วยเราแบ่งคำได้

Vectorisation

Vectorisation คือการเปลี่ยนคำให้เป็นตัวเลข (vector) นั่นเอง ซึ่งเราสามารถทำได้ 2 แบบคือ

  1. นับแค่ว่ามีคำนี้อยู่ในประโยคหรือไม่ (ใส่ค่า 1 ถ้ามีคำนั้นอยู่ในประโยค ใส่ค่า 0 ถ้าไม่มี)

2. นับจำนวนคำที่ปรากฎขึ้นในประโยคหรือ frequency

เราสามารถเลือกใช้วิธีไหนก็ได้ตามความเหมาะสมของ Dataset

ที่นี้เรามาลองทำกับตัว dataset ของเราบ้างดีกว่า

ngram จะอธิบายด้านล่างนะคะ

Calculating the Distance

เราสามารถคำนวนความเหมือนของคำได้โดยการหาระยะห่าง(distance) โดยใช้สูตร “Euclidience Distance” (ง่าย ๆ ก็คือพีทากอรัสที่เราเรียนกันมาตั้งแต่เด็ก ๆ นั่นเอง)

ตัวอย่างเช่น

เราจะเห็นได้ว่าสองประโยคนี้มีความต่างกันเพียงแค่ตัวประธานฉะนั้นระยะห่างระหว่างสองประโยคนี้(ความเหมือน)ก็ต้องใกล้กันมาก หากเราลองเอามาใส่ Euclidience Distance เราก็จะได้คำตอบเท่ากับรูท 2 ค่ะ

ปัญหาของ bag of words

มาถึงจุดนี้เรามาลองดูปัญหาที่เกิดขึ้นจาก bag of words และวิธีแก้กันดีกว่า

  1. ถ้าเกิด dictionary เรายาวมากๆแต่ประโยคเราสั้นมาก(มีจำนวนเลข0เยอะ) มันก็จะเปลืองพื้นที่ความจำของเรา ซึ่งที่ผ่านมาถ้าได้อ่าน medium ก่อนๆของ Botnoi Classroom เราก็จะเห็นว่า เราก็จะมีวิธีการ extract features อีกแบบนึงนั่นก็คือ Sparse Representation

2. เนื่องจาก bag of words ไม่ได้สนใจการเรียงคำของประโยค มันก็สามารถนำมาสู่ปัญหาเรื่องการเรียงคำที่ทำให้ความหมายอาจผิดเพี้ยนไปได้

ตัวอย่างเช่น

“ฉันกินปลา” กับ “ปลากินฉัน”

จะเห็นได้ว่าถ้าเรามาทำเป็น vector ทั้งสองตัวจะเหมือนกันเลย และคอมพิวเตอร์จะไม่สามารถแยกออกได้ แต่ไม่ต้องห่วงเราสามารถแก้ไขปัญหานี้ได้โดยการใช้ N Gram

N Gram คือการเอาคำในประโยคมารวมกันเพื่อที่จะสามารถเข้าในเนื้อหาของประโยคได้มากขึ้น (sequence of words) ซึ่ง N คือจำนวนของคำที่เราจะมารวมกัน

ถ้าเราลองเอา 2 Gram มาใช้กับตัวอย่างด้านบน เราก็จะได้ “ฉันกิน” “กินปลา” และ “ปลากิน” “กินฉัน” เราจะเห็นได้ว่าเราสามารถรู้ context ของประโยคนั้นๆมากขึ้นนั่นเอง

Model Training

ส่วนการ train model ที่เป็น vector จำนวนเยอะๆแบบนี้ LinearSVC จะเป็น การ train ที่ดีที่สุดค่ะ

พอเรา train แล้วหาค่า accuracy เราก็จะได้ 90.2% ซึ่งเป็นตัวเลขที่ใช้ได้เลยทีเดียว แต่ว่า!! ถ้าเราลองดูตัว train และ test dataset ที่เราใช้ เราจะเห็นได้ว่ามันมี column นึงที่ตัดคำมาให้เราเลย

ถ้าเราใช้ data ที่เค้าตัดคำมาให้แล้ว เราจะเห็นว่า accuracy จะลดลงเหลือเพียงแค่ 80%

สรุปแล้วคือเราได้พบว่าตัวตัดคำมีผลอย่างยิ่งสำหรับ dataset นี้ การใช้ deepcut ตัวตัดคำที่ complex กับ LinearSVC จะได้ acc ที่ 80% ในขณะที่ ตัวตัดคำ NewMM กับ LinearSVC กลับได้สูงถึง 90% เราได้ทดลองแบบไม่ใช้ตัวตัดคำแต่เป็น character base ngrams ก็จะได้อยู่ที่ 85%

หากจะสรุปว่าการ classify document ภาษาไทย วิธีการไหนดีที่สุด คงจะต้องทำการทดลองกับหลาย ๆ dataset แต่สิ่งสำคัญคือ บางครั้งหลายคนมักจะกระโดดไปที่ complex model ทันทีทั้งๆที่ ถ้า simple model มีการปรับหรือมีการจูนที่ถูกต้อง ก็ได้ผลลัพธ์ที่ไม่ได้แย่ แถมยังไม่ต้องใช้เครื่องแพงๆ ใช้ gpu ในการรัน โดยเฉพาะอย่างยิ่งหากจะต้องจัดการกับ data ขนาดใหญ่ค่ะ

และนี่ก็คือคร่าวๆเกี่ยว NLP ที่ได้เรียนรู้จาก Botnoi Classroom ถ้ามีผิดพลาดตรงไหนก็สามารถ comment ไว้ได้นะคะ (:สนใจเรียน data science -> Botnoi Classroom

สนใจใช้บริการในสร้างแชทบอท หรือให้คำปรึกษาเกี่ยวกับ AI & data science ติดต่อได้ผ่านเวป -> Botnoi และ FB Page Botnoi Consulting

Edited by: Arissara Chotivichit and Bhudharhita Teinwan

--

--

Arissara Chotivichit
botnoi-classroom

Freelance Programmer 👩🏻‍💻 Musician 🎸 Environmentalist 🐡