debian: ติดตั้ง PyICU

บันทึกติดตั้ง PyICU บนเดเบียน Etch ใช้ Python รุ่น 2.4

จะลองเอามาทำตัวตัดคำไทย เพื่อจัดเก็บคำในฐานข้อมูล
ครั้งแรกที่ทดลอง ได้นำเอาไบนารีมาติดตั้ง แต่รันไม่ได้เพราะเกิดข้อผิดพลาดเกี่ยวกับยูนิโค๊ด จึงต้องเอาซอร์สมาคอมไพล์เอง

ติดตั้งแพกเกจที่จำเป็น
# aptitude install python2.4-dev libicu36 libicu36-dev

ดาวน์โหลดซอร์ส และแตกไฟล์
# cd /usr/src
# wget http://downloads.osafoundation.org/PyICU/src/PyICU-src-0.6.tar.gz
# tar xfz PyICU-src-0.6.tar.gz
# cd PyICU-src-0.6

ต้องแก้ไข Makefile นิดนึง ตามคู่มือ
# vi Makefile

...
#PYTHON_VER=2.5
PYTHON_VER=2.4
...
# Linux
#PREFIX=/usr/local
#PREFIX_PYTHON=$(PREFIX)
#PREFIX_ICU=$(PREFIX)/icu-$(ICU_VER)
#PYTHON=$(PREFIX_PYTHON)/bin/python

PREFIX=/usr
PREFIX_PYTHON=$(PREFIX)
PREFIX_ICU=$(PREFIX)
PYTHON=$(PREFIX_PYTHON)/bin/python
...

คอมไพล์และติดตั้ง
# make && make install

เสร็จแล้ว
ทดสอบด้วย
# python

Python 2.4.4 (#2, Jan 13 2007, 17:50:26) 
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import PyICU
>>>

ไม่มีข้อผิดพลาด แสดงว่าใช้ได้แล้ว

update
บันทึกอีกรุ่นนึง 51-02-28
debian-etch, python-2.4.4, libicu36, gcc/g++-4.1
ติดตั้งโดย root

ดาวน์โหลดซอร์สที่ PyICU-0.8.1.tar.gz
# cd /usr/src
# wget http://pypi.python.org/packages/source/P/PyICU/PyICU-0.8.1.tar.gz#md5=789092993f84ccd6ba21d7346d6e093d
# tar xfz PyICU-0.8.1.tar.gz
# cd PyICU-0.8.1

เอาแพกเกจของ dev มาก่อน
# aptitude install build-essential python-dev python-setuptools libicu36-dev

ดูจาก README แล้วคอมไพล์เลย
# python setup.py build
# python setup.py install

ถ้าไม่แสดงข้อผิดพลาด ก็ใช้ได้แล้ว

Topic: 

python: ตัวอย่างการใช้งาน PyICU

ดัดแปลงโค๊ดมาจาก programming is hard: isThai and ThaiWarp function

import PyICU

def isThai(chr):
    cVal = ord(chr)
    if(cVal >= 3584 and cVal <= 3711):
        return True

    return False

def wrap(txt):
  txt = PyICU.UnicodeString(txt)
  bd = PyICU.BreakIterator.createWordInstance(PyICU.Locale("th"))
  bd.setText(txt)   
  lastPos = bd.first()
  retTxt = PyICU.UnicodeString("")
  txt_list = []
  try:
    while(1):
      currentPos = bd.next()
      retTxt += txt[lastPos:currentPos]
      #
      txt_list.append(txt[lastPos:currentPos])
      #Only thai language evaluated
      if(isThai(txt[currentPos-1])):
        if(currentPos < len(txt)):
          if(isThai(txt[currentPos])):
            #This is dummy word seperator   
            #retTxt += PyICU.UnicodeString("|||")
            #
            pass
      lastPos = currentPos
  except StopIteration:
    pass
    #retTxt = retTxt[:-1]
  #return retTxt
  return [unicode(i) for i in txt_list]


def fullwrap(txt):
    txt_list = txt.split(' ')
    new_list = []
    for i in txt_list:
        #new_list.extend(wrap(i).split('|||'))
        new_list.extend(wrap(i))
        
    return new_list

ลองตัดคำดู
$ python

Python 2.4.4 (#2, Jan 13 2007, 17:50:26) 
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> word = 'ทดลองเรียน Python ภาษาโปรแกรมคอมพิวเตอร์'

>>> print wrap(word)
ทดลอง|||เรียน Python ภาษา|||โปรแกรม|||คอมพิวเตอร์

>>> print fullwrap(word)
[u'\u0e17\u0e14\u0e25\u0e2d\u0e07', u'\u0e40\u0e23\u0e35\u0e22\u0e19', u'Python', u'\u0e20\u0e32\u0e29\u0e32', u'\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21', u'\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c']

>>> for i in fullwrap(word): print i
... 
ทดลอง
เรียน
Python
ภาษา
โปรแกรม
คอมพิวเตอร์

>>> 
Topic: