Hatena::ブログ(Diary)

るびゅ備忘録 このページをアンテナに追加 RSSフィード


03/31/2009

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

ATOKが半角カナの呪いでとても悲しいことになったので、ATOK2009を買った。

そしたらなんとPythonプラグインを書けるとか。

http://www.atok.com/useful/developer/api/plugin.html

どう見ても簡単そうだったので、同じくちょうど見つけたところの日本語 WordNetシソーラスを使ってプラグインを書いてみた。

一回で二種類の勉強になる。いいことだ。

いつもそう思って適当な未知のものを数種類掛け合わせて微妙なものができるんだが、今回はどうやら成功。


f:id:ruby-U:20090331085119p:image


画像は「赤」で候補を出している。「社会主義経済」とかまんまですな。なんか違うけど。

単語の関係性(同義語、上位語など)を問わず、繋がってるものを列挙して〜を数回繰り返して、順に並べてるだけ。

もうちっと洗練させれば物書きにはたまらないものになりそうだ。

語彙を増やすのにシソーラスは最強。それがシームレスに繋がるとかもう!


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

#!-*- 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()

ミニシャビンミニシャビン 2011/11/03 07:50 当方ATOK2010 Windows7 なのですが、動作しないので詳しく教えて頂けると助かります。お忙しいとは思いますがよろしくお願いします。

ruby-Uruby-U 2011/11/03 13:05 http://atokdirect.g.hatena.ne.jp/ruby-U/20090331/1238463924
に書いてあるのですが、日本語WordNetのデータベースの本体が必要になります。
ダウンロードして、指定の場所に配置してみてください。

ミニシャビンミニシャビン 2011/11/03 19:55 ruby-Uさま
解答ありがとうございます。
自分が試したことですが
Pythonをインストール
日本語WordNetのデータベースの本体を
\JustSystems\ATOK\ATOKDIRECT\PLUGIN内に設置
このページのソースをdbpathをデータベースのパスに書き換え
pyファイルとしてPLUGIN内に保存
pyファイルと同じ名前のxmlファイルを作成

これではATOKダイレクトプラグインとして認識されていないようです。
プログラミングはほとんどやったことがないのですが、
あまりにも便利そうなプラグインだったのでチャレンジしてみました。
ruby-Uさまには大変迷惑な話だと思いますが、アドバイス頂ければと思います。
お忙しいとは思いますがよろしくお願いします。

ruby-Uruby-U 2011/11/03 20:27 http://atokdirect.g.hatena.ne.jp/keyword/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E4%B8%80%E8%A6%A7
にzipファイルがありまして、解凍するとsetup.exeが入っていて、これをクリックしてセットアップ…という流れだったと思うのですが、Atokさんもやる気が無いのか全部リンク切れみたいですね…。
とりあえずアップロードしておきました。
http://dl.dropbox.com/u/1651917/hosting/etc/atok_plugin_wnjpn/dropindex.html

ミニシャビン ミニシャビン 2011/11/03 22:22 ruby-Uさま
ありがとうございました。
無事インストールできました
これ最強に便利です。
なんとお礼を言っていいかわからないくらい
すっげー便利です!!
本当に親切にして頂きありがとうございました。

ruby-Uruby-U 2011/11/03 22:37 ありがとうございます。楽しんで頂けたら開発者冥利に尽きます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証