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

 // 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 Classes
    Modifier and Type
    Class
    Description
    static enum 
    距離タイプを定義する列挙型。 距離を測定する方法を選択するために使用します。 例: 編集距離(EDIT_DISTANCE)または貪欲距離(GREEDY_DISTANCE)。
    static enum 
    検索モードを定義する列挙型。 検索の際に使用するモードを選択するために使用します。 例: 部分一致(SUBSTRING)、前方一致(PREFIX)、後方一致(SUFFIX)。
    static enum 
    重みの種類を定義する列挙型。 距離の計算に使用する重み付けの種類を選択するために使用します。 例: 重みなし(DISABLED)、デフォルト(DEFAULT)、Neural Network距離(NN_DISTANCE)。
  • Constructor Summary

    Constructors
    Constructor
    Description
    コンストラクタ
  • Method Summary

    Modifier and Type
    Method
    Description
    float
    calcSimilarity(String a, String b, boolean normalized)
    2つの文字列間の類似度を計算する 類似度は次の式で計算されます:
    calcSimilarityWithMasterData(String a, boolean parallel, boolean normalized)
    文字列とマスターデータ間の類似度を計算する
    void
    デストラクタ
    void
    loadMasterData(String[] masterData)
    マスターデータを読み込む
    void
    ファイルから重みデータを読み込む

    Methods inherited from class java.lang.Object

    equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • FuzzySearch

      public FuzzySearch(FuzzySearch.DistanceType distType, FuzzySearch.SearchMode mode, int size)
      コンストラクタ
      Parameters:
      distType - 距離の種類
      mode - 検索モード
      size - GreedyDistance に使用するマッチングのサイズ
  • 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"` が返されます。