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", true);
// 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 class距離計算に使用するアルゴリズムとそのパラメータをまとめた設定クラスです。static enum検索モードを定義する列挙型。 検索の際に使用するモードを選択するために使用します。 例: 部分一致(SUBSTRING)、前方一致(PREFIX)、後方一致(SUFFIX)。static enum重みの種類を定義する列挙型。 距離の計算に使用する重み付けの種類を選択するために使用します。 例: 重みなし(DISABLED)、デフォルト(DEFAULT)、Neural Network距離(NN_DISTANCE)。 -
Constructor Summary
ConstructorsConstructorDescriptionコンストラクタFuzzySearch(FuzzySearch.DistanceTypeConfig config, boolean ignoreCase) コンストラクタFuzzySearch(FuzzySearch.DistanceTypeConfig config, boolean ignoreCase, int maxCandidates) コンストラクタFuzzySearch(FuzzySearch.DistanceType distType, FuzzySearch.SearchMode mode, int size) Deprecated.FuzzySearch(FuzzySearch.DistanceType distType, FuzzySearch.SearchMode mode, int size, boolean ignoreCase) Deprecated.FuzzySearch.DistanceTypeConfigを使用するコンストラクタを利用してください。 例:new FuzzySearch(DistanceTypeConfig.editDistance(), true)FuzzySearch(FuzzySearch.DistanceType distType, FuzzySearch.SearchMode mode, int size, boolean ignoreCase, int maxCandidates) Deprecated.FuzzySearch.DistanceTypeConfigを使用するコンストラクタを利用してください。 例:new FuzzySearch(DistanceTypeConfig.greedyDistance(SearchMode.PREFIX, 3), true, 5) -
Method Summary
Modifier and TypeMethodDescriptioncalcSimilaritiesWithMasterData(String a, boolean parallel, boolean normalized) 文字列とマスターデータ間の類似度を計算するfloatcalcSimilarity(String a, String b, boolean normalized) 2つの文字列間の類似度を計算する 類似度は次の式で計算されます:calcSimilarityWithMasterData(String a, boolean parallel, boolean normalized) 文字列とマスターデータ間の類似度を計算するvoidデストラクタvoidloadMasterData(String[] masterData) マスターデータを読み込むvoidファイルから重みデータを読み込む
-
Constructor Details
-
FuzzySearch
コンストラクタ- Parameters:
config- 距離タイプの設定
-
FuzzySearch
コンストラクタ- Parameters:
config- 距離タイプの設定ignoreCase- 大文字小文字を区別するかどうか
-
FuzzySearch
コンストラクタ- Parameters:
config- 距離タイプの設定ignoreCase- 大文字小文字を区別するかどうかmaxCandidates- 最大候補数
-
FuzzySearch
@Deprecated public FuzzySearch(FuzzySearch.DistanceType distType, FuzzySearch.SearchMode mode, int size) Deprecated.FuzzySearch.DistanceTypeConfigを使用するコンストラクタを利用してください。 例:new FuzzySearch(DistanceTypeConfig.editDistance())またはnew FuzzySearch(DistanceTypeConfig.greedyDistance(SearchMode.SUBSTRING, 3))コンストラクタ注意:
distTypeがFuzzySearch.DistanceType.EDIT_DISTANCEの場合、modeとsizeは無視されます。 代わりにFuzzySearch.DistanceTypeConfigを使用するコンストラクタの利用を推奨します。- Parameters:
distType- 距離の種類mode- 検索モード(EditDistanceの場合は無視される)size- GreedyDistance に使用するマッチングのサイズ(EditDistanceとGreedyDistanceのExactモードの場合は無視される)
-
FuzzySearch
@Deprecated public FuzzySearch(FuzzySearch.DistanceType distType, FuzzySearch.SearchMode mode, int size, boolean ignoreCase) Deprecated.FuzzySearch.DistanceTypeConfigを使用するコンストラクタを利用してください。 例:new FuzzySearch(DistanceTypeConfig.editDistance(), true)コンストラクタ注意:
distTypeがFuzzySearch.DistanceType.EDIT_DISTANCEの場合、modeとsizeは無視されます。 代わりにFuzzySearch.DistanceTypeConfigを使用するコンストラクタの利用を推奨します。- Parameters:
distType- 距離の種類mode- 検索モード(EditDistanceの場合は無視される)size- GreedyDistance に使用するマッチングのサイズ(EditDistanceとGreedyDistanceのExactモードの場合は無視される)ignoreCase- 大文字小文字を区別するかどうか
-
FuzzySearch
@Deprecated public FuzzySearch(FuzzySearch.DistanceType distType, FuzzySearch.SearchMode mode, int size, boolean ignoreCase, int maxCandidates) Deprecated.FuzzySearch.DistanceTypeConfigを使用するコンストラクタを利用してください。 例:new FuzzySearch(DistanceTypeConfig.greedyDistance(SearchMode.PREFIX, 3), true, 5)コンストラクタ注意:
distTypeがFuzzySearch.DistanceType.EDIT_DISTANCEの場合、modeとsizeは無視されます。 代わりにFuzzySearch.DistanceTypeConfigを使用するコンストラクタの利用を推奨します。- Parameters:
distType- 距離の種類mode- 検索モード(EditDistanceの場合は無視される)size- GreedyDistance に使用するマッチングのサイズ(EditDistanceの場合は無視される)ignoreCase- 大文字小文字を区別するかどうかmaxCandidates- 最大候補数
-
-
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"` が返されます。
-
calcSimilaritiesWithMasterData
public List<FuzzySearchResult> calcSimilaritiesWithMasterData(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"` が返されます。
-
FuzzySearch.DistanceTypeConfigを使用するコンストラクタを利用してください。 例:new FuzzySearch(DistanceTypeConfig.editDistance())またはnew FuzzySearch(DistanceTypeConfig.greedyDistance(SearchMode.SUBSTRING, 3))