日本語WordNetのデータベースを使ったATOKプラグイン(シソーラスもどき)

ATOKが半角カナの呪いでとても悲しいことになったので、ATOK2009を買った。
そしたらなんとPythonプラグインを書けるとか。
http://www.atok.com/useful/developer/api/plugin.html
どう見ても簡単そうだったので、同じくちょうど見つけたところの日本語 WordNetシソーラスを使ってプラグインを書いてみた。
一回で二種類の勉強になる。いいことだ。
いつもそう思って適当な未知のものを数種類掛け合わせて微妙なものができるんだが、今回はどうやら成功。



画像は「赤」で候補を出している。「社会主義経済」とかまんまですな。なんか違うけど。
単語の関係性(同義語、上位語など)を問わず、繋がってるものを列挙して〜を数回繰り返して、順に並べてるだけ。
もうちっと洗練させれば物書きにはたまらないものになりそうだ。
語彙を増やすのにシソーラスは最強。それがシームレスに繋がるとかもう!


例によってソースをべたっと貼り付け。

#!-*- coding:utf-8 -*-

#ATOK2009プラグイン 日本語WordNetのデータベースを使ったシソーラス機能
#
#日本語 WordNet
#    http://nlpwww.nict.go.jp/wn-ja/index.ja.html
#にて公開されている
#Wn-Ja 0.9: Japanese Wordnet and Princeton WordNet in an sqlite3 database
#    http://nlpwww.nict.go.jp/wn-ja/data/wnjpn-0.9.db
#を使用します。dbpathに合わせて配置してください。
#
#データベースにはIndexを貼るとレスポンスが高速化します。
#(SQLITEのIndexがどのように動くかは調べてませんが…)
#とりあえず私は以下のように貼りました。
#ex.
#
#CREATE INDEX idx_synlink_synset1 ON synlink(synset1);
#CREATE INDEX idx_sense_synset ON sense(synset);
#CREATE INDEX idx_sense_wordid ON sense(wordid);
#CREATE INDEX idx_word_wordid_lang ON sense(wordid, lang);
#

import sqlite3

dbpath = r'C:\Program Files\Justsystem\ATOK\ATOKDIRECT\PLUGIN\wnjpn-0.9.db'
con = sqlite3.connect(dbpath)

def atok_plugin_run_process( a_request_data ):
    result_data = {}
    candidate_array = []
    str = a_request_data[ 'composition_string' ]
    if str:
        words = getList(str)
        for word in words:
            candidate_array.append( { 'hyoki' : word } )

    result_data[ 'candidate' ] = candidate_array
    return result_data

def seek(synset):
    cur = con.execute(
        """
        SELECT
            *
        FROM
            sense
        WHERE
            synset =
            (
                SELECT
                    synset2
                FROM
                    synlink
                WHERE
                    synset1 = ?
            )
        """,
        [synset]
        )
    senses = cur.fetchall()
    return senses

def getList(lemma):
    list = []
    
    cur = con.execute(
        """
        SELECT
            *
        FROM
            sense
        WHERE
            wordid =
            (
                SELECT
                    wordid
                FROM
                    word
                WHERE
                    lemma = ?
            )
        """,
        [lemma])
    senses = cur.fetchall()
    
    already = {}
    results = []
    results.append([senses])
    for i in xrange(2):
        current = []
        for result in results[i]:
            for sense in result:
                temp = []
                senses = seek(sense[0])
                for sense in senses:
                    id = str(sense[1])
                    if not already.has_key(id):
                        temp.append(sense)
                        already[id] = ''
                senses = temp
                if senses:
                    current.append(senses)
        results.append(current)
    results.pop(0)
    
    for result in results:
        for senses in result:
            for sense in senses:
                cur = con.execute(
                    """
                    SELECT
                        *
                    FROM
                        word
                    WHERE
                        wordid = ?
                            AND
                        lang = ?
                    """,
                    [sense[1], 'jpn'])
                word = cur.fetchone()
                if word:
                    list.append(word[2])
    return list
def test():
    print atok_plugin_run_process({'composition_string': u'赤'})
    
if __name__ == '__main__':
    test()