0

MySQL: insert ถ้ายังไม่มี

ปกติใน MySQL (DBMS อื่นๆ ก็คงเหมือนกัน) ถ้าเราไป insert อะไรซ้ำๆ เข้าไปใน column ที่บังคับไว้ว่าต้อง unique มันก็จะเจ๊ง ก็เลยต้องมาดูก่อนว่ามีข้อมูลแล้วหรือยัง ค่อย insert แต่ว่าจะเขียน SQL อย่างไรให้สั้นๆ ง่ายๆ เท่าที่อ่านมาจาก http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html ผ่านทาง http://stackoverflow.com/questions/1361340/how-to-insert-if-not-exists-in-mysql มาอีกที

ผมเลือกใช้ “on duplicate key update” เพิ่มใน insert เพราะเท่าที่อ่านมา 3 วิธีก็ วิธ๊นี้ก็ดูประหยัด และไม่ไปเพิกเฉยต่อ error อื่น ที่ไม่เกี่ยวข้อง

สมมุติว่าผมจะเพิ่ม 6 เข้าไปใน textunit_conflicts.textunit_id ก็เขียนแบบนี้

insert into textunit_conflicts value (6) on duplicate key update textunit_id = textunit_id;

textunit_id = textunit_id ก็เขียนไปไม่ให้มันผิด syntax เฉยๆ

2

Weak typing

ใน PHP เขียนแบบนี้

<?php echo 10 + "20"; ?>

ผลลัพธ์คือ

30

ใน Python เขียนแบบนี้

print 10 + "20"

ผลคือ

Traceback (most recent call last):
  File "weak.py", line 1, in 
    print "10" + 20
TypeError: cannot concatenate 'str' and 'int' objects

เท่าที่ผมเข้าใจแบบนี้คือข้อแตกต่างกันระหว่าง strongly typing กับ weak typing ถ้าเป็น weak typing แทนที่มันจะสร้าง exception หรือรายงานความผิดพลาด หรือสร้าง exception ออกมา มันก็แปลง (cast) ให้เอง โดยที่ไม่ได้บอกอะไร

เพิ่มเติม 1: จากเหตุผลข้างบน ทำให้ type system ของ Python ไม่ใช่ weak typing เพราะว่ามันไม่แปลง type ให้ แต่โยน exception ออกมาแทน ต่างจาก PHP ที่ string กับ integer ก็บวกกันออกมาเป็น integer ได้

13

ลองใช้ XMLChid กับ UnigramTagger ของ NLTK

ทีแรกผมก็เขียน xmlchid_loader.py เพื่ออ่าน xmlchid.xml ให้อยู่ในรูปแบบ corpus ของ NLTK

from xml.sax import make_parser
from xml.sax.handler import ContentHandler

class Handler(ContentHandler):
    def __init__(self):
        self.corpus = []

    def startElement(self, name, attrs):
        if name == 'word':
            surface = attrs['surface']
            tag = attrs['pos']
            self.corpus[-1].append((surface, tag))
        elif name == 'sentence':
            self.corpus.append([])

def load_xmlchid(filename):
    parser = make_parser()
    handler = Handler()
    parser.setContentHandler(handler)
    parser.parse(filename)
    return handler.corpus

และก็ทีนี้ก็ไปเรียกใช้ UnigramTagger ตามฟอร์ม

#-*- coding: UTF-8 -*-
from xmlchid_loader import load_xmlchid
from nltk import UnigramTagger
corpus = load_xmlchid('xmlchid.xml')
corpus = filter(lambda sent: len(sent) > 0, corpus)
tagger = UnigramTagger(corpus)
result = tagger.tag([u'การ', u'ทำ', u'การบ้าน'])
result = map(lambda w: (w[0], "UNK") if w[1] is None else w, result)
print u" ".join([u"/".join(w) for w in result])

ผลลัพธ์ก็จะได้แบบนี้

การ/FIXN ทำ/VACT การบ้าน/UNK
10

XMLChid – This product is created with the use of ORCHID corpus jointly developed by NECTEC and NICT

Orchid เป็นคลังข้อความที่มีคำ ชนิดของคำ (ทางภาษาศาสตร์) และข้อมูลอื่นๆ อยู่ มีมาตั้งแต่ พ.ศ. 2540 ตอนนี้มีหน้าเว็บที่เข้าไปดาวโหลดได้แล้ว http://www.hlt.nectec.or.th/orchid/

ผมลองเปิดดูคิดว่าถ้าเป็น xml ก็น่าจะใช้ได้ง่ายดีเหมือนกัน ก็เลยลองแปลงเป็น xml ดู ทำมาได้ปี 2 แล้วมั้ง แต่ว่าพึ่งเอามาปล่อย เพราะว่า พึ่งเห็น license ของ orchid ที่ชัดเจน และจะเอาไปใช้ในการเรียนการสอนวิชา NLP

license ของ Orchid ซึ่งก็รวมถึง XMLChid มีว่าแบบนี้

     	

@1997 National Electronics and Computer Technology Center (NECTEC). All
rights reserved.

LICENSE AGREEMENT

License agreement (LA) is a legal agreement between you and NECTEC.Please read it carefully before redistribution, reproduction or downloading from ORCHID services. This license agreement consists of the above copyright notice, definitions, the acceptance of license agreement, terms of use, and disclaimer information. In addition, it provides warranty information, specific terms and conditions that depart from other "free" softwares or corpora and "open source" softwares or copora.

