ย้ายบล็อกไปที่ bact.cc แล้วนะครับ

พ.ร.บ.คอมพิวเตอร์
หยุด ร่างพ.ร.บ.คอมพิวเตอร์
พื้นที่เก็บข้อมูลออนไลน์ ฟรี 2GB จาก Dropbox (sync กับ Windows, Linux, Mac, iPhone, Android ฯลฯ ได้)
Showing posts with label Unicode. Show all posts
Showing posts with label Unicode. Show all posts

2009-12-07

Web Character Simplification Chart 0.1 #opendream

ก่อนจะประมวลผลข้อความ เราจำเป็นต้องทำความสะอาดข้อความเสียหน่อย ทั่ว ๆ ไปที่จำเป็นต้องทำ ก็เช่น แปลง new line (\r\n หรือ \n), หรือแปลงให้อยู่ในชุดอักขระ (character set) ที่โปรแกรมใน processing pipeline จะทำงานได้ เช่นแปลง ä เป็น ae หรือแปลง “ ” เป็น " ", หรือการ normalize ลำดับอักขระ เช่น น.หนู+สระอำ+ไม้โท → น.หนู+ไม้โท+สระอำ, หรือไปถึงขั้นซับซ้อน อย่างแก้ตัวสะกด

(กรณีเป็นงานลักษณะจดหมายเหตุ หรือ archival ก็อาจจำเป็นต้องเก็บตัว raw text ก่อนแปลงเอาไว้ด้วย เพราะการแปลงอาจจะ(และมักจะ)เป็น lossy คือแปลงไปแล้วแปลงกลับมาได้ไม่เหมือนเดิม เช่นตัวอย่างข้างบน ที่แปลง “ ” เป็น " ")

การทำความสะอาดข้อความ หรือ text cleansing นี้ มีจุดประสงค์หลายอย่าง อย่างหนึ่งก็เพื่อเพิ่มความต้องตรงกัน (integrity) ภายในเนื้อข้อความ ซึ่งกรณีถ้าจะเอาข้อความนี้ไปประมวลผลทางสถิติ เช่นเอาไปฝึกเครื่อง (machine learning) ความต้องตรงกันภายในข้อความนี้ ก็มีผลต่อความแม่นยำของตัวแบบที่จะฝึกได้

จุดประสงค์อีกอย่างของการทำความสะอาดข้อความ ก็เพื่อลดความซับซ้อนของการประมวลผลด้วย ไม่ว่าจะเป็นการลดความซับซ้อนของตัวแบบ หรือการลดความซับซ้อนของเงื่อนไขในโปรแกรม เช่น ทำให้เขียน regular expression ได้สะดวกขึ้น

สำหรับแอปพลิเคชั่นการค้นหาและการทำดัชนี การทำความสะอาดข้อความ รวมไปถึงการทำให้ข้อความมันซับซ้อนน้อยลง (ไม่ว่าจะในทางลำดับอักษร ซึ่งจะมีผลต่อขนาดของ word set หรือการลดขนาดของ character set ด้วยการยุบตัวอักษรบางตัวเข้าด้วยกัน) จะช่วยให้ดัชนีมีขนาดเล็กลงด้วย และถ้าใช้ประกอบกับตารางการแทนอักษร/คำ (replacement table) ก็จะช่วยให้โอกาสการเจอคำที่ค้นหา มีมากขึ้น เนื่องจากลดผลกระทบจากการสะกดไม่ตรงกัน (spelling variations) (จริง ๆ จะใช้ replacement table อย่างเดียวก็ได้ แต่กรณีนั้น search space ก็จะใหญ่ขึ้น มีผลต่อประสิทธิภาพ)

ในตอนที่เขียน JavaScript สำหรับใช้กับ Roti ก็คิดไว้าว่าจะเจอปัญหาลักษณะนี้ ซึ่งจะมีผลต่อการคำนวณหาบล็อกโพสต์ที่ใกล้เคียง (ดูตัวอย่างได้ที่ท้ายโพสต์นี้ ตรงที่เขียนว่า 'roti thinks you may like these posts...') เลยให้จาวาสคริปต์ทำความสะอาดข้อความนิดหน่อย ก่อนจะส่งไปเซิร์ฟเวอร์

เนื่องจาก Roti ทำงานกับเอกสารเว็บ ซึ่งมี 'ปัญหา' อีกอย่าง คือการใช้ HTML/XML entities แทนตัวอักษร เช่นใช้ & เพื่อแทนอักษร & ดังนั้นก่อนจะทำอะไรกับข้อความ จึงควร decode entities พวกนี้ออกมาก่อน

กรณีของ HTML entities ถ้าใช้ PHP สามารถใช้ฟังก์ชั่น html_entity_decode($text) ได้เลย แต่ในจาวาสคริปต์มันไม่มี (หรือผมไม่รู้ว่ามันมี) ก็เลยใช้แทนที่สตริงแบบบ้าน ๆ ไป

ตารางข้างล่างปรับแก้มาจากตัวจาวาสคริปต์ roticlient.js และใส่รายละเอียดเพิ่มเติมนิดหน่อย ยินดีรับคำแนะนำครับ

possible replacements ในตารางนั้น เป็นเพียงคำแนะนำตั้งต้น การจะเลือกใช้อะไร ขึ้นอยู่กับแอปพลิเคชั่นด้วย เช่น ตัวเลือกที่เหมาะกับการเอาไปทำดัชนี ก็อาจจะไม่เหมือนกับตัวเลือกที่เหมาะกับการเอาไปแสดงผล เช่น zero-width space ถ้าทำดัชนี การแทนด้วย space น่าจะเหมาะ แต่ถ้าจะเอาไปแสดงผล การลบมันทิ้งไปเลย น่าจะเหมาะกว่า

Web Character Simplification Chart 0.1

Throw away extra semantics for a simpler text processing. This is only a suggestion. Apply to your needs accordingly.

Character NameCharacterUnicodeASCII range?HTML EntitiesPossible Replacements
Space  yes  
Non-breaking space U+00A0yes (space)
Zerowidth space U+200B  (space), <delete>
 
Soft hyphen U+00ADyes&shy;<delete>
 
Hyphen-Minus-U+002Dyes  
Hyphen-U+2010  - (hyphen-minus)
Minus sign−U+2212 &minus;-
Figure dash‒U+2012  -
En dash–U+2013 &ndash;-, --
Em dash—U+2014 &mdash;-, ---
Horizontal bar―U+2015  -
Armenian hyphen֊U+058A  -
Hebrew magaf־U+05BE  -
Mongolian todo hyphen᠆U+1806  -
Japanese chōonpuーU+30FC  -
 
Hyphen bullet⁃U+2043  * (star), -, <delete>
Small bullet•U+2022  *, -, <delete>
 
Tilde~U+007Eyes&tilde; 
Swung dash˜U+2053  ~ (tilde)
Wave dash〜U+301C  ~
Wavy dash〰U+3030  ~

ด้านล่างนี้ เป็นตัวอย่างโค้ดที่แทนที่ตัวอักษรต่าง ๆ จาก roticlient.js

