メインコンテンツまでスキップ

FuzzyBeamSearch API ガイド

このページでは、EdgeOCRExtensionsFuzzyBeamSearch API を使って辞書データに対するあいまい文字列マッチングを行う方法を説明します。

API リファレンス

詳細な API 仕様は Swift API リファレンス / Kotlin API リファレンス を参照してください。

FuzzyBeamSearch API 概要

  1. 検索モード(substring / prefix / suffix)を指定して FuzzyBeamSearch インスタンスを生成します。
  2. load() で辞書データを読み込みます。
  3. match() に入力文字列とパラメータを渡してあいまいマッチングを実行します。
  4. 返却される Candidate のリストからマッチしたテキスト・コスト・位置情報を取得します。

1. 初期化して辞書をロードする

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
}
  • SearchMode / ScanMode — 検索モードを指定します。
    • substring — 入力の部分文字列に対してマッチングします。先頭・末尾のノイズを許容します。
    • prefix — 入力の先頭からマッチングします。
    • suffix — 入力の末尾からマッチングします。
  • dictionaryPath — 辞書ファイル(.txt)が格納されたディレクトリのパスを指定します。

2. マッチングを実行する

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)

match() に入力文字列と Params を渡すとマッチング結果が Candidate のリストで返ります。パラメータはすべてデフォルト値を持つため、調整が不要な場合はそのまま使えます。

主要パラメータ

パラメータデフォルト値説明
subCost0.7文字置換のコスト
delCost0.35文字削除のコスト
insCost0.35文字挿入のコスト
beamWidth400ビームサーチの幅。大きいほど精度が上がるが遅くなる
topK10返却する候補数の上限
earlyStopOnTermtrue辞書の終端ノードに到達した時点で候補を確定する
tailDeleteCost0.0終端以降の余剰入力1文字あたりのコスト
maxExtraSteps128入力長を超えて探索する追加ステップ数

substring モード用パラメータ

パラメータデフォルト値説明
startSkipMax32先頭でスキップ可能な最大文字数
startDelCost0.0先頭スキップ1文字あたりのコスト(0.0 で無料)
keepOnePrefixChartrue少なくとも1文字は先頭を残す
tailSkipMax32末尾ノイズのペナルティ上限

3. 結果を使う

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))")
}

match() が返す Candidate のリストはコスト昇順(最も類似度が高い順)でソートされています。各 Candidate は以下のプロパティを持ちます。

  • text — マッチした辞書エントリのテキスト
  • cost — マッチングコスト(0.0 に近いほど類似度が高い)
  • startIndex — 入力文字列中のマッチ開始位置
  • endIndex — 入力文字列中のマッチ終了位置

candidates が空の場合は辞書に一致するエントリが見つからなかったことを示します。beamWidth を大きくするか、コストパラメータを調整してください。