Class: Lingo::Attendee::VectorFilter

Inherits:
Lingo::Attendee show all
Includes:
TextUtils
Defined in:
lib/lingo/attendee/vector_filter.rb

Overview

– Die Hauptaufgabe des VectorFilter ist die Erstellung eines Dokumenten-Index-Vektor. Dabei werden die durch die anderen Attendees ermittelten Grundformen eines Wortes gespeichert und bei einem Datei- oder Record-Wechsel weitergeleitet. Der VectorFilter kann bestimmte Wortklassen filtern und die Ergebnisse in verschiedenen Arten aufbereiten. Dabei werden Funktionen wie das einfache Zählen der Häufigkeit innerhalb eines Dokuments, aber auch die Term-Frequenz und unterschiedliche Ausgabeformate unterstützt.

Mögliche Verlinkung

Erwartet

Daten vom Typ Word, z.B. von Abbreviator, Wordsearcher, Decomposer, Synonymer, Multiworder, Sequencer

Erzeugt

Daten vom Typ String, z.B. für Textwriter

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

lexicals

(Standard: ‘[sy]’ => die Wortklassen Substantiv und Synonyme werden gefiltert) Es können in eckige Klammern beliebige Wortklassen angegeben werden (siehe lib/strings.rb). Der Parameter wird als regulärer Ausdruck ausgewertet.

sort

(Standard: ‘normal’) Der Parameter sort beeinflußt Verarbeitung und Ausgabeformat des VectorFilters.

normal

Jedes gefilterte Wort wird einmalig (keine Doppelnennungen!) in alphabetischer Reihenfolge in der Form “wort” ausgegeben.

term_abs

Jedes gefilterte Wort wird einmalig in absteigender Häufigkeit mit Angabe der absoluten Häufigkeit im Dokument in der Form “12 wort” ausgegeben.

term_rel

Jedes gefilterte Wort wird einmalig in absteigender Häufigkeit mit Angabe der relativen Häufigkeit im Dokument in der Form “0.1234 wort” ausgegeben.

sto_abs

Jedes gefilterte Wort wird einmalig in absteigender Häufigkeit mit Angabe der absoluten Häufigkeit im Dokument in der Form “wort 12” ausgegeben.

sto_rel

Jedes gefilterte Wort wird einmalig in absteigender Häufigkeit mit Angabe der relativen Häufigkeit im Dokument in der Form “wort 00.1234” ausgegeben.

skip

(Standard: TA_PUNCTUATION und TA_OTHER) Hiermit wird angegeben, welche Objekte nicht verarbeitet werden sollen. Die skip-Angabe bezieht sich auf das Attribut attr von Token oder Word-Objekten.

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: token, out: words, source: 'sys-dic' }
    - vector_filter: { in: words, out: filtr, sort: 'term_rel' }
    - debugger:      { in: filtr, prompt: 'out>' }

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

out> *FILE('test.txt')
out> "0.28571 indexierung"
out> *EOF('test.txt')

++

Constant Summary collapse

DEFAULT_SRC_SEPARATOR =
'|'
DEFAULT_POS_SEPARATOR =
'@'
DEFAULT_DICT_SEPARATOR =
Database::Source::WordClass::DEFAULT_SEPARATOR
DEFAULT_GENDER_SEPARATOR =
Database::Source::WordClass::GENDER_SEPARATOR

Constants included from TextUtils

TextUtils::DEFAULT_MODE, TextUtils::GZIP_RE, TextUtils::STDIN_EXT, TextUtils::STDOUT_EXT

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 Lingo::Attendee

#command, #forward, #initialize

Constructor Details

This class inherits a constructor from Lingo::Attendee

Instance Method Details

#control(cmd) ⇒ Object



132
133
134
135
136
137
# File 'lib/lingo/attendee/vector_filter.rb', line 132

def control(cmd, *)
  case cmd
    when :EOL       then :skip_command
    when *TERMINALS then send_vectors unless @docnum
  end
end

#control_deferred(cmd) ⇒ Object



139
140
141
# File 'lib/lingo/attendee/vector_filter.rb', line 139

def control_deferred(cmd, *)
  @docnum += 1 if TERMINALS.include?(cmd)
end

#initObject



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
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/lingo/attendee/vector_filter.rb', line 93

def init
  @lex  = get_re('lexicals', '[sy]')
  @skip = get_ary('skip', DEFAULT_SKIP, :upcase)

  @src = @pos = @sort_fmt = @sort_rel = @docnum = nil

  @tokens, @vectors, @word_count = [], Hash.array(1), Hash.new(0)

  if @dict = get_key('dict', false)
    @norm = get_key('norm', false)
    @dict = DEFAULT_DICT_SEPARATOR if @dict == true
  else
    @src = get_key('src', false)
    @src = DEFAULT_SRC_SEPARATOR if @src == true

    @pos = get_key('pos', false)
    @pos = DEFAULT_POS_SEPARATOR if @pos == true

    @tokens = get_ary('tokens', '', :upcase)
    @tokens.concat(Tokenizer.rules) if @tokens.delete('ALL')
  end

  if sort = get_key('sort', ENV['LINGO_NO_SORT'] ? false : 'normal')
    @sort_fmt, sort_method = sort.downcase.split('_', 2)

    @sort_rel = rel = sort_method == 'rel'

    unless @sort_fmt == 'normal'
      if @tfidf = get_key('tfidf', false)
        DeferredAttendee.enhance(self)
        @docnum, rel = 0, true
      end

      _sort_fmt = @sort_fmt == 'sto' ? '%2$s {%1$X}' : '%X %s'
      @sort_fmt = _sort_fmt.sub('X', rel ? '.5f' : 'd')
    end
  end
end

#process(obj) ⇒ Object



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/lingo/attendee/vector_filter.rb', line 143

def process(obj)
  if obj.is_a?(Token)
    return unless @tokens.include?(obj.attr)
  elsif obj.is_a?(Word)
    return if @skip.include?(obj.attr)
  else
    return
  end

  @word_count[@docnum] += 1

  @dict ? forward_dict(obj) : begin
    pos = obj.position_and_offset if @pos

    obj.is_a?(Token) ? forward_vector(obj, pos) :
      obj.each_lex(@lex) { |lex| forward_vector(lex, pos, lex.src) }
  end
end