return str.replace(/(&nbsp;|&#8208;|&#8210;|&ndash;|&#8211;|&mdash;|&#8212;|&#8213;|&#8275)/g, ' ') .replace(/(&shy;|&#xAD;|&#173;|&#x200B;|&#8203)/g,'') .replace(/[\u200b\u200d\u00ad]/g, '') .replace(/[!\?;:"'`“”^\*\+\-_\(\)\[\]\{\}#@&~\.,\\\/\|]/g, ' ') .replace(/\s+/g, ' ');

ติดตามการพัฒนา Roti ได้จาก Opendream's blog

(โพสต์นี้ให้ @pittaya เนื่องจากเคยถามเอาไว้เมื่อนานเมือกแล้ว)

technorati tags: , ,

2009-04-22

encode("UTF-8", "ignore") ข้าม ๆ เรื่องที่ทำไม่ได้ใน Python

หลังจากเอา python-libthai ของวีร์มาใช้กับข้อมูลที่ได้มาจากเว็บ ก็พบปัญหาเรื่อง character encoding นิดหน่อย

libthai นั้นปัจจุบันทำงานกับข้อมูลที่เป็นภาษาไทย 8 บิตอยู่ (น่าจะเป็น TIS-620) ตัว python-libthai เลยมีขั้นตอนการแปลงจากยูนิโค้ดไปเป็น 8 บิตก่อน ทีนี้ ปรากฏว่า encoder "CP874", "TIS_620" และ "ISO8859_11" ของ Python มันดันแปลงตัวอักษรบางตัวไม่ได้ (เนื่องจากใน charset พวกนั้น มันไม่มีตัวอักษรดังกล่าว) โปรแกรมก็เลยจะตาย ถ้าไปเจออักษรพวกนั้น

ก่อนตายมันจะโวยทำนองว่า :

UnicodeEncodeError: 'charmap' codec can't encode character
u'\u200b' in position 3560: character maps to <undefined>

วิธีแก้แบบถึก ๆ คือ เอาหูไปนาเอาตาไปไร่ซะ ignore มัน ด้วยการไปแก้ แฟ้มชื่อ libthai.c ของ python-libthai (แฟ้มนี้เป็น wrapper ที่ไปเรียก libthai ให้)

หาบรรทัดที่เรียกฟังก์ชั่น PyUnicode_Encode/Decode แล้วแก้พารามิเตอร์ตัวที่สี่เป็น "ignore" ซะ

เช่น จาก


PyObject *txt_cp874 =
    PyUnicode_Encode(s1, s1_len, "CP874", NULL);
tok =
    PyUnicode_Decode(buffer, tok_len, "CP874", NULL);

เป็น


PyObject *txt_cp874 =
    PyUnicode_Encode(s1, s1_len, "CP874", "ignore");
tok =
    PyUnicode_Decode(buffer, tok_len, "CP874", "ignore");

แล้ว sudo python setup.py install ใหม่อีกรอบ (อย่าลืมล้าง build เก่าทิ้งก่อน) ก็น่าจะใช้ได้แล้วครับ

ลิงก์ : Python Unicode How-to

technorati tags: , ,

2007-12-27

Time for Unicode ?

เราควรจะเปลี่ยนไปใช้รหัสข้อมูลอะไรดี ? สำหรับเอกสารภาษาไทยในโลกยุคอินเทอร์เน็ต

จะ Windows-874, TIS-620 หรือ ISO-8859-11 ก็คงไม่เพียงพอแล้ว สำหรับโลกยุคอินเทอร์เน็ตและสังคมพหุภาษา แม้แต่เอกสาร “ภาษาไทย” ในปัจจุบันก็ยังมีตัวอักษรละตินหรือสัญลักษณ์พิเศษต่าง ๆ แทรกอยู่มากมาย ซึ่งบางตัวก็ไม่ได้มีอยู่ทั้งใน Windows-874, TIS-620 และ ISO-8850-11

ได้เวลาเปลี่ยนมาใช้ Unicode ให้หมดรึยังนะ ?
(สำหรับงานส่วนใหญ่ ที่ขนาดพื้นที่จัดเก็บข้อมูล/แบนด์วิธ ไม่ได้เป็นข้อจำกัดสำคัญอีกต่อไปแล้ว)

ทั้งหน้าเว็บ ไฟล์เอกสาร metadata โค้ดโปรแกรมต่าง ๆ

แต่จะใช้อะไรดี UTF-8 หรือ UTF-16 ?

Windows NT ขึ้นไป, Windows CE, Java, .NET, Mac OS X และ Qt แพลตฟอร์มเหล่านี้ ใช้ UTF-16 เป็น native character set
แต่ถ้าเป็นโลก Unix และอินเทอร์เน็ต UTF-8 ก็แพร่หลายกว่า

ถ้าพูดถึงเฉพาะที่เกี่ยวข้องกับอินเทอร์เน็ต ไปใช้ UTF-8 กันให้หมดเลยดีมั๊ย ? สำหรับข้อมูลภาษาไทย ทั้งหน้าเว็บ ฐานข้อมูล metadata ฯลฯ

ข้อดี-ข้อเสีย ? อะไรคืออุปสรรค ?

technorati tags: , ,

2007-10-19

Unicode CLDR 1.5 Released

สมาคมยูนิโคดออก CLDR รุ่น 1.5 แล้ว (เมื่อสามเดือนที่แล้ว - วันที่ 31 ก.ค. 2550)

CLDR (Common Locale Data Repository) เป็นฐานข้อมูลข้อมูลท้องถิ่น (locale data) สำหรับนำไปดัดแปลงซอฟต์แวร์ให้ทำงานได้เข้ากับแต่ละภาษาและท้องถิ่น ตัวอย่างข้อมูลที่ CLDR มีให้ เช่น รูปแบบวันที่ เวลา เขตเวลา ตัวเลข ค่าเงิน การเรียงลำดับข้อความ ฯลฯ

CLDR 1.5 มีข้อมูลสำหรับ 135 ภาษาและ 149 พื้นที่ หรือนับเป็นทั้งหมด 394 ชุดข้อมูลท้องถิ่น และมีข้อมูลมากกว่ารุ่นที่แล้วถึง 42% โดยข้อมูลทั้งหมดมาจากผู้ร่วมโครงการกว่า 160 ราย โดยรายหลักมี Adobe, Apple, Google, IBM, Sun และตัวแทนจากหลายประเทศ ซึ่งรวมถึงอาสาสมัครทั่วโลกด้วย (สำหรับประเทศไทย มีพี่สัมพันธ์ ระรื่นรมย์ เจ้าเก่า, คุณณิชชา กำโชคภัทรพร, และคุณสุวิทย์ ศรีวิไลฤทธิ์ เข้าร่วม — เห็นพี่สัมพันธ์เคยมาถาม ๆ ในอีเมลกลุ่มของ LTN/Thai Linux Working Group อยู่บ้าง)

CLDR เดิมเป็นโครงการของ OpenI18N โดยมีสมาชิกก่อตั้งคือ IBM, Sun และ OpenOffice.org ก่อนที่ยูนิโคดจะรับเข้าเป็นโครงการในความดูแล (ตั้งแต่ CLDR 1.1)

ตัวอย่างแพลตฟอร์มที่รองรับ CLDR เช่น .NET Framework และ Java platform ส่วนโปรแกรมที่นำไปใช่ ก็เช่น OpenOffice.org (แน่นอน)

ดูข้อมูลเพิ่มเติมได้ที่ http://unicode.org/cldr/ และ Wikipedia

technorati tags: , ,

2007-03-01

Encodings/Charsets in Java

Encoding, Canadian Mind Products's Java Glossary
a very detailed resources on encoding/charset-related stuffs in Java ละเอียดมาก

List of supported encodings, how to convert them, guide to Readers, other classes/methods, etc.

Plus, Unicode in Java by Jason Orendorff

(เมื่อคืนทดลองใช้ iBATIS (ORM ตัวนึง) กับภาษาไทยใน MySQL ไม่เวิร์กแฮะ ฟิลด์ไหนที่เป็นภาษาไทย get ออกมาแล้วกลายเป็น null หมดเลย)

technorati tags: , ,

2005-12-21

Unicode characters in details

Unicode @ FileFormat.info

name, info, browser test page, outline (SVG), fonts that support, encoding, how to type it in Windows, Java and .NET properties

2005-03-31

Unicode, XML, TEI, Ω and Scholarly Documents

โดย Yannis HARALAMBOUS เสนอที่ 16th International Unicode Conference, Amsterdam, 2000

สองตัวแรกส่วนใหญ่คงเคยได้ยินกันมาบ้างแล้ว อยากรู้รายละเอียด ลองอ่าน Unicode, XML

TEI คือ Text Encoding Initiative เป็นคล้ายๆ "ข้อแนะนำ" สำหรับการจัดเก็บข้อมูลในคอมพิวเตอร์ ก่อนหน้านี้ใช้ SGML ตอนนี้เริ่มค่อยๆ ปรับเปลี่ยนมาใช้ XML ละ

หมายเหตุ: SGML, XML เป็นเพียงแค่ markup language หรือพูดอีกอย่างคือ เป็นเพียงแค่เครื่องมือในการเข้ารหัสเท่านั้น แต่ไม่ได้บอกว่า จะเข้ารหัสยังไง ตัวอย่างเช่น สมมติมี โคลงสี่สุภาพอยู่บทนึง จะเก็บยังไง เก็บทั้งบทรวมกันเป็นก้อนเดียวโดยใส่เครื่องหมายแบ่งบรรทัดลงไปด้วย หรือว่าแยกเป็นสี่ส่วน แต่ละส่วนมีโครงสร้างเหมือนกัน แล้วให้แต่ละส่วนเก็บแต่ละบาท (โคลงสี่สุภาพ 1 บท มี 4 บาท) แล้วจากนั้นค่อยใส่สี่บาทนี้เข้าไปในตัวบทอีกที แล้วเอาตัวบทไปใส่ในตัวโคลงอีกที ฯลฯ อะไรพวกนี้ นี่คือสิ่งที่ TEI ทำ
แล้วเอาไปใช้ทำอะไรอ่ะ? – ดู The Oxford Text Archive ได้ เค้าเก็บเอกสารต่างๆ หลายประเภท เอาไว้ในรูปแบบอิเล็กทรอนิกส์

ส่วน Ω (เพิ่งเคยเห็นวันนี้) คือส่วนขยายของ TeX เพื่อรองรับ Unicode (ไม่ใช่ จมูกหมีอันใหญ่ แต่อย่างใด)

ได้ลิงก์ของบทความนี้มาจากบล็อกพี่พูลลาภ ขอบคุณมากครับ :)
พอดีกำลังดูเรื่อง TEI กะ Unicode อยู่ อันนี้ใช้ได้เลย มีพูดถึงประเด็นที่น่าสนใจและน่าจะเอามาใช้ได้ด้วย thanx thanx :D

2005-03-09

Character encoding issues

A tutorial on character code issues - covers many issues in character encoding

Germanic Lexicon Project:

Multiple Representations - normalization, canonical decompositions, compatibility decompositions, etc.

Linguistic Sorting - how characters are sorted in an Oracle environment

Unicode in MySQL - with PHP examples

Character Encoding and the Web - with Thai example: "เอกชัย ศรีวิชัย"สุดทน เจอเทปผี ซี.ดี.เถื่อนแย่งตลาด สั่งลูกน้องไล่กระทืบพ่อค้าขายซี.ดี.เถื่อน พร้อมประกาศลั่น ฝากบอกเอเย่นต์ใหญ่ว่า "เอกชัย สั่งให้ทำ" !

Unicode for Programmers (draft)

Short tutorials by Jason Orendorff.

With many clear examples of how to work with Unicode in Java and Python.
I like this illustration.

last updated: 1 March 2002, but things that they had referred to haven't changed much since then.

2005-02-19

Common Locale Data Repository

Common Locale Data Repository (CLDR) จัดทำโดยองค์กร Unicode เป็นฐานข้อมูล locale data กลาง ให้โปรแกรมอื่นๆ นำไปใช้ต่อ เพื่อให้แต่ละโปรแกรม มี locale data ที่ถูกต้องตรงกัน ใช้งานร่วมกันได้ และไม่สับสน

อ้างอิง L10n.opentle.org

เพิ่มเติม: พี่เทพ ตอบคำถาม เรื่องข้อมูลที่ OOo กับ CLDR ไม่ตรงกัน และบางแห่งน่าจะผิด

เพิ่มเติม 2: พี่สัมพันธ์ ให้ความเห็น และ อธิบายลักษณะข้อมูล ว่าจะเข้าไปดูได้ยังไง และให้ช่วยกันดู+แก้ไขหน่อย :)

Thai locale data in CLDR
มีข้อมูลจากหลายแหล่ง ทั้งข้อมูลกลาง (Common), Windows, Sun JDK, IBM JDK, OpenOffice.org, AIX, และ Linux (ไม่มี Solaris? .. เอ แปลก)
ถ้าเกิดว่า ทุกๆ อันถูกต้อง และตรงกันหมด อันนั้นคือ เยี่ยม

2005-02-09

ThaiWrap รุ่น 5

(บล็อกเก่า ThaiWrap bookmarklet, Auto thaiWrap())

รายการเปลี่ยนแปลง:

  • ตัวแบ่งคำ เปลี่ยนจาก <WBR> มาใช้ zero-width space (U+200B) แทน เนื่องจาก Opera ไม่รู้จัก <WBR>
  • เพิ่มการตรวจเบราเซอร์ เพื่อข้ามการทำงานทั้งหมด ถ้าใช้ Internet Explorer (เหตุผล: 1. จะได้ไม่เสียเวลา เพราะ IE ตัดคำได้อยู่แล้ว 2. IE แสดงผล zero-width space ไม่ได้)

ตอนนี้ยังเหลือปัญหา เรื่องไม่ทำงานกับเฟรมที่ซ้อนเฟรม ไล่ DOM reference ตะกี้นี้ เจอละว่ามันผิดตรงไหน (เราไปใช้ window.frames ซึ่งมันจะส่งค่ากลับเฉพาะ frames ระดับบนสุดเท่านั้น, คาดว่า. นอกจากนั้น มันยังไม่อยู่ใน spec ด้วย - อันตราย) แต่ยังไม่รู้จะแก้ไง ขอค้นก่อน

ThaiWrap bookmarklet/JavaScript, Release 5