คำนวณเวลาอ่านบทความใน Jekyll โดยการตัดคำแบบไทย

Published on
Tags
ruby python thai nlp

บทความนี้จะกล่าวถึงการคำนวณเวลาที่ใช้ในการอ่านบทความ ซึ่งในส่วนของ Jekyll จะมีปลักอินที่ชื่อ liquid_reading_time ที่ถูกนำมาใช้ในการคำนวณเวลาโดยเฉลี่ยในการอ่านบทความหนึ่งๆ และแสดงให้ผู้อ่านเห็น โดยมีสูตรที่ว่า

จำนวนคำทั้งหมดในบทความ / ความเร็วเฉลี่ยในการอ่าน = ระยะเวลาในการอ่าน

ถ้าดูแล้วการใช้ปลักอินดังกล่าวก็ดูน่าจะตอบโจทย์แล้วใช่หรือไม่ แต่อย่าลืมว่าการนับจำนวนคำระหว่างภาษาไทยกับภาษาอังกฤษนั้นแตกต่างกัน กล่าวคือโดยปกติคำหนึ่งๆ ในภาษาอังกฤษจะถูกแยกจากกันด้วยช่องว่าง (whitespace) ส่วนภาษาไทยนั้นการแยกคำออกมานั้นมีความซับซ้อนกว่ามาก ดังนั้นการใช้ปลักอินที่ตัดคำโดยใช้ช่องว่างจึงไม่ตอบโจทย์

เอ๊ะแล้วอย่างงี้จะใช้ปลักอินตัวไหนมาช่วยในการตัดคำไทยดี ซึ่งต้องบอกเลยว่าถ้าหากใช้ Ruby อย่างเดียวนั้นคงเป็นไปได้ยาก เนื่องจากไลบราลีที่ใช้สำหรับตัดคำไทยไม่มีผู้พัฒนาในภาษา Ruby ทำให้ต้องไปเพิ่งไลบราลี pythainlp ในภาษา Python แทน ซึ่งไลบราลีตัวนี้มีนักพัฒนาคนไทยช่วยกัน และเผยแพร่ให้นักพัฒนาคนอื่นๆ ได้ใช้งานกัน

ฉะนั้นในบทความนี้จะเป็นการรวมร่างกันทำงานระหว่างไลบราลี liquid_reading_time (Ruby) กับ pythainlp (Python) โดย

  • pythailnp นำมาใช้ในการตัดคำภาษาไทยที่มาจากบทความ
  • liquid_reading_time นำมาใช้ในการคำนวณระยะเวลาในการอ่าน

ลงมือปรับแต่งกันเลย

  • เริ่มต้นโดยการ fork ปลักอินมาก่อน โดยเข้าไปที่ liquid_reading_time แล้วก็ clone project มาไว้ยังเครื่องคอมพิวเตอร์ของเรา
  • เข้าไปยังไฟล์ที่ชื่อ lib/liquid_reading_time.rb จากนั้นทำการเพิ่มโค้ดสำหรับเรียกใช้งานโปรแกรม word_tokenizer.py ผ่านฟังก์ชันที่ชื่อ tokenize_words และเปลี่ยนการเรียกใช้ฟังก์ชัน count_words ดังแสดงในโค้ดด้านล่าง
  def count_words(html)
      tokenize_words(words(html).join(' ')) # Add this line
      # words(html).length # Comment this line
    end
  end

  ...
  # Add new method
  def tokenize_words(text)
    cmd = `python word_tokenizer.py "#{text}"`
    cmd.to_i
  end
  • เข้าไปยังโฟลเดอร์เว็บไซด์ของเรา และทำการสร้างไฟล์ word_tokenizer.py ซึ่งเป็นโปรแกรมทีรับฟารามิเตอร์เป็นเนื้อหาของบทความ แล้วจะส่งคืนค่าจำนวนคำที่ตัดได้คืนกลับไป โดยผ่านการแสดงผลทาง stdout
  import sys
  from pythainlp import sent_tokenize, word_tokenize

  if len(sys.argv) > 1:
      content = sys.argv[1]
      sys.stdout.write(str(len(word_tokenize(content, keep_whitespace=False))))
  else:
      sys.stdout.write('0')
  sys.exit(0)
  • ทำการแก้ไข Gemfile ของ liquid_reading_time ให้โหลดจาก repo ของเราที่ได้ fork ออกมาแทน repo หลัก
  • ทดสอบการประเมินเวลาของบทความกัน ซึ่งปรากฏว่าหลังจากเปลี่ยนมาใช้การตัดคำแบบไทยในการประเมินเวลาการอ่านบทความ จะได้ระยะเวลาในการประเมินที่ค่อนข้างใกล้เคียงกับเวลาที่ใช้อ่านจริง

Reading Time ใช้ liquid_reading_time แบบปกติ

Custome Reading Time ใช้ pythainlp ร่วมกับ liquid_reading_time

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

!!! ป.ล. การเรียกใช้งานโปรแกรมสำหรับตัดคำไทยจะทำให้ใช้ระยะเวลาในการแปลงไฟล์ Markdown ไปเป็น HTML นานขึ้นด้วย

References: