class TextDetector::Detector::Simple

BM法っぽく(トライ木を調べてる時に見かけた実装を参考に)

Public Instance Methods

detect(text) click to toggle source
# File lib/text_detector/detector/simple.rb, line 7
def detect(text)
  detect_n(text, 1).first
end
detect_all(text) click to toggle source
# File lib/text_detector/detector/simple.rb, line 11
def detect_all(text)
  detect_n(text)
end

Private Instance Methods

detect_n(text, limit = nil) click to toggle source
# File lib/text_detector/detector/simple.rb, line 17
def detect_n(text, limit = nil)
  results = []
  original = text
  text = TextDetector.normalize(original)

  # 0文字目から末尾の一つ前まで一文字ずつ始点を移動していく
  0.upto(text.size - 1) do |start|
    # 語の長さ配列から切り出し文字数を取り出していく
    dictionary.depth.each do |size|
      target = text[start, size]
      # 切り出した文字列の長さが、切り出し分より短ければ次のターン
      break if size > target.size

      # 切り出した文字列が辞書に含まれていれば記録
      results << original[start, size] if dictionary.lookup(target)

      # 制限数までヒットしたら探索終了
      return results if limit && results.size == limit
    end
  end

  results
end