Module: JLPT::Grammar

Defined in:
lib/jlpt/analyzers/grammar.rb

Overview

JLPT Grammar Pattern Detection Engine.

Recognizes Japanese grammar constructions across levels N5 to N1.

Constant Summary collapse

PATTERNS =
[
  { pattern: /てはいけない|てはならない/, level: :n5, name: '〜てはいけない' },
  { pattern: /てください|てくださいませんか/, level: :n5, name: '〜てください' },
  { pattern: /なければならない|なければいけない/, level: :n5, name: '〜なければならない' },
  { pattern: /ことができる|ことができない/, level: :n4, name: '〜ことができる' },
  { pattern: /ようになっている/, level: :n4, name: '〜ようになっている' },
  { pattern: /わけがない|わけではない/, level: :n3, name: '〜わけがない' },
  { pattern: /に違いない/, level: :n2, name: '〜に違いない' },
  { pattern: /ざるを得ない/, level: :n1, name: '〜ざるを得ない' }
].freeze

Class Method Summary collapse

Class Method Details

.breakdown(text) ⇒ Hash{Symbol => Array<String>}

Breakdown of detected grammar patterns by JLPT level

Parameters:

  • text (String)

    Japanese text

Returns:

  • (Hash{Symbol => Array<String>})


38
39
40
41
42
43
44
45
46
47
# File 'lib/jlpt/analyzers/grammar.rb', line 38

def breakdown(text)
  extracted = extract(text)
  res = { n5: [], n4: [], n3: [], n2: [], n1: [] }

  extracted.each do |g|
    lvl = g[:level]
    res[lvl] << g[:name] if res.key?(lvl)
  end
  res
end

.extract(text) ⇒ Array<Hash>

Detect grammar patterns in text

Parameters:

  • text (String)

    Japanese text

Returns:

  • (Array<Hash>)

    array of detected grammar hashes



25
26
27
28
29
30
31
32
# File 'lib/jlpt/analyzers/grammar.rb', line 25

def extract(text)
  cleaned = Preprocessor.clean(text)
  return [] if cleaned.empty?

  PATTERNS.filter_map do |rule|
    { name: rule[:name], level: rule[:level], pattern: rule[:pattern] } if cleaned.match?(rule[:pattern])
  end
end