Skip to content

ตัดคำไทยในภาษา Python

สวัสดีผู้อ่านทุกท่านครับ บทความนี้จะพาผู้อ่านไปตัดคำไทยในภาษา Python กันครับ ในการตัดคำนั้นมีไลบรารีมากมายในภาษา Python แต่ที่สามารถตัดไทยได้นั้นมีแค่ไม่กี่ไลบรารี

PyICU

PyICU เป็น api สำหรับใช้เชื่อมต่อเข้ากับ ICU C++ API ของ IBM ทำงานเกี่ยวกับ localization & internationalization และรองรับภาษาไทยด้วยครับ รองรับทั้ง Python 2 , Python 3 และ License :: OSI Approved

สามารถโหลดไฟล์บีบอัดมาติดตั้งได้จาก https://pypi.python.org/pypi/PyICU/ แตกไฟล์แล้วใช้คำสั่ง

python setup.py build
python setup.py install

สำหรับผู้อ่านที่ใช้ Windows สามารถโหลดไฟล์ .whl มาติดตั้งได้จาก http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyicu

หรือติดตั้งโดยใช้คำสั่ง pip

pip install pyicu

ผมนำโค้ดเก่าจาก http://programmingishard.com/code/211 โดยท่าน Chad Humphries ได้เขียนโค้ดตัดคำไทยด้วย PyICU ไว้เมื่อปี ค.ศ.2007 ปัจจุบันหน้าเว็บเข้าไม่ได้แล้ว ผมเข้าผ่าน https://web.archive.org/web/20081012212943/http://programmingishard.com/code/211 ครับ

ขอขอบคุณท่าน Chad Humphries  มา ณ ที่นี้ ที่ได้เขียนไว้มีประโยชน์ต่อการเขียนโปรแกรม Python ครับ
โค้ดตัดคำไทย Python 2

เดดิดท่าน Chad Humphries

import PyICU

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

def warp(txt):
    #print txt
    bd = PyICU.BreakIterator.createWordInstance(PyICU.Locale("th"))
    bd.setText(txt)
    lastPos = bd.first()
    retTxt = ""
    try:
        while(1):
            currentPos = bd.next()
            retTxt += 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 += "|"
            lastPos = currentPos
    except StopIteration:
        pass
        #retTxt = retTxt[:-1]
    return retTxt

ตัวโค้ดเป็นโค้ดของ Python 2 ผมนำมา Port เป็น Python 3 ได้โค้ดดังนี้ครับ

โค้ดตัดคำไทย Python 3

import PyICU

def isThai(chr):
    cVal = ord(chr)
    if(cVal >= 3584 and cVal <= 3711):
        return True
    return False
def warp(txt):
    #print(txt)
    bd = PyICU.BreakIterator.createWordInstance(PyICU.Locale("th"))
    bd.setText(txt)
    lastPos = bd.first()
    retTxt = ""
    try:
        while(1):
            currentPos = next(bd)
            retTxt += txt[lastPos:currentPos]
            #เฉพาะภาษาไทยเท่านั้น
            if(isThai(txt[currentPos-1])):
                if(currentPos < len(txt)):
                    if(isThai(txt[currentPos])):
                        #คั่นคำที่แบ่ง
                        retTxt += "|"
            lastPos = currentPos
    except StopIteration:
        pass
        #retTxt = retTxt[:-1]
    return retTxt

เวลาเรียกใช้งาน

>>> word = 'ทดลองระบบตัดคำไทย'
>>> print(warp(word))
ทดลอง|ระบบ|ตัด|คำ|ไทย

pythai

เป็นไลบรารีสำหรับใช้ตัดคำไทย โดยเรียกใช้ไลบรารี libthai เป็นไลบรารีที่อยู่ในระบบปฎิบัติการลินุกซ์เท่านั้นครับ รองรับแค่ Python 2 และใช้ License: GNU

