kj

Word Cloud เปรียบเสมือนไข่เจียว

Print Friendly

สรรพคุณของไข่เจียวถูกบรรยายไว้อย่างชัดเจนในเพลงของเฉลียง:

 

แค่เพียงน้ำมันวางลงบนเตา รอไฟให้ร้อน
เหลืองไข่เหลืองและหอมกรุ่น ฟูฟูดูหน้ากิน…..

[1]

ฉันใดก็ฉันนั้น สรรพคุณของ WordCloud ในด้านความงดงาม และความง่ายในการใช้งาน ทั้งการผลิตและการบริโภค สามารถมองเห็นได้ทั่วไป ส่วนหนึ่งก็คือที่ footer ของเว็บ KM ของเรานี้เอง และอีกส่วนหนึ่งก็คือที่หน้า KM Analysis:

screenshot-2016-10-03-17-36-49 screenshot-2016-10-03-17-38-42

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

Word Cloud & Omelette

ประเด็นพิจารณา
ไข่เจียว
3c8606aj1997oa
Word Cloud
screenshot-2016-09-30-12-12-52
เหมือนจะทำได้ง่ายเพียงแค่ตอกไข่ ตีไข่ ตั้งน้ำมัน แล้วเทใส่กะทะเพียงแค่ copy-paste ข้อความลงในโปรแกรม
แต่ทำให้ดีได้ยากน้ำมันต้องร้อน, ไข่ต้องไม่เย็น, ใส่ผักอะไรบ้าง?, ใส่หมูมากแค่ไหน?, ใส่น้ำปลาหรือซอสถั่วเหลืองหรือแม็กกี้?, ทอดทีละกี่ฟอง?, จะพลิกไข่ตอนไหน?การตัดคำ, การกรองคำ (stop words), ขนาดตัวอักษร, สีตัวอักษร, ชนิดตัวอักษร, ขนาดของภาพ, ฟังก์ชั่นแปลงความถี่เป็นขนาด (linear/geometric/log)
ประโยชน์ฉับพลันกลิ่นหอม รสอร่อย ทานง่าย เข้ากับอาหารทุกชนิดสวยงาม เข้าใจง่าย ดูเหมือนจะเป็นตัวแทนของบทความได้ในเวลาอันสั้น
ประโยชน์ในเชิงลึกมีคุณค่าทางโภชนาการจำกัด มีไขมันสูง มีคลอเรสเตอรอลสูงไม่สามารถรองรับความซับซ้อนของภาษามนุษย์ได้ อาจทำให้เข้าใจผิด
ความเสี่ยงอาจเผลอบริโภคมากเกินไป เพราะทำได้ง่าย เร็ว ราคาถูก และอร่อยอาจนำมาใช้บ่อยเกินไป การชักจูงให้นึกไปว่าเข้าใจบทความแล้วโดยที่ไม่ได้อ่าน

Word Cloud นั้นแสนง่าย

หากท่านต้องการสร้าง Word Cloud อย่างรวดเร็ว โดยที่ไม่ต้องเขียนโปรแกรม ท่านสามารถใช้เว็บนี้ของ Jason Davies ซึ่งใช้ได้ง่าย ฟรี และไม่มีการส่งข้อมูลออกไปที่ server ภายนอก (ทุกอย่างทำงานโดย javascript บนเครื่องของท่าน)

https://www.jasondavies.com/wordcloud/

เพียงแต่ท่าน copy paste ข้อความลงไปก็จะมองเห็นภาพทันที เช่นตัวอย่างนี้เป็นข้อความจากข่าวเกี่ยวกับ Obama Care บน New York Times

screenshot-2016-10-03-17-44-02

ซึ่งเป็นภาพที่สวยงามพอสมควร และทำให้มองเห็นภาพคร่าวๆ ว่าเนื้อหาในบทความนี้คงจะเกี่ยวข้องกับ heath insurance และอะไรสักอย่างเกี่ยวกับ exchange โดยมีการกล่าวถึงชื่อ Trump มากกว่าชื่อ Obama เสียด้วยซ้ำ

อย่างไรก็ดีภาพนี้ยังดูค่อนข้างรกตา และขนาดของตัวอักษรที่มองเห็นอาจจะไม่ได้สื่อถึงความถี่ที่แท้จริงของของคำต่างๆ อย่างตรงไปตรงมา เมื่อมองไปที่มุมล่างซ้าย จะพบกับ option ที่เขียนว่า “Scale” ซึ่งตอนนี้ปรับไว้เป็น log n นั่นหมายความว่า ขนาดของตัวอักษรจะแปรผันตรงกับ log ของความถี่ ซึ่งแปลเป็นไทยอีกครั้งหนึ่งได้ว่า ตัวอักษรที่มีขนาดต่างกันเพียงเล็กน้อยนั้นอาจมีความถี่ต่างกันอย่างมโหฬารเลยก็ได้ อย่างเช่นในภาพนี้เราเห็นคำว่า Insurance ตัวใหญ่กว่าคำอื่นเพียงนิดเดียว อาจทำให้เข้าใจไปว่าความถี่ไม่ได้ต่างกันมากเท่าไหร่ แต่จริงๆ แล้วถ้าเราลองปรับ “Scale” ให้เป็น n (หรือเรียกว่าเป็น linear) จะพบว่าคำว่า health, insurance นั้นมีความถี่สูงกว่าคำอื่นๆ มากๆ

อีกสิ่งหนึ่งที่สมควรทดลองปรับแต่งเพื่อให้อ่านได้ง่ายขึ้นคือ orientation ซึ่งผมจะลองปรับให้มีทิศทางตัวอักษรเพียง 2 ทิศทาง คือ -45 และ +45 องศา ดังภาพ:
screenshot-2016-10-04-10-10-55

