Tcl拡張 – hashtrie

Pocket

一括置換やLongest Common Prefix Searchなどを行うためのtrie風データ構造です。
今のところ、渡されるtrieの中身などはチェックしていません。そのうち直します。
拡張名:hashtrie
ダウンロード:hashtrie.zip
使い方は下記参照:

% package require hashtrie
1.0
% set trie [hashtrie::new]
{} {} 0 {}
% set trie [hashtrie::add $trie test テスト]
{t-0 1 e-1 2 s-2 3 t-3 4} {4 テスト} 4 {4 test}
% set trie [hashtrie::add $trie check チェック]
{t-0 1 e-1 2 s-2 3 t-3 4 c-0 5 h-5 6 e-6 7 c-7 8 k-8 9} {4 テスト 9 チェック} 9 {4 test 9 check}
% set d [dict create 今日 きょう 明日 あした 明後日 あさって]
今日 きょう 明日 あした 明後日 あさって
% set trie [hashtrie::import $trie $d]
{t-0 1 e-1 2 s-2 3 t-3 4 c-0 5 h-5 6 e-6 7 c-7 8 k-8 9 今-0 10 日-10 11 明-0 12 日-12 13 後-12 14 日-14 15} {4 テスト 9 チェック 11 きょう 13 あした 15 あさって} 15 {4 test 9 check 11 今日 13 明日 15 明後日}
% hashtrie::exists $trie 今日
1
% hashtrie::replace $trie "今日と明日はtestで忙しい。"
きょうとあしたはテストで忙しい。
% hashtrie::remove trie check
1
% puts $trie
{t-0 1 e-1 2 s-2 3 t-3 4 c-0 5 h-5 6 e-6 7 c-7 8 k-8 9 今-0 10 日-10 11 明-0 12 日-12 13 後-12 14 日-14 15} {4 テスト 11 きょう 13 あした 15 あさって} 15 {4 test 11 今日 13 明日 15 明後日}

DESCRIPTION

hashtrie::new {}

空のhashtrieを作ります。上の例のように、hashtrieは3つのdictと1つの数字で構成されるリストです。

hashtrie::add {trie word value}

hashtrieにデータを登録します。wordとそれに対応する値であるvalueを登録します。

hashtrie::remove {trieName word}

hashtrieからwordに対応するデータを削除します。成功すれば1、失敗すれば0を返します。引数のtrieNameには値ではなく、変数の名前を渡します。

hashtrie::exists {trie word}

trieにwordが含まれていれば1、含まれていなければ0が返ってきます。

hashtrie::commonprefix {trie str}

strの先頭から検索を行い、trieに含まれている単語が含まれていれば、その単語に対応するstateと単語の終端位置のペアをリストにして返します。検索で何もヒットしなかった場合は何も返しません。なお、後述のhashtrie::getvalueやhashtrie::getoriginalを利用すれば、返り値のstateに対応する単語のデータを得ることができます。

% set trie [hashtrie::import $trie [dict create 国 kuni 国家 kokka 国家警察 kokkakeisatsu 国家機関 kokkakikan]]
{国-0 1 家-1 2 警-2 3 察-3 4 機-2 5 関-5 6} {1 kuni 2 kokka 4 kokkakeisatsu 6 kokkakikan} 6 {12 国家 4 国家警察 6 国家機関}
% hashtrie::commonprefix $trie 国家機関と舞踏会
{1 0} {2 1} {6 3}

hashtrie::longest {trie str}

commonprefixと同様の検索を行い、最も長い単語のstateと終端位置を返します。

hashtrie::getall {trie str}

strの終端まで検索を行い、trieに含まれている単語が存在すれば、その単語に対応するstateと単語の終端位置のペアをリストにして返します(先頭からの最長一致で検索を行うため、すべての単語にヒットするわけではありません)。

hashtrie::getvalue {trie state}

stateに対応する置換候補を返します。

% set trie [hashtrie::import $trie [dict create 国 kuni 国家 kokka 国家警察 kokkakeisatsu 国家機関 kokkakikan]]
{国-0 1 家-1 2 警-2 3 察-3 4 機-2 5 関-5 6} {1 kuni 2 kokka 4 kokkakeisatsu 6 kokkakikan} 6 {12 国家 4 国家警察 6 国家機関}
% hashtrie::commonprefix $trie 国家機関と舞踏会
{1 0} {2 1} {6 3}
% hashtrie::getvalue $trie 6
kokkakikan

hashtrie::getoriginal {trie state}

stateに対応する単語を返します。

% set trie [hashtrie::import $trie [dict create 国 kuni 国家 kokka 国家警察 kokkakeisatsu 国家機関 kokkakikan]]
{国-0 1 家-1 2 警-2 3 察-3 4 機-2 5 関-5 6} {1 kuni 2 kokka 4 kokkakeisatsu 6 kokkakikan} 6 {12 国家 4 国家警察 6 国家機関}
% hashtrie::commonprefix $trie 国家機関と舞踏会
{1 0} {2 1} {6 3}
% hashtrie::getoriginal $trie 6
国家機関

hashtrie::replace {trie str ?mode? ?template? ?min?}

strを走査し、trieに含まれている単語があれば、その最も長い単語を対応する値に置換します。返り値は置換後の文字列です。

% set trie [hashtrie::import $trie [dict create 国 kuni 国家 kokka 国家警察 kokkakeisatsu 国家機関 kokkakikan]]
{国-0 1 家-1 2 警-2 3 察-3 4 機-2 5 関-5 6} {1 kuni 2 kokka 4 kokkakeisatsu 6 kokkakikan} 6 {12 国家 4 国家警察 6 国家機関}
% hashtrie::replace $trie 国家機関と舞踏会
kokkakikanと舞踏会

hashtrie::import {trie dict ?mode? ?widget?}

trieにdictからまとめてデータを登録します。dictにはTclのdictを渡します。modeでデータが重複していた場合の処理方法を指定します。ignore、merge、updateの3つのモードを選択することができ、ignoreは重複データを無視して登録しない、mergeは既存のデータをリストと見なし、新たなデータとマージして重複のないリストを登録する、updateは重複データを上書きするかたちとなります。デフォルトはupdateです。widgetには登録の進捗状況(dictの何件目の要素を処理しているか)を表示するための変数を指定します。たとえばlabelウィジェットの-textvariableの変数を指定します。

% set trie [hashtrie::import $trie [dict create 国 kuni 国家 kokka 国家警察 kokkakeisatsu 国家機関 kokkakikan]]
{国-0 1 家-1 2 警-2 3 察-3 4 機-2 5 関-5 6} {1 kuni 2 kokka 4 kokkakeisatsu 6 kokkakikan} 6 {12 国家 4 国家警察 6 国家機関}

hashtrie::export {trie ?mark?}

trieに含まれている単語と値のペアをdictにして返します。

% hashtrie::export $trie
国 kuni 国家 kokka 国家警察 kokkakeisatsu 国家機関 kokkakikan

hashtrie::save {trie filename ?encode? ?newline?}

trieをファイルに保存します。文字コードと改行コードを指定することができます。成功すると1が返ってきます。

hashtrie::load {filename ?encode? ?newline?}

ファイルに保存したtrieを読み込みます。saveと同様、文字コードと改行コードを指定することができます。返り値はtrieのデータです。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください