Class: Utanone::Uta

Inherits:
Object
  • Object
show all
Defined in:
lib/utanone/uta.rb

Constant Summary collapse

EXCLUDING_COUNTING_RUBY_BY_TANKA =
/ァ|ィ|ォ|ャ|ュ|ョ/
EXCLUDING_COUNTING_LEXICAL_CATEGORIES =
%w[記号].freeze
HIRAGANA_AND_KATAKANA =
/\A[ぁ-んァ-ヶー-]+\z/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(str, ref_uta = nil) ⇒ Uta

Returns a new instance of Uta.



13
14
15
16
# File 'lib/utanone/uta.rb', line 13

def initialize(str, ref_uta = nil)
  @original_str = str
  @parsed_morphemes = parse_to_hash(str, ref_uta)
end

Instance Attribute Details

#original_strObject (readonly)

Returns the value of attribute original_str.



7
8
9
# File 'lib/utanone/uta.rb', line 7

def original_str
  @original_str
end

#parsed_morphemesObject (readonly)

Returns the value of attribute parsed_morphemes.



7
8
9
# File 'lib/utanone/uta.rb', line 7

def parsed_morphemes
  @parsed_morphemes
end

Instance Method Details

#correct(correct_yomigana:) ⇒ Object

rubocop:disable Metrics/AbcSize



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/utanone/uta.rb', line 36

def correct(correct_yomigana:) # rubocop:disable Metrics/AbcSize
  converted_correct_yomigana = convert_kana(correct_yomigana)
  return self if yomigana == converted_correct_yomigana

  # 訂正したよみがなで再作成したUtaインスタンスを作成するので、一旦コピーする
  corrected_uta = Uta.new(@original_str)

  corrected_uta.parsed_morphemes.each_with_index do |morpheme, i|
    # 形態素ごとによみがなの修正が必要であれば修正する
    if converted_correct_yomigana[0, morpheme[:ruby].size] == morpheme[:ruby]
      # よみがなが一致したらそのまま処理を続行する
      # 比較したよみがな部分は訂正済みよみがなから削除する
      converted_correct_yomigana.slice!(0, morpheme[:ruby].size)
      next
    else
      # よみがなが不一致なら修正する
      next_morpheme = corrected_uta.parsed_morphemes[i + 1]
      if next_morpheme
        # 修正済みよみがなから次の形態素に一致する箇所を探すことで修正したい形態素のよみがなを取得する
        next_morpheme_start = converted_correct_yomigana.index(next_morpheme[:ruby])

        # 一致箇所がなければ修正ができないものとして処理を中断する(よみがな不一致が連続すると修正できない)
        # TODO: 再帰を使って連続したよみがな不一致も修正できないか
        break unless next_morpheme_start

        # 取得できた場合は修正する
        morpheme[:ruby] = converted_correct_yomigana[0, next_morpheme_start]
        converted_correct_yomigana.slice!(0, morpheme[:ruby].size)
      else
        # 最後の形態素だった時
        morpheme[:ruby] = converted_correct_yomigana
      end
    end
  end
  corrected_uta
end

#count(tanka: false) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/utanone/uta.rb', line 22

def count(tanka: false)
  words_hash_without_symbol = @parsed_morphemes.reject{ Utanone::Uta::EXCLUDING_COUNTING_LEXICAL_CATEGORIES.include?(_1[:lexical_category]) }
  count_size = 0
  words_hash_without_symbol.each do |h|
    if tanka
      # tanka オプションを入れた場合は ァ|ィ|ォ|ャ|ュ|ョ は音数に数えない
      count_size += h[:ruby].size - h[:ruby].scan(Utanone::Uta::EXCLUDING_COUNTING_RUBY_BY_TANKA).size
    else
      count_size += h[:ruby].size
    end
  end
  count_size
end

#yomiganaObject



18
19
20
# File 'lib/utanone/uta.rb', line 18

def yomigana
  @parsed_morphemes.map { _1[:ruby] }.join
end