ขอให้โชคดีมีชัยในโลก NLP — Part 1

ทุกคนน่าจะเคยเห็นข่าวที่เกี่ยวกับ AI ที่มีความสามารถต่างๆ เช่น โต้วาทีแข่งกับคน หรือ Facebook ใช้ AI ช่วยในการแปลภาษา และอาจจะสงสัยว่าทำได้ยังไงกัน วันนี้ผมอยากเล่าในวิธีที่สร้างคอมพิวเตอร์ที่มีความสามารถในการเข้าใจภาษาต่างๆได้เหมือนที่คนเราเข้าใจครับ วิธีที่พูดถึงก็คือ การประมวลผลภาษาธรรมชาติ หรือ Natural Language Processing นั่นเองครับ แต่ก่อนอื่นต้องขออธิบายก่อนว่าภาษาธรรมชาติคืออะไร

ภาษาธรรมชาติ (Natural Language) คือ ภาษาที่มนุษย์ใช้สื่อสารและมีการเปลี่ยนแปลงไปตามวัฒนธรรมของผู้ใช้ภาษานั้นๆ ยกตัวอย่างเช่น ภาษาอังกฤษ, ภาษาไทย ซึ่งจะตรงข้ามกับภาษาประดิษฐ์ (Constructed Language) ซึ่งถูกสร้างเพื่อใช้วัตถุประสงค์เฉพาะ เช่น ภาษาคอมพิวเตอร์ หรือ ภาษาในวรรณกรรม

โดยทั่วๆไปแล้ว Natural Language Processing (ต่อไปนี้จะย่อว่า NLP) จัดเป็นแขนงหนึ่งใน Computer Science แต่ส่วนใหญ่แล้วในการทำงานที่เกี่ยวกับ NLP จะต้องใช้ความรู้ในด้านอื่นๆ เช่น Mathematics, Linguistics, Psychology หรือกระทั้ง Philoshphy[1] ดังนั้นเพื่อให้เห็นภาพรวมของงานด้าน NLP ได้ครอบคลุมที่สุด ผมจะขอใช้การแปลภาษาด้วยคอมพิวเตอร์ หรือ Machine Translation เป็นตัวอย่างประกอบในบทความนี้ครับ

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

Machine Translation หรือการแปลภาษาด้วยคอมพิวเตอร์นั้นเป็นตัวอย่างการใช้งานด้าน NLP ได้ครบถ้วน เพราะในการแปลภาษานั้น เราจำเป็นต้องแปลข้อมูลในภาษามนุษย์ ไปเป็นส่งที่คอมพิวเตอร์เข้าใจเพื่อประมวลผล และส่งผลลัพธ์มาเป็นภาษามนุษย์อีกครั้ง อย่างในรูปด้านล่าง

โดยในส่วนนี้จะเริ่มจากการวิเคราะห์ข้อความที่ต้องการจะแปลก่อนครับ โดยจะยกตัวอย่างให้เห็นภาพมากขึ้น สมมติผมอยากให้คอมพิวเตอร์แปลประโยคนี้เป็นภาษาอังกฤษ:

เพื่อนโทรมา “เฮ้ย! ไปตีกระบี่กัน” เออ กระบี่มึงนี่กูต้องเตรียมไปกี่พัน? เพลง กระบี่ไร้เทียมทาน ของคุณ KQ , รายการ The Rapper

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

การเตรียมข้อมูล (Data Preprocessing)

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

ในการ preprocess ประโยคที่เราต้องการจะแปลข้างต้น ก่อนอื่นเราต้องมาวิเคราะห์ประโยคข้างต้นว่าความหมายจริงๆคืออะไรก่อน ในที่นี้คือ

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

ถ้าให้คนจะแปลออกมาเป็นภาษาอังกฤษ ก็น่าจะได้ประมาณว่า

My friend said “Hey!, Let’s go swordfight”

yeah, how much do I need then?

disclaimer: เพื่อความไม่ซับซ้อน กระบี่ในที่นี้หมายถึงอาวุธประเภทหนึ่งนะครับ และการตีกระบี่น่าจะต้องใช้เงินจำนวนหนึ่ง

เราจะเห็นได้ว่ามีอักขระบางตัวที่ไม่ได้มีความหมายในประโยคนี้ ในที่นี้คืออักขระที่มีหรือไม่มีก็ไม่ได้ทำให้ความหมายเปลี่ยนไป ซึ่งก็คือ “, ”, และ ! เราต้อง ทำความสะอาดข้อมูล หรือ Data Cleansing ข้อความเหล่านี้ก่อนที่จะนำไปใช้งาน โดยปกติจะใช้ Regular Expression ซึ่งเป็นเครื่องมือที่ใช้หา pattern ต่างๆในข้อมูล นอกจากนี้เรายังนิยมใช้ Data Cleansing ในการแก้ไขข้อมูล(จากประสบการณ์ส่วนตัว คิดว่าขั้นตอนนี้เป็นงานที่สำคัญมากๆ และใช้เวลานานมากๆๆๆๆๆ เรียกได้ว่ากว่า 80% ของเวลาในการทำงานที่เกี่ยวกับ NLP เลยทีเดียว)

