suffix array構築するぜ〜的なライブラリは数あれど、unicode文字列を検索したりいろいろするようなライブラリが無いので、せっかくだから作った。富豪的にメモリは一杯あること前提での実装で、mmapとかもしてないけど新聞記事一年分とか突っ込んでもメモリ250MB位だから問題ないよね。手早くやりたいことやるために作ったのでD+ジーに大きく依存しています。

python2.6以上で、3系でも動くかも。

-レポジトリ
--http://bitbucket.org/aihara/pykwic

-依存ライブラリ
--libicu(ユニコード処理用)

-依存pythonライブラリ
--cython
--nose

libicuへの依存は無くしたい。
** インストール [#a1b33da4]

 pip install pykwic

**使い方 [#v377145c]

基本的に、一行なり一文、一段落を一要素として追加しsuffix arrayを構築します。要素をまたぐような文字列は検索されません。現在は、idなどを保持するようにはなっておらず、単純にkwicのような機能のみを提供しています。

 import pykwic
 
 kwic = pykwic.Kwic()
 kwic.add_line(u"うなぎうなうなうなぎなう")
 kwic.add_line(u"うらにはにわにわとりがいる")
 kwic.build()
 kwic.save("ファイル名")
 kwic.load("ファイル名")


buildを実行すると、suffix arrayが構築され、saveでインデックスを保存することができます。loadも可能です。

searchメソッドでは、検索文字列が存在する場所のprefixと、検索文字列を含むsuffixを取得できます。kwic的な事をするには、以下のような呼出を行えば可能です。

 query = u"うな"
 for x in kwic.search(query):
     print x[0],query,x[1][len(query):]

せっかくなので、拡張接尾辞配列もサポートしています。 
差し当たり、以下のようなコードで二回以上出現する極大部分文字列をその頻度とセットで取り出すことが可能です。
maxmal_substringメソッドはジェネレータになっていて、極大部分文字列を一つずつ取り出すような実装になっています。

 kwic = pykwic.EKwic()
 kwic.add_line(u"うなぎうなうなうなぎなう")
 kwic.add_line(u"うらにはにわにわとりがいる")
 kwic.build()
 
 for maxsubst in kwic.maxmal_substring():
     print maxsubst[0],maxsubst[1]

おもちゃのようなコードですが、ちょっとした用例検索などに利用してください。
そのうちpure cythonに直して便利にします。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS