FuzzyBeamSearch API ガイド
このページでは、EdgeOCRExtensions の FuzzyBeamSearch API を使って辞書データに対するあいまい文字列マッチングを行う方法を説明します。
API リファレンス
詳細な API 仕様は Swift API リファレンス / Kotlin API リファレンス を参照してください。
FuzzyBeamSearch API 概要
- 検索モード(
substring/prefix/suffix)を指定してFuzzyBeamSearchインスタンスを生成します。 load()で辞書データを読み込みます。match()に入力文字列とパラメータを渡してあいまいマッチングを実行します。- 返却される
Candidateのリストからマッチしたテキスト・コスト・位置情報を取得します。
1. 初期化して辞書をロードする
- iOS (Swift)
- Android (Kotlin)
import EdgeOCRExtensions
func loadFuzzyBeamSearch() -> FuzzyBeamSearch {
// 検索モードを指定してインスタンスを生成する
let fbs = FuzzyBeamSearch(.substring)
// 辞書データを読み込む
guard fbs.load(dictionaryPath) else {
fatalError("Failed to load dictionary")
}
// ロード後の状態を確認する
guard fbs.isLoaded() else {
fatalError("FuzzyBeamSearch is not ready")
}
print("Dictionary size: \(fbs.getDictionarySize())")
return fbs
}
import com.nefrock.edgevision.fuzzy.beamsearch.FuzzyBeamSearch
fun loadFuzzyBeamSearch(dictionaryPath: String): FuzzyBeamSearch {
// 検索モードを指定してインスタンスを生成する
val fbs = FuzzyBeamSearch(
mode = FuzzyBeamSearch.ScanMode.Substring,
)
// 辞書データを読み込む
check(fbs.load(dictionaryPath)) { "Failed to load dictionary" }
// ロード後の状態を確認する
check(fbs.isLoaded()) { "FuzzyBeamSearch is not ready" }
println("Dictionary size: ${fbs.getDictionarySize()}")
return fbs
}
SearchMode/ScanMode— 検索モードを指定します。substring— 入力の部分文字列に対してマッチングします。先頭・末尾のノイズを許容します。prefix— 入力の先頭からマッチングします。suffix— 入力の末尾からマッチングします。
dictionaryPath— 辞書ファイル(.txt)が格納されたディレクトリのパスを指定します。
2. マッチングを実行する
- iOS (Swift)
- Android (Kotlin)
import EdgeOCRExtensions
// パラメータを設定する
let params = FuzzyBeamSearch.Params()
params.subCost = 0.7 // 置換コスト
params.delCost = 0.35 // 削除コスト
params.insCost = 0.35 // 挿入コスト
params.beamWidth = 400 // ビーム幅
params.topK = 10 // 返却する候補数の上限
// あいまいマッチングを実行する
let candidates = fbs.match(inputText, params: params)
import com.nefrock.edgevision.fuzzy.beamsearch.FuzzyBeamSearch
// パラメータを設定する
val params = FuzzyBeamSearch.Params().apply {
subCost = 0.7f // 置換コスト
delCost = 0.35f // 削除コスト
insCost = 0.35f // 挿入コスト
beamWidth = 400 // ビーム幅
topK = 10 // 返却する候補数の上限
}
// あいまいマッチングを実行する
val candidates = fbs.match(inputText, params)
match() に入力文字列と Params を渡すとマッチング結果が Candidate のリストで返ります。パラメータはすべてデフォルト値を持つため、調整が不要な場合はそのまま使えます。
主要パラメータ
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
subCost | 0.7 | 文字置換のコスト |
delCost | 0.35 | 文字削除のコスト |
insCost | 0.35 | 文字挿入のコスト |
beamWidth | 400 | ビームサーチの幅。大きいほど精度が上がるが遅くなる |
topK | 10 | 返却する候補数の上限 |
earlyStopOnTerm | true | 辞書の終端ノードに到達した時点で候補を確定する |
tailDeleteCost | 0.0 | 終端以降の余剰入力1文字あたりのコスト |
maxExtraSteps | 128 | 入力長を超えて探索する追加ステップ数 |
substring モード用パラメータ
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
startSkipMax | 32 | 先頭でスキップ可能な最大文字数 |
startDelCost | 0.0 | 先頭スキップ1文字あたりのコスト(0.0 で無料) |
keepOnePrefixChar | true | 少なくとも1文字は先頭を残す |
tailSkipMax | 32 | 末尾ノイズのペナルティ上限 |
3. 結果を使う
- iOS (Swift)
- Android (Kotlin)
for candidate in candidates {
print("text: \(candidate.text)")
print("cost: \(candidate.cost)")
print("range: \(candidate.startIndex)..\(candidate.endIndex)")
}
// 最もコストが低い(最も類似度が高い)候補を使う
if let best = candidates.first {
print("Best match: \(best.text) (cost: \(best.cost))")
}
for (candidate in candidates) {
println("text: ${candidate.text}")
println("cost: ${candidate.cost}")
println("range: ${candidate.startIndex}..${candidate.endIndex}")
}
// 最もコストが低い(最も類似度が高い)候補を使う
candidates.firstOrNull()?.let { best ->
println("Best match: ${best.text} (cost: ${best.cost})")
}
match() が返す Candidate のリストはコスト昇順(最も類似度が高い順)でソートされています。各 Candidate は以下のプロパティを持ちます。
text— マッチした辞書エントリのテキストcost— マッチングコスト(0.0 に近いほど類似度が高い)startIndex— 入力文字列中のマッチ開始位置endIndex— 入力文字列中のマッチ終了位置
candidates が空の場合は辞書に一致するエントリが見つからなかったことを示します。beamWidth を大きくするか、コストパラメータを調整してください。