-
Notifications
You must be signed in to change notification settings - Fork 1
/
README
97 lines (81 loc) · 4.4 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
[概要]
・DAWG(Direct Acyclic Word Graph)によるマップの実装
・入力キーセットを静的に受け取り、各キーに一意なIDをマッピングする
・入力キーセットはソート済みであり、かつ各キーはユニークでなければならない
・キーのID == 先頭から数えたキーの出現位置、となる ※ 先頭のキーのID値は0となる
・数千万程度のキーセットをCommon Lispで比較的手軽に扱えるようにするのが目的
・2~4GBのメモリを積んでいる32bitマシンで
[バージョン]
・0.3.2
[依存パッケージ]
・dict-0.2.0 ※ cl-dawgプロジェクト内に組み込まれている (lib/dict-0.2.0)
・ポータブルなハッシュテーブル
・https://github.com/sile/dict
[インストール]
> (require :asdf)
> (require :asdf-install)
> (asdf-install:install "cl-dawg-VERSION.tar.gz")
[API]
###
# dawg
メインパッケージ
####
# dawg:build (&key input output byte-order show-progress) => t
キーセットファイル※1からDAWGインデックスファイル※2を作成する。
= input: 入力キーセットファイルのパス名 or キーセットが格納されたリスト (必須)
= output: 出力DAWGインデックスファイルのパス名 (必須)
= byte-order: インデックスファイルのバイトオーダーを指定する。:native or :big or :little
デフォルトは :native
= show-progress: 作成時の進捗表示を行うかどうか。デフォルトはnil
※1: キーセットが昇順に改行区切りで格納されているファイル
※2: 正確にはDAWGをDoubleArray形式で保存したインデックスファイル
####
# dawg:load (index-path &key byte-order) => dawg:dawg
DAWGインデックスファイルからDAWG(DoubleArray形式)を読み込む。
= index-path: build関数で作成したDAWGインデックスファイル
= byte-order: インデックスファイルのバイトオーダーを指定する。:native or :big or :little
デフォルトは :native
###
# dawg:member? (key dawg &key start end) => boolean
キーがDAWGに含まれているかどうかを判定する。
= key: 対象のキー文字列。(simple-array character)型でなければならない
= dawg: DAWG
= start: キー文字列内の開始位置
= end: キー文字列内の終端位置
###
# dawg:get-id (key dawg &key start end) => (or null fixnum)
キーに紐付くIDを取得する。
キーがDAWG内に存在しない場合はnilを返す。
= key: 対象のキー文字列。(simple-array character)型でなければならない
= dawg: DAWG
= start: キー文字列内の開始位置
= end: キー文字列内の終端位置
###
# dawg:each-common-prefix ((match-id match-end)
(key dawg &key start end)
&body body)
入力キーに対して共通接頭辞検索を行う。
入力キーの接頭辞部分にマッチするDAWG内の各キーに対して、body部分の処理が実行される。
※ return関数を使うことで、途中でループを抜けることが可能
= match-id: 入力キーの接頭辞部分にマッチしたキーのID値
= match-end: 入力キー内のマッチした部分の終端位置
= key: 入力キー文字列。(simple-array character)型でなければならない
= start: キー文字列内の開始位置
= end: キー文字列内の終端位置
= body: マッチの度に実行される式
###
# dawg:each-predictive ((match-id)
(key dawg &key start end)
&body body)
入力キーが接頭辞となる全ての要素を走査する。
各走査で要素のIDを受け取り、body部分の処理が実行される。
※ return関数を使うことで、途中でループを抜けることが可能
= match-id: 入力キーが接頭辞となる要素のID値
= key: 入力キー文字列。(simple-array character)型でなければならない
= start: キー文字列内の開始位置
= end: キー文字列内の終端位置
= body: マッチの度に実行される式
[注意事項]
・DAWGのキー内の文字にヌル文字を含めることは出来ない
・DoubleArray中で(CHECK配列の初期値として)特別扱いしているため