Introduction NLP with spaCy in Software Engineering Part 3 (Word Stemming และ Lemmatization)

Top'p Kullawattana
3 min readOct 17, 2019

--

เป้าหมายของการ stemming และการแทรกคำย่อ (lemmatization) คือ การลดรูปแบบของคำที่ผัน (inflected) หรือที่ได้รับไปยังรูปแบบของรูตหรือ base form ซึ่งวิธีการนี้มีความจำเป็นในงานที่เกี่ยวข้องกับ NLP มากมาย เช่น การดึงข้อมูลการสรุปข้อความจากการแยกหัวข้อและอื่น ๆ

ตัวอย่างการวิเคราะห์คำ

เช่น การวิเคราะห์คำว่า connect, connection, connecting, connected วิธีการหนึ่งในการทำวิเคราะห์ เรียกว่า Stemming เกี่ยวข้องกับการย่อส่วนนำหน้าและคำต่อท้ายที่ระบุได้ง่าย ๆ เพื่อสร้างคำศัพท์ที่ง่ายที่สุด ตัวอย่างเช่น Connection จะลบคำต่อท้าย “ion” และลดให้ถูกต้องเป็น connect การสกัดกั้นแบบง่าย ๆ มักเป็นสิ่งที่ต้องการ แต่การแทรกคำย่อ ซึ่งมองที่คำและรากของพวกเขา (เรียกว่า lemma) ตามที่อธิบายไว้ในพจนานุกรม มีความแม่นยำมากขึ้น (ตราบเท่าที่คำที่มีอยู่ในพจนานุกรม)

เนื่องจาก spaCy มีวิธีการ build-in เพื่อแบ่งคำลงใน lemma ของมัน เราจึงสามารถใช้สิ่งนั้นเพื่อการย่อคำได้ ในตัวอย่างง่ายๆ เราจะใช้ .lemma_ เพื่อสร้าง lemma สำหรับแต่ละคำที่เราวิเคราะห์

Stemming เป็นกระบวนการเรียนรู้แบบฮิวริสติก (heuristic process) ซึ่งคำลงท้ายจะถูกตัดออก เป็นการยับยั้งเกิดจากคำพูดโดยที่ไม่รู้บริบท ซึ่ง Stemming ไม่ใช่เรื่องง่ายอย่างที่เราเข้าใจ ถ้าเป็นเช่นนั้น จะมีเพียงการใช้งานเพียงครั้งเดียว การทำความเข้าใจ คือ ความล้มเหลวในการลดคำที่มีความหมายเดียวกันกับรูตเดียวกัน ตัวอย่างเช่น คำว่า jumped และ jumps อาจลดลงเป็น jump ในขณะที่ jumpiness อาจลดลงถึง jumpi

การทำเกินขอบเขต คือ ความล้มเหลวในการเก็บสองคำด้วยความหมายที่ต่างกัน ตัวอย่างเช่น general and generate อาจลดลงเป็น gener

NLTK ให้สเต็มเทอร์มิเลอร์หลายตัว (several stemmers) ซึ่งเป็น PorterStemmer ที่โดดเด่นที่สุดซึ่งมีพื้นฐานมาจากอัลกอริธึม Porter Stemming นี่เป็นส่วนใหญ่เพราะมันให้ผลลัพธ์ที่ดีกว่า ส่วนที่เหลือของ Stemmers อื่นๆ ได้แก่ SnowballStemmer และ LancasterStemmer เป็นมูลค่าการกล่าวขวัญว่า SnowballStemmer รองรับภาษาอื่นเช่นกัน ตัวอย่างโค้ดต่อไปนี้เปรียบเทียบ Stemmers ดังกล่าว

https://gist.github.com/LahiruTjay/9be0ed8082d3b1e0f63db8564f2d42f9#file-nlp-stemming-ipynb

