White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

n-gramとyieldと

N-gramはn文字ずつの並びを索引として持つ。

詳しくはこの辺でも見てください。
http://gihyo.jp/dev/serial/01/make-findspot/0005

それの(格納とかはしていないのだけど)簡単なサンプル。
http://hiroshiykw.blogspot.com/2007/12/n-gram.html

これを見ていたらyieldとかあった。

なんか説明とか見るとジェネレータ関数がどうこうとかわからないことが書かれていたので、ちょっと自分で確認。以下は2文字ずつ区切るbigram.py(上のサイトのやつです)。

def bigram(data):
    if len(data) < 2:
        return
    print ("hoge",data[0],"+",data[1])
    prev = data[0]
    for x in data[1:]:
        yield [prev, x]
        prev = x

実行結果

In [1]: import bigram
In [2]: i = bigram.bigram("hello world")
In [3]: i.next()
('hoge', 'h', '+', 'e')
Out[3]: ['h', 'e']
In [4]: i.next()
Out[4]: ['e', 'l']
In [5]: i.next()
Out[5]: ['l', 'l']
...

というわけで、関数のTopに戻るとかじゃなくてyieldを呼んだ時点で関数の実行を一時中断して値を返すだけに見える。


話は変わるけどsqlalchemy+bigram+markovとかやると面白いかな。