Class: Lingo::Attendee::MultiWorder

Inherits:
BufferedAttendee show all
Includes:
Lingo::ArrayUtils
Defined in:
lib/lingo/attendee/multi_worder.rb

Overview

– Mit der bisher beschriebenen Vorgehensweise werden die durch den Tokenizer erkannten Token aufgelöst und in Words verwandelt und über den Abbreviator und Decomposer auch Spezialfälle behandelt, die einzelne Wörter betreffen. Um jedoch auch Namen wie z.B. John F. Kennedy als Sinneinheit erkennen zu können, muss eine Analyse über mehrere Objekte erfolgen. Dies ist die Hauptaufgabe des MultiWorders. Der MultiWorder analysiert die Teile des Datenstroms, die z.B. durch Satzzeichen oder weiteren Einzelzeichen (z.B. ‘(’) begrenzt sind. Erkannte Mehrwortgruppen werden als zusätzliches Objekt in den Datenstrom mit eingefügt.

Mögliche Verlinkung

Erwartet

Daten vom Typ Word z.B. von Wordsearcher, Decomposer, Ocr_variator, MultiWorder

Erzeugt

Daten vom Typ Word (mit Attribut WA_MULTIWORD). Je erkannter Mehrwortgruppe wird

ein zusätzliches Word-Objekt in den Datenstrom eingefügt. Z.B. für Ocr_variator, Sequencer, 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

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 }
    - abbreviator:   { in: token, out: abbrev, source: 'sys-abk' }
    - word_searcher: { in: abbrev, out: words, source: 'sys-dic' }
    - decomposer:    { in: words, out: comps, source: 'sys-dic' }
    - multi_worder:  { in: comps, out: multi, source: 'sys-mul' }
    - debugger:      { in: multi, prompt: 'out>' }

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

out> *FILE('test.txt')
out> <Sein = [(sein/s), (sein/v)]>
out> <Name = [(name/s)]>
out> <ist = [(sein/v)]>
out> <johann van siegen|MUL = [(johann van siegen/m)]>
out> <Johann = [(johann/e)]>
out> <van = [(van/w)]>
out> <Siegen = [(sieg/s), (siegen/v), (siegen/e)]>
out> :./PUNC:
out> *EOL('test.txt')
out> *EOF('test.txt')

++

Constant Summary

Constants inherited from Lingo::Attendee

DEFAULT_SKIP, TERMINALS

Constants included from Language

Language::CHAR_PUNCT, Language::LA_SORTORDER, Language::TA_ABBREVIATION, Language::TA_HELP, Language::TA_HTML, Language::TA_NUMBER, Language::TA_OTHER, Language::TA_PUNCTUATION, Language::TA_SKIP, Language::TA_SPACE, Language::TA_URL, Language::TA_WIKI, Language::TA_WORD, Language::WA_COMPOUND, Language::WA_IDENTIFIED, Language::WA_MULTIWORD, Language::WA_SEQUENCE, Language::WA_UNKMULPART, Language::WA_UNKNOWN, Language::WA_UNSET

Instance Attribute Summary

Attributes inherited from Lingo::Attendee

#lingo, #subscribers

Instance Method Summary collapse

Methods inherited from BufferedAttendee

#initialize, #process

Methods inherited from Lingo::Attendee

#command, #forward, #initialize

Constructor Details

This class inherits a constructor from Lingo::BufferedAttendee

Instance Method Details

#control(cmd) ⇒ Object



119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/lingo/attendee/multi_worder.rb', line 119

def control(cmd, *)
  if [:RECORD, :EOF].include?(cmd)
    @eof_handling = true

    while process_buffer?(2)
      process_buffer
    end

    forward_number_of_token

    @eof_handling = false
  end
end

#initObject



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/lingo/attendee/multi_worder.rb', line 84

def init
  # combine lexical variants?
  #
  # false = old behaviour
  # true  = first match
  # 'all' = all matches
  @combine = get_key('combine', false)
  @all     = @combine.is_a?(String) && @combine.downcase == 'all'

  lex_src, lex_mod, d = nil, nil, lingo.dictionary_config['databases']

  (mul_src = get_ary('source')).each { |src|
    s, m = d[src].values_at('use-lex', 'lex-mode')

    if lex_src.nil? || lex_src == s
      lex_src, lex_mod = s, m
    else
      warn "#{self.class}: Dictionaries don't match: #{mul_src.join(',')}"
    end
  }

  lex_src = lex_src.split(SEP_RE)
  lex_mod = get_key('lex-mode', lex_mod || 'first')

  @mul_dic = dictionary(mul_src, get_key('mode', 'all'))
  @lex_dic = dictionary(lex_src, lex_mod)
  @lex_gra = grammar(lex_src, lex_mod)

  @syn_dic = if @combine && has_key?('use-syn')
    dictionary(get_ary('use-syn'), get_key('syn-mode', 'all'))
  end

  @expected_tokens_in_buffer, @eof_handling = 3, false
end