Lemmatization เป็นกระบวนการที่ใช้คำศัพท์และการวิเคราะห์ทางสัณฐานวิทยา (morphological analysis) ของคำเพื่อลบจุดสิ้นสุดที่ผันกลับมาเพื่อให้ได้รูปแบบพื้นฐาน (รูปแบบพจนานุกรม) ซึ่งรู้จักกันในชื่อบทแทรก (lemma) มันเป็นกระบวนการที่ซับซ้อนซึ่งต้องการความเข้าใจในบริบทที่คำต่าง ๆ ปรากฏขึ้นเพื่อตัดสินใจเกี่ยวกับความหมาย ดังนั้น มันจึงใช้คำศัพท์เพื่อให้ได้รูปแบบราก (root form) ใช้เวลานานกว่าการกั้น (stemming) และมีแนวโน้มที่จะให้ผลลัพธ์ที่แม่นยำ

Lemmatization สามารถทำได้ด้วย NLTK โดยใช้ WordNetLemmatizer ซึ่งใช้ฐานข้อมูลคำศัพท์ที่เรียกว่า WordNet โดย NLTK จัดให้มีอินเตอร์เฟสสำหรับฐานข้อมูล WordNet คือ WordNetLemmatizer ใช้อินเทอร์เฟซเพื่อรับ lemma ของคำที่กำหนด เมื่อใช้ WordNetLemmatizer เราควรระบุส่วนของคำพูดที่ควรใช้เพื่อให้ได้มาซึ่ง lemma ที่ถูกต้อง คำสามารถอยู่ในรูปของคำนาม (n), คำคุณศัพท์ (a), คำกริยา (v) หรือคำวิเศษณ์ (r) ตัวอย่างโค้ดต่อไปนี้แสดงให้เห็นว่าการกระทำของ lemma โดย lemmatize เป็นฟังก์ชั่นเพื่อแสดงให้เห็นว่า lemma เปลี่ยนแปลงด้วยส่วนหนึ่งของคำพูดที่กำหนด

https://gist.github.com/LahiruTjay/d6fec64c509f58a6363e24e43509a615#file-nlp-lemmatization-ipynb

การตรวจสอบคำ (Lemmatization)

ในภาษาอังกฤษ (และภาษาส่วนใหญ่) คำจะปรากฏในรูปแบบที่แตกต่างกัน ดูประโยคทั้งสองนี้

  • I had a pony.
  • I had two ponies.

ประโยคทั้งสองพูดคุยเกี่ยวกับม้านาม แต่พวกเขาใช้การผันคำที่แตกต่างกัน เมื่อทำงานกับข้อความในคอมพิวเตอร์ การรู้รูปแบบพื้นฐานของแต่ละคำเพื่อช่วยให้รู้ว่าทั้งสองประโยคกำลังพูดถึงแนวคิดเดียวกัน มิฉะนั้นสตริง “pony” และ “ponies” จะมีลักษณะเหมือนคำสองคำที่ต่างกันโดยสิ้นเชิงกับคอมพิวเตอร์

ใน NLP เราเรียกการค้นพบกระบวนการนี้การแทรกคำย่อ การหารูปแบบพื้นฐานที่สุดหรือบทแทรกของแต่ละคำในประโยค เช่นเดียวกับคำกริยา นอกจากนี้เรายังสามารถย่อคำกริยาได้โดยการหารูปแบบของรากที่ไม่ย่อท้อ ดังนั้น “ฉันมีม้าสองตัว” I had two ponies จึงกลายเป็น “ฉัน [มี] [ม้าสองตัว]” I [have] two [pony]

โดยทั่วไปแล้วการทำ Lemmatization ให้เป็นไปตามปกติ โดยมีตารางการค้นหาของรูปแบบของคำแทรกตามส่วนของการพูด และอาจมีกฎที่กำหนดเองเพื่อจัดการคำที่คุณไม่เคยเห็นมาก่อน นี่คือลักษณะประโยคของเราหลังจาก lemmatization เพิ่มในรูปแบบรากของคำกริยา

การเปลี่ยนแปลงเดียวที่เราทำคือเปลี่ยน “is” เป็น “be”

สิ่งนี้เกี่ยวข้องกับการใช้คุณสมบัติ “lemma” ของคำที่สร้างขึ้นโดยตัวประมวลผล lemma นี่คือ โค๊ดสำหรับรับบทแทรกของคำทั้งหมด (lemma of all the words)

สิ่งนี้จะคืนค่าเฟรมข้อมูลสำหรับแต่ละคำ (Word) และคำศัพท์ (Lemma) ตามลำดับ

การเปรียบเทียบ Stemming กับ Lemmatization

การใช้งานทั้ง Stemming กับ Lemmatization ส่วนใหญ่จะขึ้นอยู่กับสถานการณ์ หากต้องการความเร็วจะเป็นการดีกว่าหากเราต้องการ stemming แต่ถ้าต้องการความแม่นยำก็ควรใช้ lemmatization

ข้อมูลโค้ดต่อไปนี้แสดงการเปรียบเทียบระหว่าง Stemming กับ Lemmatization

https://gist.github.com/LahiruTjay/c1af4b00f635ca2591e2f0cd19c78c1f#file-nlp-stemming-vs-lemmatization-ipynb

การกำหนดคำหยุด (Stop Words)

คือ กระบวนการที่ค้นหาคำง่ายๆ ที่มีความหมายน้อยมาก และส่วนใหญ่จะใช้เป็นส่วนหนึ่งของโครงสร้างไวยากรณ์ของประโยค เช่น “the”, “a”, “an”, “in” ฯลฯ ถูกพิจารณาว่าเป็นคำ แม้ว่ามันจะไม่ได้ดูเหมือนมากนัก แต่การหยุดการลบคำ มีบทบาทสำคัญเมื่อจัดการกับงานต่าง ๆ เช่น การวิเคราะห์ความเชื่อมั่น กระบวนการนี้ยังใช้โดยเครื่องมือค้นหาเมื่อสร้างดัชนีรายการของคำค้นหา โดย NLTK มาพร้อมกับคำหลัก corpora ซึ่งมีรายการคำหยุดสำหรับ 16 ภาษาที่แตกต่างกัน ไม่มีฟังก์ชั่นโดยตรงที่มอบให้โดย NLTK เพื่อลบคำหยุด แต่เราสามารถใช้รายการเพื่อลบคำเหล่านั้นออกจากประโยคโดยทางโปรแกรม หากเรากำลังเผชิญกับหลาย ๆ ประโยค ก่อนอื่นต้องแยกข้อความออกเป็นประโยคโดยใช้ sent_tokenize จากนั้นใช้ word_tokenize เราสามารถแบ่งประโยคเป็นคำต่อไปและจากนั้นลบคำหยุดโดยใช้รายการ ข้อมูลโค้ดต่อไปนี้แสดงกระบวนการนี้

https://gist.github.com/LahiruTjay/986b3c28c1062ec9ed15d1c35fb976ff#file-nlp-stop-word-removal-ipynb

ต่อไป… เราต้องการพิจารณาความสำคัญของแต่ละคำในประโยค ภาษาอังกฤษมีคำที่เติมมากที่ปรากฏบ่อย เช่น “and”, “the” และ “a” เมื่อทำสถิติเกี่ยวกับข้อความคำเหล่านี้จะมี noise รบกวนมาก เนื่องจากปรากฏบ่อยกว่าคำอื่น ๆ ในไปป์ไลน์ NLP บางอันจะตั้งค่าสถานะเป็นคำหยุด (Stop Words) นั่นคือคำที่เราอาจต้องการกรองออกก่อนทำการวิเคราะห์ทางสถิติ นี่คือลักษณะประโยคที่มีคำหยุดเป็นสีเทา

คำหยุดมักจะถูกระบุโดยเพียงแค่ตรวจสอบรายการ hardcoded ของคำหยุดที่รู้จัก แต่ไม่มีรายการคำหยุดมาตรฐานที่เหมาะสมสำหรับแอปพลิเคชันทั้งหมด รายการคำที่ไม่สนใจอาจแตกต่างกันไปขึ้นอยู่กับแอปพลิเคชัน ตัวอย่างเช่น หากเรากำลังสร้างเครื่องมือค้นหาวงดนตรีร็อก เราต้องแน่ใจว่า เราจะไม่เพิกเฉยกับคำว่า “The” เนื่องจากคำว่า “The” ไม่เพียงแต่ปรากฏในชื่อวงจำนวนมากเท่านั้น แต่ยังมีวงร็อคชื่อดังของปี 1980 ชื่อ The!

--

--

Top'p Kullawattana

Coding Stylist of Kept by Krungsri, I have experience of 10 years in the design and implementation of enterprise applications.