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()