จากนั้นกด Go screenshot-2016-10-04-10-11-50 จะได้ผลลัพธ์ที่เรียบร้อยขึ้นดังนี้

screenshot-2016-10-03-17-51-48

เครื่องมืออื่นๆ

เครื่องมืออื่นๆ สำหรับการสร้าง Word Cloud นั้นมีอยู่มากมาย เครื่องมือแต่ละชิ้นมีระดับความยากง่าย ลูกเล่น และความฟรีแตกต่างกัน (บางอันอาจจะ free for any use หรือ free for non-commercial use, หรือบางอันอาจจะ open source หรือ not open source) อาทิ:

  1. Wordle by Jonathan Feinberg (เขียนขณะที่อยู่ IBM)
    http://www.wordle.net/
    screenshot-2016-10-04-10-15-44
  2. Kumo – Java Word Cloud by Kenny Cason
    http://kennycason.com/posts/2014-07-03-kumo-wordcloud.html
    screenshot-2016-10-04-10-20-36
  3. wordcloud2 library in R 
    https://cran.r-project.org/web/packages/wordcloud2/vignettes/wordcloud.html
    screenshot-2016-10-04-10-24-21

    1. สามารถเขียน WordCloud ได้ภายใน 3 บรรทัด!
         library(wordcloud2)
       data = read.csv("word_freq.csv")
       wordcloud2(data)
      
    2. สามารถทำ Letter Cloud ได้ด้วย ซึ่งเป็นลูกเล่นที่น่าสนใจนำมาปรับใช้ในงานโฆษณาประชาสัมพันธ์
      screenshot-2016-10-04-10-30-47
  4. อ่านเพิ่มเติมได้ที่ Word Cloud resources by Mock
    http://celt.li.kmutt.ac.th/mock/km/word-cloud-resources/

 


Word Cloud นั้นแสนยาก!?

ผมเพิ่งจะเล่าให้ฟังว่า Word Cloud นั้นใช้ง่าย และยกหลักฐานมาสนับสนุนเต็มไปหมด แต่ทำไมหัวข้อนี้จึงกล่าวว่า Word Cloud นั้นแสนยาก ล่ะครับ?

นั่นเพราะรายละเอียดของการสร้าง Word Cloud ให้สวยงามและมีประโยชน์นั้นมีความซับซ้อน กว่าจะออกมาเป็น Word Cloud ที่ชี้นำความเข้าใจของผู้อ่านได้ ผู้ออกแบบและผู้เขียนโปรแกรมจะต้องคำนึงถึงปัจจัยต่างๆ เช่น การตัดคำ, การกรองคำ (stop words), ขนาดตัวอักษร, สีตัวอักษร, ชนิดตัวอักษร, ขนาดของภาพ, ฟังก์ชั่นแปลงความถี่เป็นขนาด (linear/geometric/log), รายการคำในพจนานุกรม, ขนาดของไฟล์ข้อมูลและความเร็ว ฯลฯ

ผมจะอธิบายประเด็นสำคัญๆ บางประการ และจะเล่าให้ฟังว่าระบบ KM ของ LI มีแนวทางการจัดการกับประเด็นเหล่านี้อย่างไรในปัจจุบัน (อาจมีการเปลี่ยนแปลงในอนาคต)

programming vs one-time use: “สุขสมได้ดั่งใจหรือเป็นฝันชั่วคราว”

การสร้าง Word Cloud ขึ้นมาใช้ครั้งเดียวนั้นทำได้ง่าย ถ้าจะเสริมระบบ KM ให้ผู้อ่านสามารถมองเห็น Word Cloud ของข้อความต่างๆ นั้น แนวทางหนึ่งที่ทำได้ง่ายมากก็คือใส่ link ไปยังโปรแกรมสร้าง Word Cloud ของ Jason Davies แล้วให้ผู้ใช้ copy ข้อความไปแปะเอาเอง

กระบวนการนี้ง่ายสำหรับผู้ออกแบบระบบ และไม่น่าจะยากเกินไปสำหรับผู้ใช้ แต่ user experience จะย่ำแย่มากในระยะยาว เพราะผู้ใช้จะเริ่มรู้สึกว่ากระบวนการ copy-paste นั้น ทำให้เขาเสียเวลา และหากเขาต้องการดู Word Cloud ของข้อความทุกข้อความ (ทุก post) ในระบบ พร้อมๆ กัน เขาก็จะต้องใช้เวลาไม่น้อยในการ copy ข้อความจากทุกบทความ

สิ่งที่ง่ายสำหรับผู้ออกแบบนั้นไม่ง่ายสำหรับผู้ใช้ เราจึงต้องออกแบบใหม่ ให้เครื่องมือนี้ง่ายสำหรับผู้ใช้ แต่มันจะไม่ง่ายนักสำหรับผู้ออกแบบเพราะ

  1. บางโปรแกรมไม่อนุญาตให้เราดาวน์โหลดมาใช้งานได้
  2. บางโปรแกรม ยินดีให้เราใช้งานได้โดยการส่งข้อมูลไปประมวลผลที่ server ภายนอก แล้วรับข้อมูลกลับมา ซึ่งมีข้อเสียหลักๆ คือ เสี่ยงต่อการรั่วไหลของข้อมูล และ เสียเวลาในการถ่ายโอนข้อมูล
  3. ข้อมูลอาจมีการเปลี่ยนแปลงตลอดเวลา บทความอาจถูกเขียนขึ้นใหม่ หรือถูกลบออก หรือถูกแก้ไข ดังนั้น Word Cloud ต้องเปลี่ยนแปลงตามไปด้วย
  4. ต้องคำนึงว่าการเตรียมข้อมูลไว้ล่วงหน้าเพื่อทำ Word Cloud นั้นจะเตรียมในลักษณะใดดีจึงจะประมวลผลได้ง่าย เช่น เตรียมสำหรับทุกบทความแยกกันไป, เตรียมแยกตามประเภทของบทความ, แยกตามเวลา, แยกตามผู้เขียน

ระบบที่ใช้ในปัจจุบันเกิดจากการออกแบบโดยมีแนวทางการตัดสินใจดังนี้

  1. ใช้โปรแกรม wordcloud2.js ของ คุณ Timothy Guan-tin Chien ซึ่งฟรีและ open source! (Thanks, Timonthy!)
  2. เนื่องจากโปรแกรมนี้เป็น javascript จึงสามารถผลักภาระในการวาดภาพไปที่ client (เครื่องของ user) ได้ โดย server ส่งเพียงข้อมูลความถี่ของคำไปให้ user เท่านั้น ทำให้ประหยัด bandwidth ได้เมื่อเทียบกับการส่งภาพ
  3. ใช้ cron job ในการรันโปรแกรมประมวลผลข้อมูลทุก 14 นาที บน server
    1. ขั้นตอนที่ใช้เวลามากที่สุดคือการตัดคำ (ใช้เวลาประมาณ 0.13 วินาทีต่อบทความ หรือ 8.5 วินาทีสำหรับ 65 บทความ)
    2. ระบบจะดึงข้อมูลการตัดคำของเดิมที่เคยประมวลผลไว้แล้วถ้าบทความต้นฉบับไม่มีการเปลี่ยนแปลง ทำให้ประหยัดเวลาประมวลผลไปได้มาก (ใช้เวลาเพียง 0-1 วินาที สำหรับ 65 บทความ)
    3. สามารถบังคับให้ระบบตัดคำใหม่ได้โดย
      1. ตัดคำใหม่ครั้งเดียว: ลบ directory ชื่อ /var/www/celt/km/exp/corpus-latest
      2. ตัดคำใหม่ทุกครั้ง: แก้ไขไฟล์ /var/www/celt/km/exp/customization/config.csv โดยเปลี่ยนค่าของตัวแปร MUST_REDO_WORDCUT ให้เป็น true
    4. อ่าน log ได้ที่ /var/www/celt/km/exp/customization/compile_wp_stats.php.log.txt
  4. การประมวลผลข้อมูลแต่ละครั้ง เป็นการแปลงข้อมูลของทุกบทความเป็น versions ต่างๆ เช่น HTML, plain text จากนั้นระบบจะป้อน plain text ให้โปรแกรมตัดคำ แล้วบันทึกผลลัพธ์ ในรูปแบบของข้อความต่อเนื่องกัน คั่นด้วย delimeter เช่น วรรค หรือ ขีดตั้ง (|) และในรูปแบบของ histogram ซึ่งหมายถึงตารางสองคอลัมน์ คอลัมน์ซ้ายคือคำ คอลัมน์ขวาคือความถี่ เรียงตามลำดับความถี่จากมากไปน้อย โดย histogram นี้เองที่จะเป็น input สำหรับโปรแกรมสร้าง Word Cloud
    1. ระบบจะประมวลผลข้อมูลสำหรับทุกๆ บทความ (every post)
    2. ระบบจะนำข้อความจากทุกบทความมารวมกันเพื่อคำนวณ histogram สำหรับบทความทั้งหมด
    3. ระบบจะจำแนกบทความตาม tag และ category แล้วทำการคำนวณ histogram สำหรับแต่ละ tag/category
    4. ระบบจะจำแนกบทความตามชื่อผู้เขียน (author) แล้วทำการคำนวณ histogram สำหรับแต่ละ author
    5. ในอนาคต ระบบอาจจำแนกบทความตามเวลา โดยอาจแบ่งตามเดือนที่เริ่มเขียน แต่เนื่องจากยังมีระยะเวลาไม่นานพอที่จะเห็นผลอย่างมีความหมาย จึงยังไม่ดำเนินการเขียนโปรแกรมในส่วนนี้
    6. ระบบจะเขียนสรุปข้อมูลทั่วไปสำหรับทุก post, สำหรับแต่ละ post, แต่ละ tag/category, และแต่ละ author ไว้ในไฟล์ info ซึ่งประกอบด้วยข้อมูลสำคัญคือ
      1. จำนวน (คำ, บทความ, ตัวอักษร, tags, authors)
      2. คำที่มีความถี่สูงสุด 10 คำแรก (top 10 words)
      3. timestamp และ เวลาที่ใช้ในการประมวลผล
  5. เมื่อ user ต้องการดู word cloud สำหรับบทความหรือกลุ่มของบทความใด (แยกกลุ่มได้ตาม tag/category/author) ระบบ (javascript) จะดึงข้อมูลความถี่ของคำ (histogram) จาก server ผ่านทาง AJAX โดยใช้โปรแกรม Papa Parse ในการอ่านไฟล์ CSV แล้วแปลงข้อมูลให้เป็นรูปแบบที่สามารถส่งต่อให้ wordcloud2.js เพื่อวาดบนหน้าจอของผู้ใช้

การตัดคำภาษาไทย: “ขน-มอบ-กร-อบ”

การนับความถี่ของคำในภาษาอังกฤษนั้นทำได้ง่ายมาก เพราะขอบเขตของคำมีความชัดเจน แต่ละคำถูกคั่นด้วยเครื่องหมายวรรคตอน (การเว้นวรรค หรือการขึ้นบรรทัดใหม่) ทำให้เราสามารถ copy ข้อความภาษาอังกฤษแล้วไป paste ในกล่องข้อความของโปรแกรมของ Jason Davies แล้วเห็น word cloud ได้ทันที ซึ่งแท้จริงแล้วเราไม่ได้เห็นทันที แต่ในเบื้องหลังมีโปรแกรมหนึ่งคอยนับความถี่ของคำต่างๆ ที่ปรากฎในข้อความ

ถ้าเราทดลอง copy ข้อความภาษาไทย เพื่อนำไปแปะในโปรแกรมสร้าง word cloud ที่ไม่รู้จักภาษาไทย จะเกิดอะไรขึ้น? ผมทดลอง copy ข้อความจากทุกบทความในเว็บ KM ของเรา (244,449 ตัวอักษร) ไปแปะ ผลที่ได้คือภาพนี้:

screenshot-2016-10-04-14-32-04

ข้อสังเกตคือ 1) คำที่ตัวใหญ่ๆ มักเป็นคำภาษาอังกฤษ; 2) หน้าตาไม่แย่เกินไปนัก; และ 3) ดูเหมือนจะมีประโยชน์ในแง่การสร้างควาามเข้าใจได้อยู่เหมือนกัน (นี่เป็นความคิดที่อันตราย!)

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

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

เมื่อตัดคำเสร็จเรียบร้อยแล้ว ผลลัพธ์ของ word cloud ที่เกิดจากโปรแกรมเดียวกัน จะได้เป็นลักษณะนี้ ซึ่งแตกต่างจากผลลัพธ์ที่ไม่ได้ตัดคำโดยสิ้นเชิง:

screenshot-2016-10-04-14-50-26

แล้วเราจะเชื่อ word cloud อันไหนดี?

อันแรกดูมีสาระสำคัญมากกว่า แต่เรารู้อยู่แล้วว่ามันถูกผลิตขึ้นมาจากข้อมูลที่ไม่ถูกต้อง ส่วนอันที่สอง ถูกผลิตจากข้อมูลที่ตัดคำอย่างถูกต้อง แต่ทำไมจึงได้ดูเหมือนว่าจะเต็มไปด้วยคำที่ไม่สื่อให้เห็นใจความหลักของบทความเลย? นี่เป็นประเด็นในเรื่องของ stop words (คำที่ต้องคัดกรองออก) ซึ่งจะอธิบายในหัวข้อถัดไป สำหรับหัวข้อนี้ ขออธิบายก่อนว่าระบบ KM ของเรามีการประยุกต์ใช้ระบบตัดคำภาษาไทยอย่างไร

เราใช้โปรแกรมตัดคำชื่อ wordcut ของคุณ วีร์ สัตยมาตย์ (Vee Satayamas) (free and open source) ซึ่งทำงานบน Node.js รันบน server เป็นโปรแกรมอิสระ (stand-alone) ใช้งานได้ง่ายมาก รับ input ทาง standard input และเขียน output สู่ standard output สามารถรับ parameters ได้สองรายการคือ 1) พจนานุกรม (รายการคำ); และ 2) ตัวคั่นคำใน output (delimeter)

โปรแกรมนี้ทำงานได้เกือบ perfect เพราะสามารถตัดคำส่วนใหญ่ได้ถูกต้อง แต่จะมีบางครั้งที่โปรแกรมเข้าใจไม่ตรงกับเรา (ขอไม่เรียกว่าเข้าใจผิด เพราะความจริงไม่มีความชัดเจนว่าอะไรผิดหรือถูก) ในเรื่องของเครื่องหมายวรรคตอนพิเศษ ที่ไม่ควรนับเป็นส่วนหนึ่งของคำ เช่น ไม่ยมก, เครื่องหมายคำพูด, ฯลฯ ซึ่งผมได้เขียนโปรแกรมเพิ่มวรรคเข้าไปก่อนหน้าและหลังจากอักขระเหล่านี้

screenshot-2016-10-04-15-09-45

จากนั้นฟังก์ชัน wordcut ใน common.php จะเรียกใช้โปรแกรม wordcut โดยสื่อสารผ่านทาง pipe [2] แล้วเก็บ output ไว้ 3 versions แยกตามการใช้ delimeter สามแบบคือ แบบถูกต้องแน่นอน (unique), แบบใช้ pipe (|), และแบบใช้การเว้นวรรค

ตัวอย่างผลการตัดคำ บทความเรื่อง การผวนคำ ในมุมมองแบบคณิตศาสตร์ ของ อ.โตโต้:

screenshot-2016-10-04-15-17-39

แม้ว่าการบันทึกข้อมูลในลักษณะนี้จะสะดวกและทำให้ตรวจสอบความถูกต้องได้ง่าย การนับความถี่เพื่อประโยชน์ในการวาด word cloud สามารถทำได้ยาก และการรวมความถี่ของหลายๆ บทความ กรณีที่ต้องการจำแนกบทความเป็นกลุ่มตาม tag/category หรือ author สามารถทำได้ยาก

ปัจจุบันจึงมีการคำนวณ histogram หรือตารางความถี่ของคำต่างๆ ไว้ล่วงหน้า (แยกตาม post, tag, author, และความถี่ทั้งหมด)  โดยไฟล์ที่ใช้เก็บเป็น CSV สองคอลัมน์ (คำ, ความถี่) เรียงตามความถี่จากมากไปน้อย

screenshot-2016-10-04-15-42-02

stop words (คำที่ต้องคัดกรองออก): “ถ้าอายจะหายไปจากประโยคเหล่านั้น”

คำบางคำ ถูกใช้บ่อย แต่ไม่สื่อถึงความหมายของบทความ (เช่นคำว่า The) เราเรียกคำเหล่านี้ว่า stop words หากเรานำคำเหล่านี้มาคำนวณความถี่ร่วมกับคำอื่นๆ จะทำให้ภาพรวมของความถี่ไม่เป็นไปอย่างที่ต้องการ เช่นลองพิจารณา 3 บทความต่อไปนี้ และ word cloud สองแบบ

 บทความ
with stop words
 without stop words
6+1 Flagship track 1  screenshot-2016-09-29-16-31-06  screenshot-2016-09-29-17-26-02
Recycling plastic bottle caps  screenshot-2016-09-29-16-31-14 screenshot-2016-09-29-17-25-58
 Learning Lunch Box  screenshot-2016-09-29-17-07-15  screenshot-2016-09-29-17-26-09

 

