Class: Vangrail::Rails::Alignment
- Inherits:
-
Vangrail::Rail
- Object
- Vangrail::Rail
- Vangrail::Rails::Alignment
- Defined in:
- lib/vangrail/rails/alignment.rb
Overview
Catches the injection whose concepts are in the right order but too far apart for the pair window.
Rails::Paraphrase matches two concepts inside a short token window. That is the right rule for a clause, and it is the wrong rule for "Ignore, once you have loaded the module the reservation policy describes, every previous instruction": the override and the instruction are one statement with an adjunct in the middle, and the window treats them as two. Smith and Waterman (1981) local alignment over the concept stream is the standard way to match a short sequence with a gap.
Templates are three concepts, not two. The pair rail already owns the close case. Last occurrence of each template concept, in order, with a coordinator between them treated as two statements, is what a window of six cannot be. Ordered, so "follow the guidance and ignore stale copies" still does not match. Extra copies of :instruction (a "policy" mentioned mid-clause) do not steal the object.
Not in the evidence table until it is measured on the same 270/48 texts as the others. Engine#assess will not treat it as a term.
Constant Summary collapse
- TEMPLATES =
[ { label: 'instruction_override', concepts: %i[override totality instruction] }, { label: 'instruction_override', concepts: %i[override totality prior] }, { label: 'prompt_disclosure', concepts: %i[reveal self secret] }, ].freeze
Instance Attribute Summary collapse
-
#languages ⇒ Object
readonly
Returns the value of attribute languages.
-
#templates ⇒ Object
readonly
Returns the value of attribute templates.
Instance Method Summary collapse
- #cache_key(text, _context) ⇒ Object
- #call(text, _context) ⇒ Object
-
#initialize(templates: TEMPLATES, languages: NLP::LANGUAGES, name: 'alignment', sides: %i[input context])) ⇒ Alignment
constructor
A new instance of Alignment.
- #offline? ⇒ Boolean
Constructor Details
#initialize(templates: TEMPLATES, languages: NLP::LANGUAGES, name: 'alignment', sides: %i[input context])) ⇒ Alignment
Returns a new instance of Alignment.
38 39 40 41 42 43 44 45 |
# File 'lib/vangrail/rails/alignment.rb', line 38 def initialize(templates: TEMPLATES, languages: NLP::LANGUAGES, name: 'alignment', sides: %i[input context]) super(name: name, sides: sides) @templates = templates @languages = Array(languages).map(&:to_sym) unknown = @languages - NLP::LANGUAGES raise ArgumentError, "unknown language(s): #{unknown.join(', ')}" unless unknown.empty? end |
Instance Attribute Details
#languages ⇒ Object (readonly)
Returns the value of attribute languages.
36 37 38 |
# File 'lib/vangrail/rails/alignment.rb', line 36 def languages @languages end |
#templates ⇒ Object (readonly)
Returns the value of attribute templates.
36 37 38 |
# File 'lib/vangrail/rails/alignment.rb', line 36 def templates @templates end |
Instance Method Details
#cache_key(text, _context) ⇒ Object
51 52 53 |
# File 'lib/vangrail/rails/alignment.rb', line 51 def cache_key(text, _context) "#{languages.join('+')}\n#{text}" end |
#call(text, _context) ⇒ Object
55 56 57 58 59 60 61 62 63 64 |
# File 'lib/vangrail/rails/alignment.rb', line 55 def call(text, _context) clauses = NLP.clauses(text) hits = NLP.clause_concepts(text, languages: languages).flat_map.with_index do |found, i| clause_hits(found, NLP.words(clauses[i])) end return pass if hits.empty? block(categories: hits.map { |hit| hit[:label] }.uniq, reason: "aligned instruction: #{hits.map { |hit| describe(hit) }.uniq.join('; ')}") end |
#offline? ⇒ Boolean
47 48 49 |
# File 'lib/vangrail/rails/alignment.rb', line 47 def offline? true end |