Class FuzzySearch

java.lang.Object
com.nefrock.edgeocr.FuzzySearch

public class FuzzySearch extends Object
このクラスは、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には最も類似するマスターデータの文字列とその類似度が格納される
 
  • Constructor Details

    • FuzzySearch

      public FuzzySearch(FuzzySearch.DistanceType distType, FuzzySearch.SearchMode mode, int size)
      コンストラクタ
      Parameters:
      distType - 距離の種類
      mode - 検索モード
      size - GreedyDistance に使用するマッチングのサイズ
    • FuzzySearch

      public FuzzySearch(FuzzySearch.DistanceType distType, FuzzySearch.SearchMode mode, int size, boolean ignoreCase)
      コンストラクタ
      Parameters:
      distType - 距離の種類
      mode - 検索モード
      size - GreedyDistance に使用するマッチングのサイズ
      ignoreCase - 大文字小文字を区別するかどうか
    • FuzzySearch

      public FuzzySearch(FuzzySearch.DistanceType distType, FuzzySearch.SearchMode mode, int size, boolean ignoreCase, int maxCandidates)
      コンストラクタ
      Parameters:
      distType - 距離の種類
      mode - 検索モード
      size - GreedyDistance に使用するマッチングのサイズ
      ignoreCase - 大文字小文字を区別するかどうか
      maxCandidates - 最大候補数
  • Method Details

    • dropFuzzySearch

      public void dropFuzzySearch()
      デストラクタ
    • loadWeight

      public void loadWeight(FuzzySearch.WeightType type) throws EdgeError
      ファイルから重みデータを読み込む
      Parameters:
      type - 重みの名前
      Throws:
      EdgeError - 重みデータの読み込みに失敗した場合
    • calcSimilarity

      public float calcSimilarity(String a, String b, boolean normalized)
      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

      public void loadMasterData(String[] masterData) throws EdgeError
      マスターデータを読み込む
      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"` が返されます。