Sugree

Main menu

  • About
    • Self
  • Project
    • Barcode Generator / Reader
    • GT200
    • GeoPin
    • Mitter
    • Red Mob
    • Thairath Breaking News
    • Twitter Android SDK
    • jibjib
    • microblog-purple
    • English
    • Thai

One step closer to Thai search in Drupal

Submitted by sugree on Tue, 11/18/2008 - 23:44
  • Drupal
  • OpenSource
  • Thai

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

แต่ที่ว่ามาทั้งหมดยังไม่เลวร้ายเท่ากับปัญหาที่พึ่งสังเกตวันนี้ พึ่งรายงานปัญหานี้ไปที่ drupal.org ได้หมายเลข #335928 ใจความก็คือ แม้ว่าเราจะตัดคำด้วย hook_search_preprocess() แล้วก็ตาม Drupal จะไม่นำคำเหล่านั้นไปเก็บลงอินเด็กซ์เพราะดันเผลอตัด สระ วรรณยุกต์ ทิ้งเกือบหมด ทั้งนี้ Drupal อ้างอิงข้อมูลตัวอักษรจาก UnicodeData.txt ซึ่งระบุชนิดสระส่วนใหญ่เป็น Mn หรือ Mark, Nonspacing ซึ่ง Drupal สมมติว่าเป็นสัญลักษณ์ ตัดทิ้งได้ สามารถใช้ตัดคำได้ ลองดูโค้ดด้านล่าง

function search_simplify($text) {
  $text = decode_entities($text);
  $text = drupal_strtolower($text);
  search_invoke_preprocess($text);
 
  if (variable_get('overlap_cjk', TRUE)) {
    $text = preg_replace_callback('/['. PREG_CLASS_CJK .']+/u', 'search_expand_cjk', $text);
  }
 
  $text = preg_replace('/(['. PREG_CLASS_NUMBERS .']+)['. PREG_CLASS_PUNCTUATION .']+(?=['. PREG_CLASS_NUMBERS .'])/u', '\1', $text);
  $text = preg_replace('/[._-]+/', '', $text);
  $text = preg_replace('/['. PREG_CLASS_SEARCH_EXCLUDE .']+/u', ' ', $text);
 
  return $text;
}

ตัวปัญหาอยู่ที่ PREG_CLASS_SEARCH_EXCLUDE นี่เอง

ก้าวแรกของการทำให้ Drupal ค้นหาภาษาไทยได้อย่างสมบูรณ์ก็คือแก้ปัญหานี้ก่อน ใครมีความเห็นเพิ่มเติมส่งไปที่ [#335928][] ได้ ผมไม่ค่อยเชี่ยวชาญภาษาไทยเท่าไหร่ อาจมีหลงลืมพลาดหูพลาดตา ยังไงก็ฝากดูกันหน่อยนะครับ จะได้ไม่ต้องแก้บ่อย

ถ้าสังเกตโค้ดจะเห็นว่ามี CJK โดยเฉพาะ เราคงต้องขยันมากขึ้น ถ้าจำเป็นต้องมีโค้ดภาษาไทยโดยเฉพาะ ตอนนี้ยังไม่จำเป็น

Roti (alpha) thinks you may like these:
  • The One
  • one X, one vote
  • One Tambon One Photo
  • One Tambon One ...
  • NO ONE AT THE SEA
  • Login to post comments
by gibbo (not verified) on Wed, 11/19/2008 - 03:07 #655

ผมไม่เข้าใจเรื่องโค้ดหรอกนะครับ รู้แต่ว่ามันยาก เพราะเวลาเขียนภาษาไทย ไม่ต้องมีช่องว่างระหว่างคำ (spaceless scripts) เคยอ่านเอกสารจาก unifont.org เขาก็บอกเหมือนที่คุณสุกรีว่าไว้ คือ ต้องมี dictionary ช่วยในซอฟต์แวร์ (หน้า 96) ส่วนภาษาลาว พม่า เขมร ก็ก็ชะตากรรมเดียวกับไทย (และอาจจะแย่กว่า)

  • Login to post comments
by Buppha (not verified) on Sat, 11/29/2008 - 00:45 #665

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

ขอบ คุณ ค่ะ

  • Login to post comments
by Wadda (not verified) on Sun, 11/30/2008 - 01:10 #666

จริงๆแบบนี้ก็ดีนะ ตัดคำให้เองเลย แต่คนพิมพ์จะสับสนระหว่างอันไหนคือ space จริงๆ กับ space ตัดคำน่ะสิ

ไม่ เจอ กัน นาน นม โต ขึ้น จัง

จะ ไป กิน ข้าว กับ ขี้ พร้อม กัน เลย

อีกอย่าง ถ้าผมจะเขียนบทความซัก 10 pages คงเคาะ space กันมือหงิก (แซวขำๆนะครับ ^^)

  • Login to post comments
by sugree on Sun, 11/30/2008 - 07:12 #668

การตัดคำนี้ไม่มีผลกับการแสดงผลครับ ตัดเพื่อให้ทำ search index ได้เท่านั้น

  • Login to post comments

Popular Tags

Android BarCamp BarCampBangkok Book Django Drupal Education Family Google Hardware Hardy Health Interview Intrepid Java jibjib Joke Life microblog-purple OpenOffice.org OpenSource Podcast Python Review SoC Social Network Trip Twitter Ubuntu Weekly Suki
more tags

Powered By

debian
apache
drupal
drupal.in.th
openfreehost
inox
feedburner

© 2007-2008 Sugree Phatanapherom. Creative Commons [Feed Content / Comment]
RoopleTheme