สามารถติดตั้งไลบรารี libthai ใน Debian / Ubuntu ได้ด้วยคำสั่ง

sudo apt-get install libthai-dev

สามารถโหลดโค้ดมาติดตั้งได้จาก https://pypi.python.org/pypi/pythai

หรือจะติดตั้งด้วยคำสั่ง pip :

pip install pythai

ตัวอย่างการใช้งาน pythai ตัดคำไทยในภาษา Python

>>> import pythai
>>> pythai.split(u"การที่ได้ต้องแสดงว่างานดี")
u"การ ที่ ได้ ต้อง แสดง ว่า งาน ดี"

>>> pythai.word_count(u"การที่ได้ต้องแสดงว่างานดี")
8

>>> pythai.contains_thai(u"hello")
False

>>> pythai.contains_thai(u"helloการที่ไ")
True

libthai

เป็นไลบรารีอีกอันที่นำความสามารถของไลบรารี libthai มาใช้ในการตัดคำไทย รองรับเฉพาะ Python 2 และเฉพาะในระบบปฏิบัติการลินุกซ์ครับ และเป็น GNU GPL v3

โหลดโค้ดมาติดตั้งได้จาก https://basaasa.googlecode.com/files/python-libthai-20090310.tar.gz
ตัวอย่างการใช้งาน

import libthai
print libthai.th_brk(u"การที่ได้ต้องแสดงว่างานดี")

ขอให้สนุกกับการเขียนโปรแกรมครับ
ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

7 thoughts on “ตัดคำไทยในภาษา Python

    1. Banatus

      ผมติดตั้ง PyICU ตาม Blog ดังกล่าว
      และทดสอบใช้ Pyhton3 ( จริงๆของผม 3.4)
      มันเกิด error
      bd = PyICU.BreakIterator.createWordInstance(PyICU.Locale("th"))
      AttributeError: 'module' object has no attribute 'BreakIterator'
      จะแก้ไขอย่างไรดีครับ
      ขอบคุณครับ
      อิ๋ว

      Reply
      1. wannaphong

        ลองตรวจสอบการ import ครับ

        import PyICU

        หรือลองติดตั้งใหม่โดยใช้คำสั่ง

        pip install -U pyicu

        ครับ

        Reply
  1. ิBanatus

    ขอบคุณครับ แต่ผมลองติดตั้ง C:\python34\scripts\ pip install -U pyicu ใหม่
    เกิด error ใน pip.log ดังนี้ ผมควรแก้ไขอย่างไรดีครับ
    ------------------------------------------------------------
    C:\Python34\Scripts\pip run on 08/15/15 16:41:08
    Downloading/unpacking pyicu
    Getting page https://pypi.python.org/simple/pyicu/
    URLs to search for versions for pyicu:
    * https://pypi.python.org/simple/pyicu/
    Analyzing links from page https://pypi.python.org/simple/pyicu/
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-0.8.1.tar.gz#md5=789092993f84ccd6ba21d7346d6e093d (from https://pypi.python.org/simple/pyicu/), version: 0.8.1
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-0.8.tar.gz#md5=5126139304321839282334c5dc68a3d9 (from https://pypi.python.org/simple/pyicu/), version: 0.8
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-0.9.tar.gz#md5=944e697f5f9554a68f92619c0a3f69e2 (from https://pypi.python.org/simple/pyicu/), version: 0.9
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-1.0.1.tar.gz#md5=416e45c62c020d13b311cf9cc2b6d452 (from https://pypi.python.org/simple/pyicu/), version: 1.0.1
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-1.0.tar.gz#md5=138d257dd11e1c438d8d7b7fec9a2bdf (from https://pypi.python.org/simple/pyicu/), version: 1.0
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-1.1.tar.gz#md5=70cbb5b43c3e6939b74c3f1b27e47aae (from https://pypi.python.org/simple/pyicu/), version: 1.1
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-1.2.tar.gz#md5=d2d20ab5b233f1d6d2d7e69ba8b5f959 (from https://pypi.python.org/simple/pyicu/), version: 1.2
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-1.3.tar.gz#md5=c1d1b8ec79d0f6c670a8f093792c180f (from https://pypi.python.org/simple/pyicu/), version: 1.3
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-1.4.tar.gz#md5=2334712412aeb90555d1d0a3a39a9bbc (from https://pypi.python.org/simple/pyicu/), version: 1.4
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-1.5.tar.gz#md5=099a3e6e3b8c2b9ab3bf6dde911db624 (from https://pypi.python.org/simple/pyicu/), version: 1.5
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-1.6.tar.gz#md5=5e080392a01820a5e99add20ac9a3e40 (from https://pypi.python.org/simple/pyicu/), version: 1.6
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-1.7.tar.gz#md5=f247fcaccdf601121a2eb81b391ba939 (from https://pypi.python.org/simple/pyicu/), version: 1.7
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-1.8.tar.gz#md5=00c8d40e5400f52c8474aa9480e8dbc1 (from https://pypi.python.org/simple/pyicu/), version: 1.8
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-1.9.1.tar.gz#md5=b01c0aded1427cd89b8e7c016a7e463e (from https://pypi.python.org/simple/pyicu/), version: 1.9.1
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-1.9.2.tar.gz#md5=a104ea78918a8b1f4ecbbb1063edb46b (from https://pypi.python.org/simple/pyicu/), version: 1.9.2
    Found link https://pypi.python.org/packages/source/P/PyICU/PyICU-1.9.tar.gz#md5=a47546979c2893d7ef01e5eb8234ee03 (from https://pypi.python.org/simple/pyicu/), version: 1.9
    Skipping link http://icu-project.org/apiref/icu4c/ (from https://pypi.python.org/simple/pyicu/); not a file
    Skipping link http://icu-project.org/apiref/icu4c/classDateFormat.html (from https://pypi.python.org/simple/pyicu/); unknown archive format: .html
    Skipping link http://icu-project.org/apiref/icu4c/classLocale.html (from https://pypi.python.org/simple/pyicu/); unknown archive format: .html
    Skipping link http://site.icu-project.org/ (from https://pypi.python.org/simple/pyicu/); not a file
    Using version 1.9.2 (newest of versions: 1.9.2, 1.9.1, 1.9, 1.8, 1.7, 1.6, 1.5, 1.4, 1.3, 1.2, 1.1, 1.0.1, 1.0, 0.9, 0.8.1, 0.8)
    Downloading from URL https://pypi.python.org/packages/source/P/PyICU/PyICU-1.9.2.tar.gz#md5=a104ea78918a8b1f4ecbbb1063edb46b (from https://pypi.python.org/simple/pyicu/)
    Running setup.py (path:C:\Users\Banatus\AppData\Local\Temp\pip_build_Banatus\pyicu\setup.py) egg_info for package pyicu
    running egg_info
    creating pip-egg-info\PyICU.egg-info
    writing top-level names to pip-egg-info\PyICU.egg-info\top_level.txt
    writing dependency_links to pip-egg-info\PyICU.egg-info\dependency_links.txt
    writing pip-egg-info\PyICU.egg-info\PKG-INFO
    writing manifest file 'pip-egg-info\PyICU.egg-info\SOURCES.txt'
    warning: manifest_maker: standard file '-c' not found

    reading manifest file 'pip-egg-info\PyICU.egg-info\SOURCES.txt'
    reading manifest template 'MANIFEST.in'
    writing manifest file 'pip-egg-info\PyICU.egg-info\SOURCES.txt'
    RefactoringTool: Skipping implicit fixer: buffer
    RefactoringTool: Skipping implicit fixer: idioms
    RefactoringTool: Skipping implicit fixer: set_literal
    RefactoringTool: Skipping implicit fixer: ws_comma
    RefactoringTool: Refactored test\__init__.py
    RefactoringTool: Refactored test\test_BreakIterator.py
    RefactoringTool: Refactored test\test_Charset.py
    RefactoringTool: Refactored test\test_Collator.py
    RefactoringTool: Refactored test\test_LayoutEngine.py
    RefactoringTool: Refactored test\test_ListFormatter.py
    RefactoringTool: Refactored test\test_LocaleData.py
    RefactoringTool: Refactored test\test_MessageFormat.py
    RefactoringTool: Refactored test\test_Normalizer.py
    RefactoringTool: Refactored test\test_Spoof.py
    RefactoringTool: Refactored test\test_Transliterator.py
    RefactoringTool: Refactored test\test_UCS4.py
    RefactoringTool: No changes to test\test_UDate.py
    RefactoringTool: Files that were modified:
    RefactoringTool: test\__init__.py
    RefactoringTool: test\test_BreakIterator.py
    RefactoringTool: test\test_Charset.py
    RefactoringTool: test\test_Collator.py
    RefactoringTool: test\test_LayoutEngine.py
    RefactoringTool: test\test_ListFormatter.py
    RefactoringTool: test\test_LocaleData.py
    RefactoringTool: test\test_MessageFormat.py
    RefactoringTool: test\test_Normalizer.py
    RefactoringTool: test\test_Spoof.py
    RefactoringTool: test\test_Transliterator.py
    RefactoringTool: test\test_UCS4.py
    RefactoringTool: test\test_UDate.py
    Source in c:\users\banatus\appdata\local\temp\pip_build_banatus\pyicu has version 1.9.2, which satisfies requirement pyicu
    Installing collected packages: pyicu
    Running setup.py install for pyicu
    Running command C:\Python34\python.exe -c "import setuptools, tokenize;__file__='C:\\Users\\Banatus\\AppData\\Local\\Temp\\pip_build_Banatus\\pyicu\\setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record C:\Users\Banatus\AppData\Local\Temp\pip-b1c3bez9-record\install-record.txt --single-version-externally-managed --compile
    running install
    running build
    running build_py
    creating build
    creating build\lib.win-amd64-3.4
    copying icu.py -> build\lib.win-amd64-3.4
    copying PyICU.py -> build\lib.win-amd64-3.4
    copying docs.py -> build\lib.win-amd64-3.4
    running build_ext
    building '_icu' extension
    error: Unable to find vcvarsall.bat
    Complete output from command C:\Python34\python.exe -c "import setuptools, tokenize;__file__='C:\\Users\\Banatus\\AppData\\Local\\Temp\\pip_build_Banatus\\pyicu\\setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record C:\Users\Banatus\AppData\Local\Temp\pip-b1c3bez9-record\install-record.txt --single-version-externally-managed --compile:
    running install

    running build

    running build_py

    creating build

    creating build\lib.win-amd64-3.4

    copying icu.py -> build\lib.win-amd64-3.4

    copying PyICU.py -> build\lib.win-amd64-3.4

    copying docs.py -> build\lib.win-amd64-3.4

    running build_ext

    building '_icu' extension

    error: Unable to find vcvarsall.bat

    ----------------------------------------
    Cleaning up...
    Removing temporary dir C:\Users\Banatus\AppData\Local\Temp\pip_build_Banatus...
    Command C:\Python34\python.exe -c "import setuptools, tokenize;__file__='C:\\Users\\Banatus\\AppData\\Local\\Temp\\pip_build_Banatus\\pyicu\\setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record C:\Users\Banatus\AppData\Local\Temp\pip-b1c3bez9-record\install-record.txt --single-version-externally-managed --compile failed with error code 1 in C:\Users\Banatus\AppData\Local\Temp\pip_build_Banatus\pyicu
    Exception information:
    Traceback (most recent call last):
    File "C:\Python34\lib\site-packages\pip\basecommand.py", line 122, in main
    status = self.run(options, args)
    File "C:\Python34\lib\site-packages\pip\commands\install.py", line 283, in run
    requirement_set.install(install_options, global_options, root=options.root_path)
    File "C:\Python34\lib\site-packages\pip\req.py", line 1435, in install
    requirement.install(install_options, global_options, *args, **kwargs)
    File "C:\Python34\lib\site-packages\pip\req.py", line 706, in install
    cwd=self.source_dir, filter_stdout=self._filter_install, show_stdout=False)
    File "C:\Python34\lib\site-packages\pip\util.py", line 697, in call_subprocess
    % (command_desc, proc.returncode, cwd))
    pip.exceptions.InstallationError: Command C:\Python34\python.exe -c "import setuptools, tokenize;__file__='C:\\Users\\Banatus\\AppData\\Local\\Temp\\pip_build_Banatus\\pyicu\\setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record C:\Users\Banatus\AppData\Local\Temp\pip-b1c3bez9-record\install-record.txt --single-version-externally-managed --compile failed with error code 1 in C:\Users\Banatus\AppData\Local\Temp\pip_build_Banatus\pyicu

    Reply
  2. ิBanatus

    ทดลองติดตั้งอีกแบบก็เป็นครับ
    C:\Python34\PyICU-1.9.2>python setup.py install
    running install
    running bdist_egg
    running egg_info
    writing PyICU.egg-info\PKG-INFO
    writing dependency_links to PyICU.egg-info\dependency_links.txt
    writing top-level names to PyICU.egg-info\top_level.txt
    reading manifest file 'PyICU.egg-info\SOURCES.txt'
    reading manifest template 'MANIFEST.in'
    writing manifest file 'PyICU.egg-info\SOURCES.txt'
    installing library code to build\bdist.win-amd64\egg
    running install_lib
    running build_py
    creating build
    creating build\lib.win-amd64-3.4
    copying icu.py -> build\lib.win-amd64-3.4
    copying PyICU.py -> build\lib.win-amd64-3.4
    copying docs.py -> build\lib.win-amd64-3.4
    running build_ext
    building '_icu' extension
    error: Unable to find vcvarsall.bat

    C:\Python34\PyICU-1.9.2>

    Reply
  3. ิBanatus

    ปัญหาที่แล้วน่าจะมาจาก Unable to find vcvarsall.bat ผมลองหาจากgoogle http://stackoverflow.com/questions/19830942/pip-install-gives-error-unable-to-find-vcvarsall-bat
    ต้องลง install Microsoft Visual C++ Compiler for Python 2.7. ไปก่อนทำตามจนจบ ไม่เจอปัญหาเก่า แต่เกิดปัญหาใหม่แทน
    รบกวนอีกครั้งครับ
    มีตัวตัดภาษาไทยบน Python อื่นๆที่ใช้ง่ายๆไม๊ครับ

    C:\Python27\Scripts>pip install -U pyicu
    Collecting pyicu
    Downloading PyICU-1.9.2.tar.gz (175kB)
    100% |################################| 176kB 660kB/s
    Building wheels for collected packages: pyicu
    Running setup.py bdist_wheel for pyicu
    Complete output from command C:\Python27\python.exe -c "import setuptools;__fi
    le__='c:\\users\\banatus\\appdata\\local\\temp\\pip-build-6nse8j\\pyicu\\setup.p
    y';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))"
    bdist_wheel -d c:\users\banatus\appdata\local\temp\tmpnzvfytpip-wheel-:
    running bdist_wheel
    running build
    running build_py
    creating build
    creating build\lib.win32-2.7
    copying icu.py -> build\lib.win32-2.7
    copying PyICU.py -> build\lib.win32-2.7
    copying docs.py -> build\lib.win32-2.7
    running build_ext
    building '_icu' extension
    error: The syntax of the command is incorrect.

    Reply

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *