class Lingo::Attendee::Variator

Der Variator ermöglicht bei nicht erkannten Wörtern den listenbasierten Austausch einzelner Wortteile einchließlich erneuter Wörterbuchsuche zur Verbesserung der Worterkennungsquote.

Ursprünglich wurde der Variator entwickelt, um die mangelnde Qualität bei der OCR-Erkennung altdeutscher ‘s’-Konsonanten zu optimieren. Er kann ebenso bei alternativen Umlautschreibweisen z.B. zur Wandlung von ‘Koeln’ in ‘Köln’ dienen.

Mögliche Verlinkung

Erwartet

Daten vom Typ Word (andere werden einfach durchgereicht) z.B. von Wordsearcher

Erzeugt

Daten vom Typ Word zur Weiterleitung z.B. an Synonymer, Decomposer, Multiworder, Sequencer, Noneword_filter oder Vector_filter

Parameter

Kursiv dargestellte Parameter sind optional (ggf. mit Angabe der Voreinstellung). Alle anderen Parameter müssen zwingend angegeben werden.

in

siehe allgemeine Beschreibung des Attendee

out

siehe allgemeine Beschreibung des Attendee

source

siehe allgemeine Beschreibung des Dictionary

mode

(Standard: all) siehe allgemeine Beschreibung des Dictionary

^check

(Standard: WA_UNKNOWN) Gebrenzt die zu variierenden Worttypen

marker

(Standard: ‘*’) Kennzeichnung durch Variation erkannter Wörter

max-var

(Standard: ‘10000’) Begrenzung der maximal zu prüfenden Permutationen bei der vollständigen Kombination aller auf ein Wort anzuwendenen aufgelisteten Wortteile.

Beispiele

Bei der Verarbeitung einer normalen Textdatei mit der Ablaufkonfiguration t1.cfg

meeting:
  attendees:
    - text_reader:   { out: lines, files: '$(files)' }
    - tokenizer:     { in: lines, out: token }
    - word_searcher: { in: abbrev, out: words, source: 'sys-dic' }
    - variator:      { in: words, out: varios, source: 'sys-dic' }
    - debugger:      { in: varios, prompt: 'out>' }

ergibt die Ausgabe über den Debugger: lingo -c t1 test.txt

out> *FILE('test.txt')
out> <*Dies = [(dies/w)]>
out> <*ist = [(ist/t)]>
out> <ein = [(ein/t)]>
out> <*Tisch = [(tisch/s)]>
out> :./PUNC:
out> *EOL('test.txt')
out> *EOF('test.txt')

Protected Instance Methods

control(cmd, param) click to toggle source
# File lib/lingo/attendee/variator.rb, line 91
def control(cmd, param)
  report_on(cmd, @dic, @gra)
end
init() click to toggle source
# File lib/lingo/attendee/variator.rb, line 76
def init
  @marker = get_key('marker', '*')
  @max    = get_key('max-var', max = 10000).to_i
  @max    = max unless @max > 0
  @var    = get_key('variations')

  raise MissingConfigError.new(:variations) if @var.empty?

  @check = Hash.new(false)
  get_array('check', WA_UNKNOWN).each { |s| @check[s.upcase] = true }

  set_dic
  set_gra
end
process(obj) click to toggle source
# File lib/lingo/attendee/variator.rb, line 95
def process(obj)
  if obj.is_a?(Word) && @check[obj.attr]
    inc('Anzahl gesuchter Wörter')

    @var.each_with_object([obj.form]) { |a, v| variate(v, *a) }.
      tap { |v| v.slice!(@max..-1) }.each { |var|
      next if (word = find_word(var)).unknown? || (
        word.attr == WA_COMPOUND && word.lexicals.any? { |lex|
          lex.attr.start_with?(LA_TAKEITASIS)
        }
      )

      inc('Anzahl gefundener Wörter')
      return forward(word.tap { word.form = @marker + var })
    }
  end

  forward(obj)
end

Private Instance Methods

variate(variations, from, to) click to toggle source

Variiere die Bestandteile eines Arrays gemäß den Austauschvorgaben.

variate( ‘Tiieh’, ‘ieh’, ‘sch’ ) => [‘Tiieh’, ‘Tisch’]

# File lib/lingo/attendee/variator.rb, line 120
def variate(variations, from, to)
  add, change, re = [], [from, to], Regexp.new(from)

  variations.each { |form|
    parts = " #{form} ".split(re)

    1.upto(2 ** (n = parts.size - 1) - 1) { |i|
      var = parts.first
      1.upto(n) { |j| var += change[i[j - 1]] + parts[j] }
      add << var.strip
    }
  }

  variations.concat(add)
end