0

KunyitTST: Taking list of string as key

KunyitTst is a ternary search tree library in Python. Normally, it takes string or unicode as key since I use it for Thai word segmentation or something similar. By the way, now I want to use it to store list of string key too for storing (Moses) phrase table so it needs some modification. I’m still not sure how much it will effect performance. Anways, the patch is as follow:

Index: tests/test_basic.py
===================================================================
--- tests/test_basic.py	(revision 15)
+++ tests/test_basic.py	(working copy)
@@ -26,6 +26,27 @@
     def setup_method(self, method):
         self.setup()

+    def test_insert_has_key_list(self):
+        self.tst.insert(['i', 'have', 'a', 'key'], 10)
+        self.tst.insert(['i', 'have', 'a', 'book'], 20)
+        self.tst.insert(['a', 'book'], 30)
+        assert self.tst.has_key(['i', 'have', 'a', 'key']) == True
+        assert self.tst.has_key(['i', 'have', 'a', 'book']) == True
+        assert self.tst.has_key(['a', 'book']) == True
+        assert self.tst.has_key(['a', 'look']) == False
+
+    def test_iterator_list(self):
+        self.tst.insert(['a', 'book'], 30)
+        i = self.tst.iterator()
+        assert i.apply(u"a") == True
+        assert i.is_break_pos() == False
+        assert i.apply(u"book") == True
+        assert i.is_break_pos() == True
+        assert i.get_value() == 30
+
+        i = self.tst.iterator()
+        assert i.apply(u"book") == False
+
     def test_happy_insert(self):
         self.tst.insert(u"abc", 1)

Index: kunyittst/tst.py
===================================================================
--- kunyittst/tst.py	(revision 15)
+++ kunyittst/tst.py	(working copy)
@@ -27,7 +27,8 @@
         if not self._valid:
             return False
         if isinstance(ch, str) or isinstance(ch, unicode):
-            ch = ord(ch)
+            if len(ch) == 1:
+                ch = ord(ch)
         self._n = self._tst.goto_child(self._n)
         if self._n == None:
             return False
@@ -163,7 +164,10 @@
     def insert(self, k, v):
         p = self._root * Tst.SIZE
         for i, ch in enumerate(k):
-            c = ord(ch)
+            if len(ch) == 1:
+                c = ord(ch)
+            else:
+                c = ch
             while self._nodes[p + Tst.KEY] != c:
                 if self._nodes[p + Tst.KEY] == None:
                     self._nodes[p + Tst.KEY] = c
0

Reading phrase table (for Moses) using Python

I’m going to analyze phrase table that is generated by Moses. So I have studied phrase table format from http://www.statmt.org/moses/?n=FactoredTraining.ScorePhrases and written a Python script for reading a phrase table into Python dict. The code is as follow.

import re

def _decode_tokens(field):
    return filter(lambda t: t != '', re.split(" ", field))

def _decode_link(link):
    m = re.match("\((.*)\)", link)
    if m:
        toks = filter(lambda l: l != '', re.split(",", m.group(1)))
        return map(lambda l: int(l), toks)
    else:
        raise RuntimeError

def _decode_links(field):
    links = filter(lambda t: t != '', re.split(" ", field))
    return map(_decode_link, links)

def _decode_num(field):
    toks = filter(lambda t: t != '', re.split(" ", field))
    return map(lambda tok: float(tok), toks)

def read_phrase_table(filename):
    NUM_FIELD = 5
    for i, line in enumerate(open(filename)):
        fields = re.split("\|\|\|", line.strip())
        if len(fields) != NUM_FIELD:
            raise RuntimeError
        phrase = {}
        phrase['source'] = _decode_tokens(fields[0])
        phrase['target'] = _decode_tokens(fields[1])
        phrase['links'] = _decode_links(fields[2])
        phrase['rev_links'] = _decode_links(fields[3])
        nums = _decode_num(fields[4])
        phrase['phrase_trans_prob'] = nums[0]
        phrase['lex_weight'] = nums[1]
        phrase['rev_phrase_trans_prob'] = nums[2]
        phrase['rev_lex_weight'] = nums[3]
        phrase['phrase_penalty'] = nums[4]
        yield phrase

def main():
    for phrase in read_phrase_table("phrase-table.0-0"):
        print phrase

if __name__ == '__main__':
    main()
0

สถานการณ์ web/news feed

ผมคงเขียนถึงสถานการณ์ web/news feed ไม่ว่าจะใช้ atom หรือ rss ก็ตาม แบบภาพรวมไม่ได้ เพราะผมไม่รู้. ผมเริ่มใช้ web feed มาสักพักน่าจะช่วงที่เริ่มใช้ Firefox2 ใหม่ๆ. ใช้แล้วก็รู้สึกว่าไม่สนุกเท่าไหร่ แต่พอสักพักเปลี่ยนมาใช้ Google Reader (ตอนนี้ไม่ได้ใช้แล้ว) ตอนนั้นรู้สึกว่าเจ๋งมากเลย เปลี่ยนมาอ่านข่าวและ blog ต่างๆ ผ่านทาง Google reader เป็นหลักเลย ตอนนี้ก็คล้ายๆ เดิม เพียงแต่ใช้ web feed reader ตัวอื่นๆ ที่ไม่ใช่ Google Reader เท่านั้นเอง.

ตั้งแต่ครั้งโน้นผมก็คิดว่าคงจะมีคนใช้ web feed มากขึ้นๆ เรื่อยๆ แต่จนมาถึงวันนี้เท่าที่สังเกตจากคนรอบๆ ข้าง ที่เห็นหน้า ผมพบว่ามันไม่จริง แต่มันก็อาจจะไม่ได้สะท้อนภาพรวมอะไร. เท่าที่ผมเห็นคนที่ใช้ ubuntu กับคนที่ใช้ web feed เป็นคนเดียวกัน เท่าที่เห็นรอบๆ ตัวก็มีแค่ 2 คนเท่านั้นเอง.

RSS เหมือนจะเคยเป็นที่น่าสนใจอยู่พักหนึ่งแล้วก็เงียบๆ หายไป. จนเดี๋ยวนี้ผมก็ยังต้องอธิบายให้หลายคนฟังว่าทำไมต้องมี web feed จะเอาไปใช้ทำอะไร มีประโยชน์อย่างไร. หลายๆ คนก็รู้สึกว่าซับซ้อนเกินไปแม้จะใช้ IE7 หรือ Firefox3 แล้วก็ตาม. อย่างไรก็ตามหลายๆ คนรอบๆ ตัวผมใช้ Hi5, Facebook และ Multiply เป็น ทั้งๆ ที่ผมรู้สึกว่ามันออกจะซับซ้อนนิดๆ.

อาจจะเป็นไปได้ว่า Web feed ไม่ได้ตอบโจทย์ของหลายๆ คน อีกทั้งไม่มีอนาคตเท่าไหร่สำหรับบางกลุ่ม. ถ้าอยากจะกระจายข่าว หรือว่าอาจจะกระจายข่าว หรืออะไรอื่นๆ อาจจะดีกว่าถ้าไปโพสใน Hi5 ควบคู่กันไปด้วย? ถ้าเป็นอย่างนั้นจริง ต่อไปอาจจะมีบางคน *เพิ่มเพื่อน* ที่เป็นหนังสือพิมพ์ แบบนั้นหรือเปล่า?

ผมก็คิดไป แต่ก็ไม่มีข้อมูลสนับสนุนอะไร เพียงแต่อย่างจะเล่าให้ฟัง + เก็บไว้อ่านเองว่า ตอนนี้คิดแบบนี้อยู่.

0

My first cup of cappuccino

1st cup of cappuccino

I try 2-3 times to made cappuccino but I failed so this is the first cup of cappuccino that i have made. I think I put too much milk so taste and smell of the coffee was too soft.

ผมเคยลองทำคาปูชิโนมา 2-3 ครั้งแล้ว แต่ว่าก็ไม่เสร็จ. ถ้วยนี้จึงเป็นถ้วยแรกที่ผมทำ. ผมว่าผมใส่นมเยอะไปหน่อย เลยไม่ค่อยได้ทั้งกลิ่นและรสของกาแฟ.

0

เสียวมั้ย

คนบนเสาเขาจะเสียวมั้ย? ที่ผมมีไฟฟ้าใช้ มีตึกรามบ้านช่องอยู่อาศัย ผมอาศัยอยู่บนความเสียวของคนอื่นหรือเปล่า? หรือเขาจะไม่เสียวเสียแล้ว … หรือว่าเขาจะชอบเพราะมันเสียวดี.

technician

0

Epson Stylus T11

วันนี้ลุงบอกว่าซื้อ Printer มาใหม่ เป็น Epson Stylus T11 เพราะว่าหมึกถูกดี แต่ว่า Printer ไม่ได้ เวลาเอาไปใช้กับเครื่องที่ลง Linux TLE 9 ไว้. ผมก็เลยลองเอาเครื่องผมที่ลง Ubuntu 8.04 ไว้ไปลอง ก็พบว่าเครื่องก็มองเห็น printer นะทาง USB รู้ด้วยว่าเป็นรุ่นอะไร แต่ว่าไม่มี driver สำหรับรุ่นนี้.

วันนี้ก็เลยมามาลองหาดูสักหน่อยว่ามีใครเคยเจอมาก่อนบ้าง ก็เจอวิธีที่
http://ubuntuforums.org/showthread.php?p=6071475 และ http://ubuntuforums.org/archive/index.php/t-964784.html. ดูผ่านๆ แล้วก็แอบยากนิดๆ เหมือนกัน. ก็เลยเอามาเก็บไว้ก่อน ไว้วันหลังไปลองทำดู.

แปลกดีที่ว่าชาวบ้านก็ดูเหมือนจะใช้ Debian/Ubuntu ลงในเครื่อง Desktop และ Laptop มากกว่า Distro อื่นๆ (อาจจะไม่จริงก็ได้) … แต่ว่า driver ก็มาเป็น RPM ซะงั้น … ถ้าผมซื้อ printer เองก็คงแอบๆ เลี่ยงอะนะ รุ่นนี้ อย่างน้อยๆ ก็ช่วงนี้.

0

cross processing effect ด้วย gimp

เห็นภาพของ มร.โชค ที่ http://mrchoke.multiply.com/photos/album/193/My_Way…#45 แล้วชอบใจ. จึงถามมร.โชคว่าทำอย่างไร มร.โชคว่าใช้ cross processing effect (ประมาณนั้น) ผลว่าได้เว็บนี้มา http://www.lilahpops.com/cross-processing-with-the-gimp/ เป็นวิธีทำ cross processing effect บน gimp. ผมก็เลยจัดแจงทำตาม ได้ผลแบบภาพดอกทานตะวันข้างล่าง.

cross process by gimp

ชอบใจนัก ^_^ …

ป.ล. gimp เป็นซอฟต์แวร์เสรีเอาไว้ทำอะไรต่างๆ กับรูปภาพ มีทั้งบน gnu/linux, mac, windows ว่าไปก็คล้ายๆ photoshop แต่ว่าไม่ต้องซื้อหามาในราคาแพง แก้ไขปรับปรุงได้ตามใจ แถมใช้บน gnu/linux ได้เลยด้วย.

2

ข้าวต้มปลาบาร์ใหม่

ตั้งแต่ย้ายไปจากศรีราชา (จังหวัดชลบุรี) ก็ไม่ได้กินข้าวต้มปลา ทีมงานที่เคยทำร้านอยู่ก็ไปทำประมงแทนบอกว่าเงินดีกว่า. ข้าวต้มปลาหลายครั้งที่กินก็ไม่ค่อยถูกปาก ปลาคาวบ้างอะไรบ้าง อยู่บ่อยๆ.

เมื่อวานนี้เจอร้านข้าวต้มปลา ที่บาร์ใหม่ (โรงอาหารกลาง 1 มหาวิทยาลัยเกษตรศาสตร์ วิทยาเขตบางเขน) และเห็นหน้าคนขายข้าวแกง ที่ทำคั่วกลิ้งอร่อย … ก็เลยอยากลองกินข้าวต้มปลาดูบ้าง ก็เลยไปลองกินดู.

p1130031.jpg

ก็ไม่ผิดหวัง หน้าตาธรรมดา แต่ว่าปลาไม่คาว มีขิง มีคื่นช่ายมาดับกลิ่นช่วยด้วย น้ำจิ้มเต้าเจี้ยวแบบที่ชอบ ประมาณว่าคล้ายๆ ข้าวต้มปลาที่เคยกินสมัยยังเด็กๆ ที่ศรีราชา.
rice soup with fish

ราคา 25 บาทก็ไม่ถูกไม่แพง ^_^
rice soup with fish

อยากกินอีก อยากให้ขายตอนเช้าด้วย …

0

กิน DQ Grill & Chill มาชอบมาก

ไปกิน DQ Grill & Chill มาที่ Siam Center (มั้ง) . อันนี้คือ mushroom swiss อะไรสักอย่าง. ตั้งแต่กิน burger ตามร้านประเภทนี้มาชอบ สิ่งนี้ที่สุดเลย. มีหัวหอมทอดด้วย ก็อร่อยอีกล่ะ ไม่มีน้ำมันชุ่มเหมือนบางร้าน.

DQ mushroom swiss + onion ring

สรุปว่าอร่อยชอบมากในราคาพอๆ กัน น้ำหวานซ่าทั้งหลายเติมได้เรื่อยๆ. ผิดคาดมากๆ ดูข้างนอกร้านเหมือนจะแพงกว่านี้และไม่อร่อย แต่ไปกินจริงๆ ก็ชอบ เหตุที่ไปลองเพราะอ่าน blog ของ plynoi มา หรือ twitter ไม่แน่ใจ.

เสียแต่ว่าเป็นอาหารประเภทนี้กินบ่อยไม่ได้.

update 22/12/2009: ไปกินมาครั้งที่สองพบว่าชอบอาหาร แต่อย่างอื่นออกจะประทับใจในทางลบไปหน่อย