1. Definitions

(a) "NECTEC" refers to National Electronics and Computer Technology Center which is an organization under National Science and Technology Development Agency (NSTDA), Ministry of Science and Technology, Thailand.

(b) "NICT" refers to National Institute of Information and Communications Technology, Japan.

(b) "ORCHID" refers to a database or corpus jointly developed by NECTEC and NICT.

(c) "Services" refer to any supplies for accessing to a variety of resources, including tools, downloading, communication and collected information, and also any update, enhancement, new features, and/or the addition of any new Web property.

(d) "Terms of Use" or "TOU" refers to terms and conditions for utilizing ORCHID.

(e) "You" refers to any end users and/or government and private contributors who download program and data from ORCHID website in order to reproduce, redistribute and update content, material, or any products corresponding to ORCHID.

2. Acceptance of License Agreement
NECTEC reserves the right to update the license agreement at any time without prior notice.

3. Terms of Use

Redistribution and use of ORCHID, with or without modification, are permitted provided that all of the following conditions are met:

(a) Redistribution of ORCHID must retain the above copyright notice, Acceptance of License Agreement, TOU, and the disclaimer in section 4.

(b) Any product, created and redistributed by you, which is composed or uses of any part from ORCHID must include the following acknowledgement:

"This product is created with the use of ORCHID corpus jointly developed by NECTEC and NICT."

(c) Products derived from the adaptation of ORCHID must not be called "ORCHID", nor may "ORCHID" appear in their name, without prior written permission of NECTEC.

(d) You must not use "ORCHID" in a manner likely to cause any damage to NECTEC, NICT, or third person. NECTEC shall reserve our rights to demand any compensation, retaining fee, costs of action and execution, and expenses occurred out of such manner.

(e) Neither the name of the National Electronics and Computer Technology Center (NECTEC) / National Science and Technology Development Agency (NSTDA) / National Institute of Information and Communications Technology (NICT) nor the names of its contributors may be used to endorse or promote product derived from this software without specific prior written permission.

4. Disclaimer of Warranty

ORCHID, INFORMATION, CONTENT, MATERIAL, OR PRODUCT JOINLY PROVIDED OR RELEASED BY NECTEC AND NICT ARE THE COPYRIGHTED WORK OF NECTEC AND NICT. MOREOVER, ORCHID, INFORMATION, CONTENT, MATERIAL, OR PRODUCT JOINTLY PROVIDED OR RELEASED BY NECTEC, NICT AND CONTRIBUTORS ARE ALSO ON AN "AS IS" AND "AS AVAILABLE" BASIS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NECTEC, NICT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, INFORMATION CONTENT, MATERIAL, OR PRODUCT, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

พอดีเขาห้ามใช้ชื่อเดิมก็เลยตั้งชื่อให้ใหม่ว่า XMLChid ซึ่งดาวโหลดได้ที่ http://naist.cpe.ku.ac.th/pkg/xmlchid-20091123.tar.gz

3

KUCut API

ตั้งแต่ version 1.2.7 เป็นต้นไป KUCut มี API ให้เรียกใช้ง่ายๆ จาก Python แล้ว เวลาเรียกใช้งานทำแบบนี้

from kucut import SimpleKucutWrapper as KUCut
myKUCut = KUCut()
result = myKUCut.tokenize([u"ทดสอบทดสอบ"])

ใน result ก็จะได้ list 3 ชั้นออกมา

9

การติดตั้งและใช้งาน KUCut บน Windows (XP)

KUCut มีคนถามบ่อยเหมือนกันว่าติดตั้งใช้งานอย่างไร ผมก็เลยเขียนเป็น blog ไว้เลยดีกว่า

  1. ติดตั้ง Python 2.6.2
  2. ขั้นตอนแรกก็ดาวโหลด KUCut มาก่อนจาก kucut-1.2.7.tar.gz
  3. จากนั้นก็แตกไฟล์ zip ที่ดาวโหลดมาแล้วออกมา ในกรณีนี้ผมเก็บไว้ใน Desktop
  4. เรียกใช้งานโปรแกรม command prompt
  5. ใช้คำสั่ง cd เปลี่ยน directory ไปเป็น directory ของ KUCut
    kucut_screen1
  6. ติดตั้ง KUCut ด้วยคำสั่ง
    C:\Python26\python.exe setup.py install
    
  7. ลองสร้างไฟล์ test1.txt เขียนภาษาไทยไว้เพื่อทดสอบ (ใช้ character set TIS-620)
    ผมเขียนสิ่งนี้ลงไป:

    ทดลอง โปรแกรมตัดคำ
    
  8. สั่งตัดคำโดยใช้คำสั่ง
    C:\Python26\python.exe C:\Python26\Scripts\kucut --line="_" test1.txt
    
  9. ก็จะได้ไฟล์ test1.txt.cut ออกมา เปิดดูข้างในก็ควรจะเป็นแบบนี้
    ทดลอง _ โปรแกรม ตัด คำ 
    

เป็นอันเรียบร้อย วิธีใช้จาก Python เดี๋ยวผมจะเขียนอีกทีครับ (ถ้าผมทำได้)