จะเห็นได้ชัดเจนว่า word cloud ทางขวามีคำที่มีความหมายสื่อถึงใจความของบทความมากกว่า และเราทราบชัดเจนว่านี่ไม่ใช่ผลข้างเคียง (artifact) ที่เกิดจากความผิดพลาดหรือข้อจำกัดของระบบ แต่เกิดจากการออกแบบโดยตั้งใจ เพื่อตัดคำที่ใช้อย่างฟุ่มเฟือยออกไป

คำที่ถูกตัดออกไปนั้น มีที่มาจากสองแหล่งดังต่อไปนี้:

  1. Apache Lucene: https://lucene.apache.org
  2. Stanford Core NLP: http://stanfordnlp.github.io/CoreNLP/

นอกจากนี้ผู้ใช้ยังสามารถกำหนด stopword ได้เอง โดยเขียนใส่ text file บรรทัดละคำ แล้วเพิ่มไฟล์ไว้ที่ /var/www/celt/km/exp/customization/stopwords

ขนาดของภาพ, ตัวอักษร, ชนิดของตัวอักษร

กว่าจะสร้าง word cloud ให้มีความสวยงาม อ่านง่าย ผู้ออกแบบต้องทดลองปรับ parameter ต่างๆ เช่น ชนิด font, ขนาด font, ขนาดของ canvas (บริเวณวาดภาพ) ไม่เช่นนั้นแล้วภาพที่ออกมาจะบิดเบี้ยว ไม่น่าชม เช่น:

download

screenshot-2016-09-23-18-27-07

และนี่คือแนวทางการปรับ parameter ที่เราเลือกใช้ใน cloud4.js

  1. เลือก font family เป็น “Impact” จะได้ตัวอักษรหนา หนักแน่น อ่านง่าย
  2. เลือกขนาดกรอบภาพ (canvas size) เร่ิมต้นให้มีความสูง 600 pixels มีความกว้างเท่ากับความกว้างของ container (หรือของ browser) ทั้งนี้ user สามารถปรับเปลี่ยนความสูงภายหลังได้ ผ่าน javascript
  3. เลือกขนาดตัวอักษรใหญ่สุด (สำหรับคำที่มีความถี่มากที่สุด) เท่ากับ 100 point แล้วปรับลดขนาดตัวอักษรลงมาตามความถี่และตามความสูงของ canvas ที่ผู้ใช้กำหนด (linear scale) (ทั้งนี้ user สามารถกำหนด factor ขนาดตัวอักษรเป็น percent ได้เองอีกด้วย ผ่านทางตัวแปร fontZoomPercent
  4. กำหนดให้ความน่าจะเป็นที่คำแต่ละคำจะถูกหมุน เท่ากับ 0.5

screenshot-2016-10-04-16-36-54

พจนานุกรม

เท่าที่ผมเข้าใจ ระบบตัดคำใช้ algorithm ที่พยายามแบ่งประโยคเป็นคำๆ โดยให้ผลลัพธ์มีค่าเฉลี่ยความยาวของคำมากที่สุด โดยระบบมีรายการของคำในภาษาไทย เก็บแยกตามชนิดต่างๆ ของคำ ใน directory นี้: /usr/local/lib/node_modules/wordcut/data โดยมีจำนวนคำทั่งหมด 24211 คำ

screenshot-2016-10-04-16-47-53

โปรแกรม wordcut อนุญาตให้เราสร้าง dictionary เองได้ โดยเราจะเพิ่มคำหรือลดคำก็ได้ แต่การปรับเปลี่ยน dictionary เช่นนี้มีประโยชน์อย่างไร?

พิจารณา word cloud ที่เกิดจากบทความ HOW TO – ทาโร่ อบกรอบ ของคุณไพฑูรย์ ซึ่งใช้ dictionary มาตรฐาน

screenshot-2016-09-30-12-13-42

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

screenshot-2016-09-30-12-12-52

คำว่า ทาโร่ ได้รับการพิจารณาโดยระบบว่าเป็นคำ มีการนับความถี่อย่างถูกต้อง และมีการแสดงผลอย่างมีความหมายดีขึ้นกว่าเก่า การปรับปรุง dictionary ให้มีคำเฉพาะ (รวมถึงชื่อคน ชื่อผลิตภัณฑ์ และคำทับศัพท์บางคำ) จะทำให้ word cloud มีประโยชน์มากขึ้น

ผู้ใช้สามารถเพิ่มคำเข้าไปใน dictionary เองได้ โดยแก้ไขไฟล์ /var/www/celt/km/exp/customization/custom_dict.txt ซึ่งปัจจุบันมีอยู่ 15 คำคือ

ผู้เรียน
ผู้สอน
ผู้ใช้
ผู้เขียน
ทาโร่
เชื่อมโยง
มาโตรชก้า
มาโตรชกา
มาโตรซก้า
มาโตรซกา
ลูกดก
ผนวกเดช
สุวรรณทัต
กฤษณพงศ์
กีรติกร

หลังจากแก้ไข custom_dict.txt แล้วจะต้อง run โปรแกรม wordcut ใหม่ทุกครั้ง

แนวคิดสำหรับอนาคต (Future work)

  • เพิ่มชื่อและนามสกุลของผู้ใช้ทุกคนเข้าใน dictionary โดยอัตโนมัติ (ง่าย)
  • ให้ผู้เขียนบทความกำหนดคำพิเศษ (เช่น ศัพท์เทคนิค) ได้เลยในขณะเขียนบทความ (ออกแบบยาก)

ขนาดไฟล์และความเร็ว

ใน design แรก ทุกครั้งที่มีการวาด word cloud ระบบจะดาวน์โหลด histogram.csv จาก server มาที่เครื่องของผู้ใช้ (ผ่านทาง AJAX) แล้วจึงวาดบนหน้าจอ ซึ่งการออกแบบเช่นนี้มีข้อดีตรงที่ระบบจะไม่ freeze ระหว่างการส่งข้อมูล แต่ก็ยังมีความเสี่ยงกรณีที่ไฟล์ข้อมูลจะมีขนาดใหญ่ ใช้เวลาส่งข้อมูลมาก ทำให้ user ต้องรอเป็นเวลานานกว่าจะเห็น word cloud ภาพใหม่

ขนาดของไฟล์ histogram ไม่ได้แปรผันตามขนาดของบทความ แต่แปรผันตามจำนวนคำที่ไม่ซ้ำกัน (unique words) ในบทความนั้น ซึ่งปัจจุบัน เมื่อเรารวบรวมทุกบทความเข้าด้วยกัน (76 บทความ) จะมีคำทั้งหมด 53,921 คำ เป็นคำที่ไม่ซ้ำกันอยู่ 5,176 คำ และเมื่อตัด stop words ออกไป จะเหลือคำเพียง 4,983 คำ ซึ่งถือว่ามีจำนวนไม่มาก ไฟล์ histogram.csv มีขนาดสูงสุดเพียงแค่ 71.3 KB

screenshot-2016-10-04-18-04-41

อย่างไรก็ดี ในอนาคตเป็นไปได้ว่าบทความบางบทความอาจมีคำใหม่ๆ อยู่เป็นจำนวนมาก ส่งผลให้ histogram มีขนาดใหญ่ขึ้นจนส่งผลกระทบต่อเวลาในการดาวน์โหลดอย่างมีนัยสำคัญได้ ผมจึงได้ออกแบบระบบให้เขียน histogram.csv สำหรับทุกๆ บทความหรือกลุ่มของบทความ ควบคู่ไปกับ ไฟล์ลูก อีกไฟล์หนึ่ง ชื่อว่า histogram.wc.csv ทุกครั้งโดยอัตโนมัติ โดยไฟล์ลูกนี้จะมีจำนวนคำไม่เกิน 100 คำเสมอ (เป็น 100 คำที่มีความถี่สูงสุด)

จากการทดลองคร่าวๆ พบว่าคำเพียง 100 คำก็สามารถนำมาใช้สร้าง word cloud ที่สื่อความหมายได้ดีพอสมควร ทั้งนี้ user สามารถแก้ไขค่านี้ได้ที่ตัวแปร histogramLimit_4_WordCloud ในไฟล์ config.csv

ผู้ใช้สามารถเลือกแสดง histogram แบบรวดเร็ว (ค่า default) หรือ histogram โดยสมบูรณ์ก็ได้ โดยจะมีความแตกต่างในรายละเอียดเล็กน้อย ดังภาพ:

top 100 words
full histogram
 screenshot-2016-10-04-18-16-23  screenshot-2016-10-04-18-16-09

ค่าที่ตั้งไว้มาตรฐาน คือการแสดง histogram แบบรวดเร็ว ซึ่งจะแสดงผลอย่างรวดเร็วเสมอ (ขนาดไฟล์เพียง 1.8 KB) โดยไม่ขึ้นกับว่าเว็บ KM ของเราจะเติบโตขึ้นมากเพียงไร มีกี่บทความ หรือว่ามีขนาดบทความเท่าใด


ประโยชน์ฉับพลันของ Word Cloud

ประโยชน์สูงสุดของ Word Cloud นั้นคือ เข้าใจได้ง่ายในฉับพลัน โดยไม่ต้องอาศัยคำอธิบาย ส่งผลให้เทคนิคการแสดงผลข้อมูลแบบนี้ เข้าถึงมวลมหาประชาชนได้ง่าย ซึ่งสอดคล้องกับแนวคิดของกลุ่มวิจัยทางด้าน Visualization ที่ IBM Watson ซึ่งกล่าวไว้ว่า

data visualization should make data analytics accessible to anyone, not just the data’s experts. We also believe that using social software for communication is the new norm, not a trend.

(นอกเรื่อง:) เมื่อปี 2009 ผมได้มีโอกาสเข้าร่วมประชุมวิชาการ Visweek 2009 ที่ Atlantic City, New Jersey ในงานเลี้ยงอาหารคำ่ ผมและอาจารย์ที่ปรึกษาได้มีโอกาสนั่งโต๊ะร่วมกับคุณ Fernanda B. Viégas นักวิจัยของบริษัท IBM ซึ่งในขณะนั้นศูนย์วิจัยเกี่ยวกับ data visualization ชื่อว่า Many Eyes เป็นต้นกำเนิดของโปรแกรมผลิต word cloud ชื่อ Wordle อันโด่งดัง เราได้พูดคุยกันหลายเรื่อง คุยกันถูกคอเพราะนอกจากเราจะทำวิจัยเรื่องที่เกี่ยวข้องกันแล้ว ชื่อ labs ของเราทั้งสองกลุ่มยังคล้ายกันอีก: lab ที่ UCSB มีชื่อว่า Four Eyes Lab ส่วนที่ IBM ชื่อว่า Many Eyes

(เข้าเรื่อง:) Dr Viégas เขียน paper ที่น่าสนใจมาก ชื่อว่า Participatory visualization with Wordle [6] เนื้อหาเป็นการวิเคราะห์ความสำเร็จของ Wordle ว่าเกิดจากสาเหตุใดบ้าง ผ่านทางการวิเคราะห์การใช้งานและการทำสำรวจกลุ่มผู้ใช้ มีประเด็นที่น่าสนใจดังนี้

  1. Wordle เป็นส่วนหนึ่งของวัฒนธรรมแห่งการมีส่วนร่วม (participatory culture) ซึ่งผู้ชมมีส่วนในการสร้างสรรค์ ทั้งวิเคราะห์ ปรับแต่ง เรียบเรียงใหม่ (remix)
  2. แรงจูงใจที่ทำให้ผู้คนใช้ Wordle มีสามประการคือ: เพื่อความสนุก, เพื่อความคิดสร้างสรรค์, และเพื่อการศึกษา (ครูท่านหนึ่งบอกว่าใช้ตรวจงานนักเรียนว่ามีการใช้คำใดคำหนึ่งมากเกินไปหรือไม่)
  3. ปัจจัยหลักที่ทำให้ Wordle ประสบความสำเร็จ (เมื่อเทียบกับ tag cloud) คือ
    1. emotional impact:
      กระทบต่ออารมณ์ (ส่วนหนึ่งเกิดจากการใช้สี)
    2. attention-keeping visuals:
      ดึงความสนใจไว้ได้นาน ยิ่งดูก็ยิ่งอยากสำรวจรายละเอียดเชิงลึก
    3. non-linearity
      กระตุ้นความคิดนอกกรอบ จากลักษณะการจัดวางข้อความที่ฉีกขนบ (ไม่ได้เรียงตามบรรทัด ไม่ได้ขนานกับแนวนอน)

สรุปคือ Word Cloud สามารถใช้เพื่อดึงความสนใจและความอยากมีส่วนร่วมจากสาธารณชนได้ ทำให้ผู้คนรู้สึกว่าสามารถมองเห็นข้อมูลขนาดใหญ่ได้ในเวลาอันสั้น และทำให้ผู้คนอยากศึกษาในเชิงลึกมากขึ้น


ข้อควรระวังของ Word Cloud

อาจารย์ Carmel McNaught และ Paul Lam จาก Centre for Learning Enhancement And Research (CLEAR) ที่ The Chinese University of Hong Kong (อาจจะคล้ายกับ CELT ของ KMUTT) เขียน paper ความยาว 16 หน้า ในหัวข้อ “Using Wordle as a supplementary research tool.” [7] เพื่อวิเคราะห์ความเป็นไปได้ของการนำ word cloud มาใช้เป็นเครื่องมือประกอบการวิจัย โดยเฉพาะงานวิจัยทางด้านการศึกษา เขาพบว่าประโยชน์ของ word cloud นั้นมีอยู่จริง แต่มีข้อควรระวังดังนี้

  1. การใช้ในงานประชุม: ไม่ควรใช้ word cloud กับ บันทึกสรุปการประชุม แต่ควรใช้กับ บันทึกถอดเสียงที่พูดจริง ในที่ประชุม ไม่เช่นนั้นแล้วความถี่ของคำบางคำที่สูญหายไปในระหว่างการบันทึกสรุปจะส่งผลให้ word cloud ไม่สามารถจับประเด็นสำคัญที่พูดบ่อยๆ ได้
  2. ความถี่: ความถี่ของคำเป็นเพียงมิติหนึ่งของการวิเคราะห์ข้อความเท่านั้น ยังมีเทคนิคอื่นๆ เกี่ยวกับ content analysis อีกที่ไม่ควรมองข้าม และไม่สามารถทดแทนได้ด้วยการวิเคราะห์เพียงความถี่
  3. บริบท: word cloud แบบมาตรฐานไม่ได้เก็บบริบทของข้อความเอาไว้ ทำให้สูญเสียความสามารถในการตอบคำถามว่าข้อความนี้ถูกกล่าวในแง่มุมใด (บวกหรือลบ หรือว่าเกี่ยวข้องกับเรื่องใด) และแน่นอนว่าไม่สามารถแยกความแตกต่างระหว่างคำพ้องรูปได้ (เช่นคำว่า battery, screen แต่ละคำล้วนมีอย่างน้อยสองความหมาย)
  4. หน่วยวิเคราะห์: unit of analysis ของ word cloud คือคำหนึ่งคำ อาจส่งผลให้เกิดความเข้าใจผิดได้ เช่น ถ้า word cloud มีคำว่า software และ convenient ตัวใหญ่ๆ อาจสื่อความหมายว่าคนรู้สึกว่าซอฟท์แวร์นี้ใช้ง่าย แท้ที่จริงเขาอาจจะกล่าวว่า “not convenient” แต่คำว่า not ถูกกรองออกเนื่องจากเป็น stop word หรือในกรณีที่ยากยิ่งขึ้น ในประโยคอาจไม่มีคำว่า not ด้วยซ้ำไป! เช่น “I wish the software could be more convenient.”

อีกมุมหนึ่งของโลก คุณ Jacob Harris ตำแหน่ง senior software architect ของ New York Times กล่าวว่า visualization และการรายงานข่าว ก็คือสิ่งเดียวกัน นั่นคือการนำข้อมูลที่ซับซ้อนมาเรียบเรียงเป็น เรื่องราว (narrative), กำจัดข้อมูลส่วนเกินออกไป, มองหาความผิดพลาดหรือความไม่ปกติในข้อมูล ส่วน ความสวยงาม นั้นเป็นเพียงน้ำจิ้ม ถ้ามีก็ดี แต่ถ้ามันขัดขวางความเข้าใจที่ถูกต้องในเนื้อหา ก็ควรนำมาใช้ [3]

Jacob Harris ยกตัวอย่างข้อมูลข่าวสงครามอิรัก ที่ทดลอง visualize ด้วยเทคนิคสองแบบ แบบแรกคือแบบที่เขาชอบ ซึ่งผูกติดกับความหมายที่แท้จริงของข้อมูลและไม่เกี่ยวข้องกับ word cloud ส่วนแบบที่สองคือการใช้ word cloud เขามีความคิดเห็นที่สรุปได้ดังนี้

  1. นักข่าวมือสมัครเล่น มีแรงจูงใจในการใช้ word cloud เพื่อทำความเข้าใจเรื่องราวที่ตนเองไม่ถนัดจริง โดยอาจไม่ทราบว่าข้อมูลที่ตนกำลังมองนั้นอาจชี้นำไปในทางที่ผิด (misleading)
  2. ข้อมูลความถี่เป็นเพียงมิติพื้นฐานหนึ่งของข้อมูล ไม่มีทางที่จะเพียงพอสำหรับความเข้าใจเนื้อหา เปรียบเสมือนกับการพยายามเข้าใจหน้าที่ของโปรตีนชนิดใหม่โดยการนับกรดอะมิโน
  3. word cloud ไม่สามารถรับมือกับคำคล้ายกันได้ (synnonyms) เช่น เหตุการณ์ car bomb อาจเขียนในข่าวว่าเป็น truck, vehicle หรือ bongo (รถบรรทุกเล็กๆ ยี่ห้อ Kia ซึ่งเป็นที่นิยมในอิรัก)
  4. อะไรคือ เรื่องราว (narrative)? word cloud ไมได้บอกเล่าเรื่องราวอะไรเลย แต่ชี้ชวนให้ผู้อ่านสร้างเรื่องราวเอาเองจาก connection ที่จินตนาการ (มโน) ได้จากคำที่พบเห็น ซึ่งอาจมาจากคนละบริบทกับที่ผู้อ่านคาดเดา ทำให้นำไปสู่ข้อสรุปที่ผิดพลาด

สรุปคือ: word cloud นั้นอาจถูกใช้ในทางที่ผิดได้ง่าย เราควรใช้ word cloud อย่างระมัดระวัง เข้าใจข้อจำกัด และใช้ร่วมกับเครื่องมืออื่นๆ ที่สามารถวิเคราะห์ข้อความในเชิงลึกมากขึ้น


Reflection and Future Work

  1. เก็บบริบท:
    ผมคิดว่าในอนาคต เราควรเตรียมข้อมูลสำหรับ word cloud โดยเก็บบริบทไว้ด้วย กล่าวคือ เราจะไม่เก็บเฉพาะความถี่ของคำ แต่เราจะเก็บข้อมูลไว้ด้วยว่าคำคำนี้ปรากฎที่ตำแหน่งใดในเอกสารฉบับใด ใกล้กับคำอื่นๆ คำใดบ้าง (concept คล้ายกับ inverted files ใน Information Retrieval [8])
  2. co-occurrence analysis
    เราต้อง Go beyond word cloud! ให้ได้ โดยใช้เทคนิคอื่นๆ ร่วมด้วย เช่น เมื่อคลิกที่คำใดคำหนึ่ง user ควรจะมองเห็นข้อมูลเกี่ยวกับคำคำนี้ได้

    1. คำนี้มักเกิดขึ้นใกล้กับคำใด?
    2. คำนี้ถูกใช้บ่อยแค่ไหนในเอกสารอื่น?
    3. คำนี้มีความหมายบวกหรือลบ? อยู่ใกล้กับคำที่มีความหมายบวกหรือลบ?
    4. ถ้ารวมคำนี้เข้ากับคำที่มีความหมายใกล้เคียงกัน จะทำให้ภาพเปลี่ยนไปอย่างไร?
    5. คำนี้เป็นคำกลุ่มไหน? (เช่น การศึกษา, ชื่อเมือง, เทคโนโลยี, โบราณ) แล้วคำอื่นๆ ในกลุ่มเดียวกันล่ะ มีการกระจายตัวอย่างไร?
    6. วลีที่อยู่รายรอบคำนี้ หน้าตาเป็นอย่างไร? โดยแสดงผลในลักษณะ Word Tree [9] เช่น
      screenshot-2016-10-05-12-39-09
  3. 2-word cloud, 3-word cloud, …
    แทนที่จะมองคำแต่ละคำเป็นปัจเจกชน เราอาจมองคำที่อยู่ติดกันสองคำเป็นคำคำเดียวกันก็ได้ (เรียกว่า bi-gram) เราอาจทดลองวัดความถี่ของ bi-gram, tri-gram เพื่อความยืดหยุ่นในการแสดงผล และเพื่อช่วยรักษาบริบท (context) ได้ในระดับหนึ่ง โดย bi-gram นี้อาจมีประโยชน์ทั้งในการสร้าง 2-word coud และการวิเคราะห์แบบอื่นๆ ด้วย

เอกสารอ้างอิง

  1. เนื้องเพลง นายไข่เจียว โดย เฉลียง
    https://www.gotoknow.org/posts/193877
  2. วิธีการสื่อสารกับ process  โดยใช้ function proc_open ของ PHP นั้น ถูกอธิบายไว้อย่างดีโดย Timothy Boronczyk ใน https://www.sitepoint.com/proc-open-communicate-with-the-outside-world/
  3. Word clouds considered harmful by Jacob Harris, a New York Times senior software architect (via FlowingData) (reference copied from Jason Davies)
  4. คำอธิบายเชิงเทคนิคเกี่ยวกับการสร้าง Word Cloud โดย Jason Davies
    https://www.jasondavies.com/wordcloud/about/
  5. IBM Visualization and Behavior Group
    http://researcher.watson.ibm.com/researcher/view_group.php?id=3419
  6. Viegas, Fernanda B., Martin Wattenberg, and Jonathan Feinberg. “Participatory visualization with Wordle.” IEEE transactions on visualization and computer graphics 15.6 (2009): 1137-1144. [PDF from smith.edu]
  7. McNaught, Carmel, and Paul Lam. “Using Wordle as a supplementary research tool.” The qualitative report 15.3 (2010): 630. [PDF from nova.edu]
  8. Dr Dobb’s Journal: Chapter 3: Inverted Files
    http://orion.lcg.ufrj.br/Dr.Dobbs/books/book5/chap03.htm
  9. Google Charts: Word Trees
    https://developers.google.com/chart/interactive/docs/gallery/wordtree