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

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

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

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

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

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

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

  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
  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)

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

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

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

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

References: