Package com.nefrock.edgeocr
Class FuzzySearch
java.lang.Object
com.nefrock.edgeocr.FuzzySearch
このクラスは、2つの文字列間の距離を計算し、その類似度を評価するためのクラスです。
距離は、編集距離または貪欲距離のいずれかを使用して計算されます。
編集距離は、Levenshteinのアルゴリズムを使用して計算されます。
また、重み付けされた距離の計算や、マスターデータとの比較機能も提供します。
使用例:
// インスタンスを作成 FuzzySearch fs = new FuzzySearch("greedy_distance", "substring", 100); // 編集距離計算のために重みをロード fs.loadWeight("radical_distance"); // 2つの文字列間の類似度を計算 double similarity = ds.calcSimilarity("文字列A", "文字列B"); // マスターデータをロードして類似度を計算 String[] masterData = { "文字列A", "文字列B", "文字列C" }; ed.loadMasterData(masterData); FuzzySearchResult result = fs.calcSimilarityWithMasterData("クエリ文字列", true); // resultには最も類似するマスターデータの文字列とその類似度が格納される
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic enum
距離タイプを定義する列挙型。 距離を測定する方法を選択するために使用します。 例: 編集距離(EDIT_DISTANCE)または貪欲距離(GREEDY_DISTANCE)。static enum
検索モードを定義する列挙型。 検索の際に使用するモードを選択するために使用します。 例: 部分一致(SUBSTRING)、前方一致(PREFIX)、後方一致(SUFFIX)。static enum
重みの種類を定義する列挙型。 距離の計算に使用する重み付けの種類を選択するために使用します。 例: 重みなし(DISABLED)、デフォルト(DEFAULT)、Neural Network距離(NN_DISTANCE)。 -
Constructor Summary
ConstructorsConstructorDescriptionFuzzySearch
(FuzzySearch.DistanceType distType, FuzzySearch.SearchMode mode, int size) コンストラクタ -
Method Summary
Modifier and TypeMethodDescriptionfloat
calcSimilarity
(String a, String b, boolean normalized) 2つの文字列間の類似度を計算する 類似度は次の式で計算されます:calcSimilarityWithMasterData
(String a, boolean parallel, boolean normalized) 文字列とマスターデータ間の類似度を計算するvoid
デストラクタvoid
loadMasterData
(String[] masterData) マスターデータを読み込むvoid
ファイルから重みデータを読み込む
-
Constructor Details
-
FuzzySearch
コンストラクタ- Parameters:
distType
- 距離の種類mode
- 検索モードsize
- GreedyDistance に使用するマッチングのサイズ
-
-
Method Details
-
dropFuzzySearch
public void dropFuzzySearch()デストラクタ -
loadWeight
ファイルから重みデータを読み込む- Parameters:
type
- 重みの名前- Throws:
EdgeError
- 重みデータの読み込みに失敗した場合
-
calcSimilarity
2つの文字列間の類似度を計算する 類似度は次の式で計算されます:similarity = 1 - levenstein_distance / max(a.length(), b.length())
- Parameters:
a
- 1つ目の文字列b
- 2つ目の文字列normalized
- 類似度を正規化するかどうか(デフォルトは true)- Returns:
- 2つの文字列間の類似度
FuzzySearch fs = new FuzzySearch(); double dist = fs.calcSimilarity("ポテトサラダ混合 (321野菜)", "ポテトサラダ混合 (321野菜)"); // => 0.9375
-
loadMasterData
マスターデータを読み込む- Parameters:
masterData
- 文字列の配列- Throws:
EdgeError
- マスターデータの読み込みに失敗した場合
-
calcSimilarityWithMasterData
public FuzzySearchResult calcSimilarityWithMasterData(String a, boolean parallel, boolean normalized) 文字列とマスターデータ間の類似度を計算する- Parameters:
a
- クエリ文字列parallel
- 並列処理を使用するかどうかnormalized
- 類似度を正規化するかどうか- Returns:
- 最も類似する文字列とその類似度
String[] masterData = { "たまごフィリング", "ミックスハムスライス", "ポテトサラダ混合 (321野菜)" }; FuzzySearch fs = new FuzzySearch(); ed.loadMasterData(masterData); ed.loadWeight(WightType.DEFAULT); FuzzySearchResult result = fs.calcSimilarityWithMasterData("ポテトサラダ混含 (321野菜)", true); // => ("ポテトサラダ混合 (321野菜)", 0.984375)
クエリ文字列に対して、文字列の類似度が同一の文字列がマスターデータに存在する場合はマスターデータの最後の文字列が返されます。 つまり、マスターデータが `["abc", "abd"]` でクエリ文字列が `"ab"` の場合、`"abd"` が返されます。 加えて、貪欲距離の場合は文字列の長さが長い方が返されます。 つまり、マスターデータが `["abc", "abcd"]` でクエリ文字列が `"abc"` の場合、`"abcd"` が返されます。
-