หลังจากทำความสะอาดเสร็จข้อมูลแล้ว ขั้นตอนต่อไปคือเราจะแยกข้อความของเราให้เป็นคำต่างๆก่อน ขั้นตอนนี้เราเรียกว่า การแบ่งคำ หรือ Segmentationโดยเราจะแยกคำแต่ละคำออกจากประโยคเพราะเราเชื่อว่าแต่ละคำมีหน้าที่และความหมายที่แตกต่างกัน ดังนั้นเราจึงต้องแยกข้อมูลที่เราต้องการให้อยู่ในหน่วยเล็กที่สุดก่อน โดยในภาษาอังกฤษ คำแต่ละในประโยคถูกแบ่งด้วยช่องว่างอยู่แล้ว ดังนั้นการแบ่งคำอาจจะไม่มีประเด็นเท่าไหร่ แต่ในภาษาอื่นๆ เช่นภาษาญี่ปุ่น หรือ ภาษาไทย การแบ่งคำถือเป็นประเด็นที่ท้าทายมาก ซึ่งปัจจุบันมีวิธีในการจัดการปัญหาการแบ่งคำในภาษาไทย มีหลายวิธีด้วยกัน ทั้งแบบ Dictionary Based โดยจับคู่คำที่ยาวที่สุด หรือ Machine Learning Based เช่น การใช้ Deep Learning อย่างไรก็ตามใน blog นี้ขอไม่ลงรายละเอียดเรื่องนี้

หลังจากที่เราแบ่งคำเป็นคำๆได้แล้วหน้าตาประโยคของเราจะเป็นประมาณนี้

เพื่อน|โทร|มา|เห้ย|ไป|ตี|กระบี่|กัน|เออ|กระบี่|มึง|นี่|ต้อง|เตรียม|ไป|กี่|พัน?

note — ผมข้ามประเด็นเรื่องการแบ่งประโยคเพื่อลดความซับซ้อน

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

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

Fake tales of San Francisco echo through the room.

ถ้าเราแบ่งคำภาษาอังกฤษด้วยช่องว่างระหว่างคำอย่างที่ได้พูดถึงก่อนหน้า เราจะได้ผลลัพท์ดังนี้

Fake|tales|of|San|Francisco|echo|through|the|room|.

จะเห็นว่า San และ Franciscoถูกแยกออกจากกัน แต่สิ่งที่ประโยคนี้ต้องการจะบอกคือ San Franciscoโดยในการจัดการกับปัญหานี้ทำได้หลายวิธี ได้แก่

*Normalization *คือการทำเปลี่ยนคำที่มีความหมายเดียวกันแต่มีวิธีการเขียนต่างกันให้อยู่ในรูปแบบเดียวกัน โดยอาจจะเป็น คำย่อ เช่นคณะรักษาความสงบแห่งชาติ, คสช, และ คสช. หรือ คำพ้องความหมาย เช่นรถ และ รถยนต์

Stemming & Lemmatization คือการลดรูปของคำๆเดียวกันให้อยู่ในรูปพื้นฐานของคำๆนั้น โดย Stemming และ Lemmatization มีความแตกต่างกันที่วิธีการลดรูป การ Stemming จะตัดส่วนท้ายของคำออกเพื่อให้เหลือแค่รากของคำนั้นๆ เช่น

ในขณะที่ Lemmatization คือการแปลงคำต่างๆ ให้อยู่ในรูปพื้นฐานของคำนั้นๆ เช่น

*Name Entity Recognition (NER) *เป็นการระบุคำที่มีความหมายเฉพาะ เช่น ชื่อคน ชื่อหน่วยงาน และรวมไปถึง เวลา หรือตัวเลขต่างๆ ให้คอมพิวเตอร์รู้จักเพื่อใช้เป็นข้อมูลเพิ่มเติมในการประมวลผล การทำ NER อาจจะใช้ได้ทั้งแบบ grammar based ซึ่งคือการสร้างชุดข้อมูลที่ถูกระบุด้วยคน หรือแบบ machine learning based ซึ่งทั้งสองวิธีมีข้อดีข้อเสียที่แตกต่างกัน ซึ่งในตัวอย่าง San Franciscoข้างต้น เราสามารถใช้ NER เพื่อแก้ปัญหาได้ครับ

นอกจากนี้เรายังสามารถนำคำที่อยู่ในกลุ่ม Stop Words หรือคำไม่ได้ส่งผลกับความหมายของข้อมูลเปลี่ยนไป เพื่อช่วยให้คอมพิวเตอร์สามารถเข้าใจความหมายได้ดียิ่งขึ้นอีกด้วย

ในปัจจุบัน กระบวนการ preprocess ที่เล่ามาทั้งหมด แต่ก็ยังไม่มีแนวทางสามารถใช้ได้กับทุกกรณีและมีผลลัพท์ที่น่าพอใจ ดังนั้นการจัดการปัญหาเหล่านี้ขึ้นอยู่กับแต่ลักษณะของภาษาและวัตถุประสงค์ของงานที่เราต้องการ

สำหรับการ preprocess ในภาษาไทย มีประเด็นที่ท้าทายอีกหลายประเด็น ถ้าสนใจสามารถอ่านเพิ่มเติมใน blog ของ ดร. ปรัชญาแห่ง NECTEC ซึ่งเขียนประเด็นต่างๆของการทำ NLP ในภาษาไทยได้ดีมากๆ

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

References: [1] Copestake, Ann, “Natural Language Processing”, https://www.cl.cam.ac.uk/teaching/2002/NatLangProc/revised.pdf

Have a question?

Drop us a line and we will get back to you