lingo 1.8.0 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +13 -0
- data/README +49 -29
- data/Rakefile +28 -4
- data/TODO +2 -9
- data/bin/lingo +24 -0
- data/bin/lingoctl +24 -0
- data/de/lingo-dic.txt +559 -74
- data/info/gpl-hdr.txt +21 -24
- data/lib/lingo.rb +83 -112
- data/lib/lingo/agenda_item.rb +53 -0
- data/lib/lingo/attendee.rb +261 -0
- data/lib/lingo/attendee/abbreviator.rb +95 -97
- data/lib/lingo/attendee/debugger.rb +94 -93
- data/lib/lingo/attendee/decomposer.rb +76 -83
- data/lib/lingo/attendee/dehyphenizer.rb +141 -144
- data/lib/lingo/attendee/formatter.rb +65 -0
- data/lib/lingo/attendee/multi_worder.rb +302 -0
- data/lib/lingo/attendee/noneword_filter.rb +89 -84
- data/lib/lingo/attendee/object_filter.rb +91 -0
- data/lib/lingo/attendee/sequencer.rb +159 -158
- data/lib/lingo/attendee/synonymer.rb +81 -84
- data/lib/lingo/attendee/text_reader.rb +242 -0
- data/lib/lingo/attendee/text_writer.rb +169 -0
- data/lib/lingo/attendee/tokenizer.rb +192 -191
- data/lib/lingo/attendee/variator.rb +152 -156
- data/lib/lingo/attendee/vector_filter.rb +140 -135
- data/lib/lingo/attendee/word_searcher.rb +98 -0
- data/lib/lingo/buffered_attendee.rb +69 -0
- data/lib/lingo/cachable.rb +58 -0
- data/lib/lingo/call.rb +72 -0
- data/lib/lingo/cli.rb +26 -0
- data/lib/lingo/config.rb +23 -26
- data/lib/lingo/core_ext.rb +42 -0
- data/lib/lingo/ctl.rb +239 -173
- data/lib/lingo/database.rb +148 -496
- data/lib/lingo/database/crypter.rb +85 -0
- data/lib/lingo/database/gdbm_store.rb +49 -0
- data/lib/lingo/database/hash_store.rb +67 -0
- data/lib/lingo/database/libcdb_store.rb +58 -0
- data/lib/lingo/database/sdbm_store.rb +64 -0
- data/lib/lingo/database/show_progress.rb +81 -0
- data/lib/lingo/database/source.rb +134 -0
- data/lib/lingo/database/source/key_value.rb +62 -0
- data/lib/lingo/database/source/multi_key.rb +65 -0
- data/lib/lingo/database/source/multi_value.rb +65 -0
- data/lib/lingo/database/source/single_word.rb +60 -0
- data/lib/lingo/database/source/word_class.rb +64 -0
- data/lib/lingo/error.rb +122 -0
- data/lib/lingo/language.rb +78 -518
- data/lib/lingo/language/dictionary.rb +173 -0
- data/lib/lingo/language/grammar.rb +211 -0
- data/lib/lingo/language/lexical.rb +66 -0
- data/lib/lingo/language/lexical_hash.rb +88 -0
- data/lib/lingo/language/token.rb +48 -0
- data/lib/lingo/language/word.rb +130 -0
- data/lib/lingo/language/word_form.rb +83 -0
- data/lib/lingo/reportable.rb +59 -0
- data/lib/lingo/version.rb +1 -1
- data/lingo-all.cfg +14 -10
- data/lingo-call.cfg +5 -5
- data/lingo.cfg +14 -12
- data/lingo.rb +26 -0
- data/lir.cfg +13 -9
- data/spec/spec_helper.rb +1 -0
- data/test.cfg +11 -11
- data/test/attendee/ts_abbreviator.rb +0 -6
- data/test/attendee/ts_decomposer.rb +0 -6
- data/test/attendee/{ts_multiworder.rb → ts_multi_worder.rb} +1 -7
- data/test/attendee/ts_noneword_filter.rb +1 -7
- data/test/attendee/{ts_objectfilter.rb → ts_object_filter.rb} +1 -7
- data/test/attendee/ts_sequencer.rb +0 -6
- data/test/attendee/ts_synonymer.rb +0 -6
- data/test/attendee/{ts_textreader.rb → ts_text_reader.rb} +1 -7
- data/test/attendee/{ts_textwriter.rb → ts_text_writer.rb} +1 -7
- data/test/attendee/ts_tokenizer.rb +0 -6
- data/test/attendee/ts_variator.rb +0 -6
- data/test/attendee/ts_vector_filter.rb +1 -7
- data/test/attendee/{ts_wordsearcher.rb → ts_word_searcher.rb} +1 -7
- data/test/ref/artikel.non +2 -29
- data/test/ref/artikel.seq +13 -8
- data/test/ref/artikel.vec +30 -15
- data/test/ref/artikel.ven +29 -14
- data/test/ref/artikel.ver +58 -43
- data/test/ref/lir.csv +146 -145
- data/test/ref/lir.non +186 -210
- data/test/ref/lir.seq +54 -50
- data/test/test_helper.rb +41 -36
- data/test/ts_database.rb +12 -11
- data/test/ts_language.rb +118 -68
- metadata +67 -29
- data/lib/lingo/attendee/multiworder.rb +0 -301
- data/lib/lingo/attendee/objectfilter.rb +0 -86
- data/lib/lingo/attendee/textreader.rb +0 -237
- data/lib/lingo/attendee/textwriter.rb +0 -196
- data/lib/lingo/attendee/wordsearcher.rb +0 -96
- data/lib/lingo/attendees.rb +0 -289
- data/lib/lingo/const.rb +0 -131
- data/lib/lingo/modules.rb +0 -98
- data/lib/lingo/types.rb +0 -285
- data/lib/lingo/utilities.rb +0 -40
|
@@ -1,117 +1,115 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
# Copyright (C) 2007
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
|
|
25
|
-
# welcomeATlex-lingoDOTde near 50°55'N+6°55'E.
|
|
26
|
-
#
|
|
27
|
-
# Lex Lingo rules from here on
|
|
4
|
+
###############################################################################
|
|
5
|
+
# #
|
|
6
|
+
# Lingo -- A full-featured automatic indexing system #
|
|
7
|
+
# #
|
|
8
|
+
# Copyright (C) 2005-2007 John Vorhauer #
|
|
9
|
+
# Copyright (C) 2007-2012 John Vorhauer, Jens Wille #
|
|
10
|
+
# #
|
|
11
|
+
# Lingo is free software; you can redistribute it and/or modify it under the #
|
|
12
|
+
# terms of the GNU Affero General Public License as published by the Free #
|
|
13
|
+
# Software Foundation; either version 3 of the License, or (at your option) #
|
|
14
|
+
# any later version. #
|
|
15
|
+
# #
|
|
16
|
+
# Lingo is distributed in the hope that it will be useful, but WITHOUT ANY #
|
|
17
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
|
18
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
|
|
19
|
+
# more details. #
|
|
20
|
+
# #
|
|
21
|
+
# You should have received a copy of the GNU Affero General Public License #
|
|
22
|
+
# along with Lingo. If not, see <http://www.gnu.org/licenses/>. #
|
|
23
|
+
# #
|
|
24
|
+
###############################################################################
|
|
28
25
|
#++
|
|
29
26
|
|
|
30
27
|
class Lingo
|
|
31
28
|
|
|
32
|
-
|
|
33
|
-
# sollte eine sichere Unterscheidung von einem Satzende-Punkt möglich sein.
|
|
34
|
-
# Der in Lingo gewählte Ansatz befreit den Tokenizer von dieser Arbeit und konzentriert
|
|
35
|
-
# die Erkennung in diesem Attendee.
|
|
36
|
-
# Sobald der Abbreviator im Datenstrom auf ein Punkt trifft (Token = <tt>:./PUNC:</tt>),
|
|
37
|
-
# prüft er das vorhergehende Token auf eine gültige Abkürzung im Abkürzungs-Wörterbuch.
|
|
38
|
-
# Wird es als Abkürzung erkannt, dann wird das Token in ein Word gewandelt und das
|
|
39
|
-
# Punkt-Token aus dem Zeichenstrom entfernt.
|
|
40
|
-
#
|
|
41
|
-
# === Mögliche Verlinkung
|
|
42
|
-
# Erwartet:: Daten des Typs *Token* z.B. von Tokenizer
|
|
43
|
-
# Erzeugt:: Leitet Token weiter und wandelt erkannte Abkürzungen in den Typ *Word* z.B. für Wordsearcher
|
|
44
|
-
#
|
|
45
|
-
# === Parameter
|
|
46
|
-
# Kursiv dargestellte Parameter sind optional (ggf. mit Angabe der Voreinstellung).
|
|
47
|
-
# Alle anderen Parameter müssen zwingend angegeben werden.
|
|
48
|
-
# <b>in</b>:: siehe allgemeine Beschreibung des Attendee
|
|
49
|
-
# <b>out</b>:: siehe allgemeine Beschreibung des Attendee
|
|
50
|
-
# <b>source</b>:: siehe allgemeine Beschreibung des Dictionary
|
|
51
|
-
# <b><i>mode</i></b>:: (Standard: all) siehe allgemeine Beschreibung des Dictionary
|
|
52
|
-
#
|
|
53
|
-
# === Beispiele
|
|
54
|
-
# Bei der Verarbeitung einer normalen Textdatei mit der Ablaufkonfiguration <tt>t1.cfg</tt>
|
|
55
|
-
# meeting:
|
|
56
|
-
# attendees:
|
|
57
|
-
# - textreader: { out: lines, files: '$(files)' }
|
|
58
|
-
# - tokenizer: { in: lines, out: token }
|
|
59
|
-
# - abbreviator: { in: token, out: abbrev, source: 'sys-abk' }
|
|
60
|
-
# - debugger: { in: abbrev, prompt: 'out>' }
|
|
61
|
-
# ergibt die Ausgabe über den Debugger: <tt>lingo -c t1 test.txt</tt>
|
|
62
|
-
# out> *FILE('test.txt')
|
|
63
|
-
# out> :Dies/WORD:
|
|
64
|
-
# out> :ist/WORD:
|
|
65
|
-
# out> <ggf. = [(gegebenenfalls/w)]>
|
|
66
|
-
# out> :eine/WORD:
|
|
67
|
-
# out> :Abk³rzung/WORD:
|
|
68
|
-
# out> :./PUNC:
|
|
69
|
-
# out> *EOL('test.txt')
|
|
70
|
-
# out> *EOF('test.txt')
|
|
71
|
-
|
|
72
|
-
class Attendee::Abbreviator < BufferedAttendee
|
|
73
|
-
|
|
74
|
-
protected
|
|
75
|
-
|
|
76
|
-
def init
|
|
77
|
-
# Wörterbuch bereitstellen
|
|
78
|
-
src = get_array('source')
|
|
79
|
-
mod = get_key('mode', 'all')
|
|
80
|
-
@dic = Dictionary.new({'source'=>src, 'mode'=>mod}, @lingo)
|
|
81
|
-
end
|
|
29
|
+
class Attendee
|
|
82
30
|
|
|
83
|
-
|
|
84
|
-
|
|
31
|
+
# Die Erkennung von Abkürzungen kann auf vielfältige Weise erfolgen. In jedem Fall
|
|
32
|
+
# sollte eine sichere Unterscheidung von einem Satzende-Punkt möglich sein.
|
|
33
|
+
# Der in Lingo gewählte Ansatz befreit den Tokenizer von dieser Arbeit und konzentriert
|
|
34
|
+
# die Erkennung in diesem Attendee.
|
|
35
|
+
# Sobald der Abbreviator im Datenstrom auf ein Punkt trifft (Token = <tt>:./PUNC:</tt>),
|
|
36
|
+
# prüft er das vorhergehende Token auf eine gültige Abkürzung im Abkürzungs-Wörterbuch.
|
|
37
|
+
# Wird es als Abkürzung erkannt, dann wird das Token in ein Word gewandelt und das
|
|
38
|
+
# Punkt-Token aus dem Zeichenstrom entfernt.
|
|
39
|
+
#
|
|
40
|
+
# === Mögliche Verlinkung
|
|
41
|
+
# Erwartet:: Daten des Typs *Token* z.B. von Tokenizer
|
|
42
|
+
# Erzeugt:: Leitet Token weiter und wandelt erkannte Abkürzungen in den Typ *Word* z.B. für Wordsearcher
|
|
43
|
+
#
|
|
44
|
+
# === Parameter
|
|
45
|
+
# Kursiv dargestellte Parameter sind optional (ggf. mit Angabe der Voreinstellung).
|
|
46
|
+
# Alle anderen Parameter müssen zwingend angegeben werden.
|
|
47
|
+
# <b>in</b>:: siehe allgemeine Beschreibung des Attendee
|
|
48
|
+
# <b>out</b>:: siehe allgemeine Beschreibung des Attendee
|
|
49
|
+
# <b>source</b>:: siehe allgemeine Beschreibung des Dictionary
|
|
50
|
+
# <b><i>mode</i></b>:: (Standard: all) siehe allgemeine Beschreibung des Dictionary
|
|
51
|
+
#
|
|
52
|
+
# === Beispiele
|
|
53
|
+
# Bei der Verarbeitung einer normalen Textdatei mit der Ablaufkonfiguration <tt>t1.cfg</tt>
|
|
54
|
+
# meeting:
|
|
55
|
+
# attendees:
|
|
56
|
+
# - text_reader: { out: lines, files: '$(files)' }
|
|
57
|
+
# - tokenizer: { in: lines, out: token }
|
|
58
|
+
# - abbreviator: { in: token, out: abbrev, source: 'sys-abk' }
|
|
59
|
+
# - debugger: { in: abbrev, prompt: 'out>' }
|
|
60
|
+
# ergibt die Ausgabe über den Debugger: <tt>lingo -c t1 test.txt</tt>
|
|
61
|
+
# out> *FILE('test.txt')
|
|
62
|
+
# out> :Dies/WORD:
|
|
63
|
+
# out> :ist/WORD:
|
|
64
|
+
# out> <ggf. = [(gegebenenfalls/w)]>
|
|
65
|
+
# out> :eine/WORD:
|
|
66
|
+
# out> :Abk³rzung/WORD:
|
|
67
|
+
# out> :./PUNC:
|
|
68
|
+
# out> *EOL('test.txt')
|
|
69
|
+
# out> *EOF('test.txt')
|
|
85
70
|
|
|
86
|
-
|
|
87
|
-
process_buffer
|
|
88
|
-
end
|
|
71
|
+
class Abbreviator < BufferedAttendee
|
|
89
72
|
|
|
90
|
-
|
|
73
|
+
protected
|
|
91
74
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
75
|
+
def init
|
|
76
|
+
set_dic
|
|
77
|
+
end
|
|
95
78
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
79
|
+
def control(cmd, par)
|
|
80
|
+
@dic.report.each_pair { |key, value| set(key, value) } if cmd == STR_CMD_STATUS
|
|
81
|
+
|
|
82
|
+
# Jedes Control-Object ist auch Auslöser der Verarbeitung
|
|
83
|
+
process_buffer
|
|
100
84
|
end
|
|
101
85
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
86
|
+
private
|
|
87
|
+
|
|
88
|
+
def process_buffer?
|
|
89
|
+
@buffer[-1].kind_of?(Token) && @buffer[-1].form == CHAR_PUNCT
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def process_buffer
|
|
93
|
+
if @buffer.size < 2
|
|
94
|
+
forward_buffer
|
|
95
|
+
return
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Wort vor dem Punkt im Abkürzungswörterbuch suchen
|
|
99
|
+
if @buffer[-2].kind_of?(Token)
|
|
100
|
+
inc('Anzahl gesuchter Abkürzungen')
|
|
101
|
+
abbr = @dic.find_word(@buffer[-2].form)
|
|
102
|
+
if abbr.identified?
|
|
103
|
+
inc('Anzahl gefundener Abkürzungen')
|
|
104
|
+
abbr.form += CHAR_PUNCT
|
|
105
|
+
@buffer[-2] = abbr
|
|
106
|
+
@buffer.delete_at(-1)
|
|
107
|
+
end
|
|
111
108
|
end
|
|
109
|
+
|
|
110
|
+
forward_buffer
|
|
112
111
|
end
|
|
113
112
|
|
|
114
|
-
forward_buffer
|
|
115
113
|
end
|
|
116
114
|
|
|
117
115
|
end
|
|
@@ -1,109 +1,110 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
# Copyright (C) 2007
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
|
|
25
|
-
# welcomeATlex-lingoDOTde near 50°55'N+6°55'E.
|
|
26
|
-
#
|
|
27
|
-
# Lex Lingo rules from here on
|
|
4
|
+
###############################################################################
|
|
5
|
+
# #
|
|
6
|
+
# Lingo -- A full-featured automatic indexing system #
|
|
7
|
+
# #
|
|
8
|
+
# Copyright (C) 2005-2007 John Vorhauer #
|
|
9
|
+
# Copyright (C) 2007-2012 John Vorhauer, Jens Wille #
|
|
10
|
+
# #
|
|
11
|
+
# Lingo is free software; you can redistribute it and/or modify it under the #
|
|
12
|
+
# terms of the GNU Affero General Public License as published by the Free #
|
|
13
|
+
# Software Foundation; either version 3 of the License, or (at your option) #
|
|
14
|
+
# any later version. #
|
|
15
|
+
# #
|
|
16
|
+
# Lingo is distributed in the hope that it will be useful, but WITHOUT ANY #
|
|
17
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
|
18
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
|
|
19
|
+
# more details. #
|
|
20
|
+
# #
|
|
21
|
+
# You should have received a copy of the GNU Affero General Public License #
|
|
22
|
+
# along with Lingo. If not, see <http://www.gnu.org/licenses/>. #
|
|
23
|
+
# #
|
|
24
|
+
###############################################################################
|
|
28
25
|
#++
|
|
29
26
|
|
|
30
27
|
class Lingo
|
|
31
28
|
|
|
32
|
-
|
|
33
|
-
# einer komplexen Konfiguration hinten das gewünschte Ergebnis raus oder aber auch nicht. Für den
|
|
34
|
-
# letzeren Fall ist der Debugger primär gedacht. Er kann an beliebige Stelle in den Datenstrom
|
|
35
|
-
# eingeschleust werden, um Schritt für Schritt zu schauen, durch welchen Attendee das Ergebnis
|
|
36
|
-
# verfälscht wird um so den Fehler einzugrenzen und schließlich zu lösen.
|
|
37
|
-
#
|
|
38
|
-
# Der Debugger wird jedoch auch gerne für die Verfolgung der Verarbeitung am Bildschirm verwendet.
|
|
39
|
-
#
|
|
40
|
-
# Achtung: Um Irritationen bei der Anwendung mehrerer Debugger zu vermeiden wird empfohlen, den
|
|
41
|
-
# Debugger in der Konfiguration immer unmittelbar nach dem Attendee zu platzieren, dessen Ausgabe
|
|
42
|
-
# debugt werden soll. Ansonsten kann es zu scheinbar unerklärlichen Interferrenzen bei der Ausgabe
|
|
43
|
-
# kommen.
|
|
44
|
-
#
|
|
45
|
-
# === Mögliche Verlinkung
|
|
46
|
-
# Erwartet:: Daten beliebigen Typs
|
|
47
|
-
#
|
|
48
|
-
# === Parameter
|
|
49
|
-
# Kursiv dargestellte Parameter sind optional (ggf. mit Angabe der Voreinstellung).
|
|
50
|
-
# Alle anderen Parameter müssen zwingend angegeben werden.
|
|
51
|
-
# <b>in</b>:: siehe allgemeine Beschreibung des Attendee
|
|
52
|
-
# <b>out</b>:: siehe allgemeine Beschreibung des Attendee
|
|
53
|
-
# <b><i>eval</i></b>:: (Standard: true) Gibt eine Bedingung an, die erfüllt sein muss, damit ein
|
|
54
|
-
# Datenobjekt ausgegeben wird (siehe Beschreibung Objectfilter)
|
|
55
|
-
# <b><i>ceval</i></b>:: (Standard: true) Gibt eiune Bedingung an, die erfüllt sein muss, damit ein
|
|
56
|
-
# Kommandoobjekt ausgegeben wird.
|
|
57
|
-
# <b><i>prompt</i></b>:: (Standard: 'lex:) ') Gibt an, mit welchem Prefix die Ausgabe versehen werden
|
|
58
|
-
# soll. Insbesondere wenn mit mehreren Debuggern gearbeitet wird, sollte dies
|
|
59
|
-
# genutzt werden.
|
|
60
|
-
#
|
|
61
|
-
# === Beispiele
|
|
62
|
-
# Bei der Verarbeitung der oben angegebenen Funktionsbeschreibung des Textwriters mit der Ablaufkonfiguration <tt>t1.cfg</tt>
|
|
63
|
-
# meeting:
|
|
64
|
-
# attendees:
|
|
65
|
-
# - textreader: { out: lines, files: '$(files)' }
|
|
66
|
-
# - debugger: { in: lines, prompt: 'LINES:) ' }
|
|
67
|
-
# - tokenizer: { in: lines, out: token }
|
|
68
|
-
# - debugger: { in: token, prompt: 'TOKEN:) ' }
|
|
69
|
-
# ergibt die Ausgabe
|
|
70
|
-
# LINES:) *FILE('test.txt')
|
|
71
|
-
# TOKEN:) *FILE('test.txt')
|
|
72
|
-
# LINES:) "Der Debugger kann was."
|
|
73
|
-
# TOKEN:) :Der/WORD:
|
|
74
|
-
# TOKEN:) :Debugger/WORD:
|
|
75
|
-
# TOKEN:) :kann/WORD:
|
|
76
|
-
# TOKEN:) :was/WORD:
|
|
77
|
-
# TOKEN:) :./PUNC:
|
|
78
|
-
# TOKEN:) *EOL('test.txt')
|
|
79
|
-
# LINES:) "Lingo auch :o)"
|
|
80
|
-
# TOKEN:) :Lingo/WORD:
|
|
81
|
-
# TOKEN:) :auch/WORD:
|
|
82
|
-
# TOKEN:) ::/PUNC:
|
|
83
|
-
# TOKEN:) :o/WORD:
|
|
84
|
-
# TOKEN:) :)/OTHR:
|
|
85
|
-
# TOKEN:) *EOL('test.txt')
|
|
86
|
-
# LINES:) *EOF('test.txt')
|
|
87
|
-
# TOKEN:) *EOF('test.txt')
|
|
29
|
+
class Attendee
|
|
88
30
|
|
|
89
|
-
|
|
31
|
+
# Die Attendees von Lingo übergeben Daten über ihre Kommunikationskanäle und entweder kommt bei
|
|
32
|
+
# einer komplexen Konfiguration hinten das gewünschte Ergebnis raus oder aber auch nicht. Für den
|
|
33
|
+
# letzeren Fall ist der Debugger primär gedacht. Er kann an beliebige Stelle in den Datenstrom
|
|
34
|
+
# eingeschleust werden, um Schritt für Schritt zu schauen, durch welchen Attendee das Ergebnis
|
|
35
|
+
# verfälscht wird um so den Fehler einzugrenzen und schließlich zu lösen.
|
|
36
|
+
#
|
|
37
|
+
# Der Debugger wird jedoch auch gerne für die Verfolgung der Verarbeitung am Bildschirm verwendet.
|
|
38
|
+
#
|
|
39
|
+
# Achtung: Um Irritationen bei der Anwendung mehrerer Debugger zu vermeiden wird empfohlen, den
|
|
40
|
+
# Debugger in der Konfiguration immer unmittelbar nach dem Attendee zu platzieren, dessen Ausgabe
|
|
41
|
+
# debugt werden soll. Ansonsten kann es zu scheinbar unerklärlichen Interferrenzen bei der Ausgabe
|
|
42
|
+
# kommen.
|
|
43
|
+
#
|
|
44
|
+
# === Mögliche Verlinkung
|
|
45
|
+
# Erwartet:: Daten beliebigen Typs
|
|
46
|
+
#
|
|
47
|
+
# === Parameter
|
|
48
|
+
# Kursiv dargestellte Parameter sind optional (ggf. mit Angabe der Voreinstellung).
|
|
49
|
+
# Alle anderen Parameter müssen zwingend angegeben werden.
|
|
50
|
+
# <b>in</b>:: siehe allgemeine Beschreibung des Attendee
|
|
51
|
+
# <b>out</b>:: siehe allgemeine Beschreibung des Attendee
|
|
52
|
+
# <b><i>eval</i></b>:: (Standard: true) Gibt eine Bedingung an, die erfüllt sein muss, damit ein
|
|
53
|
+
# Datenobjekt ausgegeben wird (siehe Beschreibung Objectfilter)
|
|
54
|
+
# <b><i>ceval</i></b>:: (Standard: true) Gibt eiune Bedingung an, die erfüllt sein muss, damit ein
|
|
55
|
+
# Kommandoobjekt ausgegeben wird.
|
|
56
|
+
# <b><i>prompt</i></b>:: (Standard: 'lex:) ') Gibt an, mit welchem Prefix die Ausgabe versehen werden
|
|
57
|
+
# soll. Insbesondere wenn mit mehreren Debuggern gearbeitet wird, sollte dies
|
|
58
|
+
# genutzt werden.
|
|
59
|
+
#
|
|
60
|
+
# === Beispiele
|
|
61
|
+
# Bei der Verarbeitung der oben angegebenen Funktionsbeschreibung des Textwriters mit der Ablaufkonfiguration <tt>t1.cfg</tt>
|
|
62
|
+
# meeting:
|
|
63
|
+
# attendees:
|
|
64
|
+
# - text_reader: { out: lines, files: '$(files)' }
|
|
65
|
+
# - debugger: { in: lines, prompt: 'LINES:) ' }
|
|
66
|
+
# - tokenizer: { in: lines, out: token }
|
|
67
|
+
# - debugger: { in: token, prompt: 'TOKEN:) ' }
|
|
68
|
+
# ergibt die Ausgabe
|
|
69
|
+
# LINES:) *FILE('test.txt')
|
|
70
|
+
# TOKEN:) *FILE('test.txt')
|
|
71
|
+
# LINES:) "Der Debugger kann was."
|
|
72
|
+
# TOKEN:) :Der/WORD:
|
|
73
|
+
# TOKEN:) :Debugger/WORD:
|
|
74
|
+
# TOKEN:) :kann/WORD:
|
|
75
|
+
# TOKEN:) :was/WORD:
|
|
76
|
+
# TOKEN:) :./PUNC:
|
|
77
|
+
# TOKEN:) *EOL('test.txt')
|
|
78
|
+
# LINES:) "Lingo auch :o)"
|
|
79
|
+
# TOKEN:) :Lingo/WORD:
|
|
80
|
+
# TOKEN:) :auch/WORD:
|
|
81
|
+
# TOKEN:) ::/PUNC:
|
|
82
|
+
# TOKEN:) :o/WORD:
|
|
83
|
+
# TOKEN:) :)/OTHR:
|
|
84
|
+
# TOKEN:) *EOL('test.txt')
|
|
85
|
+
# LINES:) *EOF('test.txt')
|
|
86
|
+
# TOKEN:) *EOF('test.txt')
|
|
90
87
|
|
|
91
|
-
|
|
88
|
+
class Debugger < self
|
|
92
89
|
|
|
93
|
-
|
|
94
|
-
@obj_eval = get_key('eval', 'true')
|
|
95
|
-
@cmd_eval = get_key('ceval', 'true')
|
|
96
|
-
@prompt = get_key('prompt', 'lex:) ')
|
|
97
|
-
end
|
|
90
|
+
protected
|
|
98
91
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
@
|
|
92
|
+
def init
|
|
93
|
+
@obj_eval = get_key('eval', 'true')
|
|
94
|
+
@cmd_eval = get_key('ceval', 'true')
|
|
95
|
+
@prompt = get_key('prompt', 'lex:) ')
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def control(cmd, par)
|
|
99
|
+
if cmd != STR_CMD_STATUS
|
|
100
|
+
@lingo.warn "#{@prompt} #{AgendaItem.new(cmd, par).inspect}" if eval(@cmd_eval)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def process(obj)
|
|
105
|
+
@lingo.warn "#{@prompt} #{obj.inspect}" if eval(@obj_eval)
|
|
102
106
|
end
|
|
103
|
-
end
|
|
104
107
|
|
|
105
|
-
def process(obj)
|
|
106
|
-
@lingo.config.stderr.puts "#{@prompt} #{obj.inspect}" if eval(@obj_eval)
|
|
107
108
|
end
|
|
108
109
|
|
|
109
110
|
end
|
|
@@ -1,99 +1,92 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
# Copyright (C) 2007
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
|
|
25
|
-
# welcomeATlex-lingoDOTde near 50°55'N+6°55'E.
|
|
26
|
-
#
|
|
27
|
-
# Lex Lingo rules from here on
|
|
4
|
+
###############################################################################
|
|
5
|
+
# #
|
|
6
|
+
# Lingo -- A full-featured automatic indexing system #
|
|
7
|
+
# #
|
|
8
|
+
# Copyright (C) 2005-2007 John Vorhauer #
|
|
9
|
+
# Copyright (C) 2007-2012 John Vorhauer, Jens Wille #
|
|
10
|
+
# #
|
|
11
|
+
# Lingo is free software; you can redistribute it and/or modify it under the #
|
|
12
|
+
# terms of the GNU Affero General Public License as published by the Free #
|
|
13
|
+
# Software Foundation; either version 3 of the License, or (at your option) #
|
|
14
|
+
# any later version. #
|
|
15
|
+
# #
|
|
16
|
+
# Lingo is distributed in the hope that it will be useful, but WITHOUT ANY #
|
|
17
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
|
18
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
|
|
19
|
+
# more details. #
|
|
20
|
+
# #
|
|
21
|
+
# You should have received a copy of the GNU Affero General Public License #
|
|
22
|
+
# along with Lingo. If not, see <http://www.gnu.org/licenses/>. #
|
|
23
|
+
# #
|
|
24
|
+
###############################################################################
|
|
28
25
|
#++
|
|
29
26
|
|
|
30
27
|
class Lingo
|
|
31
28
|
|
|
32
|
-
|
|
33
|
-
# (z.B. Indexierungssystem oder Kompositumerkennung).
|
|
34
|
-
# Könnte man alle Kombinationen in den Wörterbüchern hinterlegen, dann würde der
|
|
35
|
-
# Wordsearcher die Erkennung bereits erledigt haben. Die hohe Anzahl der möglichen
|
|
36
|
-
# Kombinationen verbietet jedoch einen solchen Ansatz aufgrund des immensen Pflegeaufwands,
|
|
37
|
-
# eine algorithmische Lösung erscheint sinnvoller.
|
|
38
|
-
# Der Decomposer wertet alle vom Wordsearcher nicht erkannten Wörter aus und prüft sie
|
|
39
|
-
# auf Kompositum.
|
|
40
|
-
#
|
|
41
|
-
# === Mögliche Verlinkung
|
|
42
|
-
# Erwartet:: Daten vom Typ *Word* (andere werden einfach durchgereicht) z.B. von Wordsearcher
|
|
43
|
-
# Erzeugt:: Daten vom Typ *Word* (erkannte Komposita werden entsprechend erweitert) z.B. für Synonymer, Ocr_variator, Multiworder, Sequencer, Noneword_filter, Vector_filter
|
|
44
|
-
#
|
|
45
|
-
# === Parameter
|
|
46
|
-
# Kursiv dargestellte Parameter sind optional (ggf. mit Angabe der Voreinstellung).
|
|
47
|
-
# Alle anderen Parameter müssen zwingend angegeben werden.
|
|
48
|
-
# <b>in</b>:: siehe allgemeine Beschreibung des Attendee
|
|
49
|
-
# <b>out</b>:: siehe allgemeine Beschreibung des Attendee
|
|
50
|
-
# <b>source</b>:: siehe allgemeine Beschreibung des Dictionary
|
|
51
|
-
# <b><i>mode</i></b>:: (Standard: all) siehe allgemeine Beschreibung des Dictionary
|
|
52
|
-
#
|
|
53
|
-
# === Beispiele
|
|
54
|
-
# Bei der Verarbeitung einer normalen Textdatei mit der Ablaufkonfiguration <tt>t1.cfg</tt>
|
|
55
|
-
# meeting:
|
|
56
|
-
# attendees:
|
|
57
|
-
# - textreader: { out: lines, files: '$(files)' }
|
|
58
|
-
# - tokenizer: { in: lines, out: token }
|
|
59
|
-
# - abbreviator: { in: token, out: abbrev, source: 'sys-abk' }
|
|
60
|
-
# - wordsearcher: { in: abbrev, out: words, source: 'sys-dic' }
|
|
61
|
-
# - decomposer: { in: words, out: comps, source: 'sys-dic' }
|
|
62
|
-
# - debugger: { in: comps, prompt: 'out>' }
|
|
63
|
-
# ergibt die Ausgabe über den Debugger: <tt>lingo -c t1 test.txt</tt>
|
|
64
|
-
# out> *FILE('test.txt')
|
|
65
|
-
# out> <Lingo|?>
|
|
66
|
-
# out> :,/PUNC:
|
|
67
|
-
# out> <ein = [(ein/w)]>
|
|
68
|
-
# out> <Indexierungssystem|KOM = [(indexierungssystem/k), (indexierung/s), (system/s)]>
|
|
69
|
-
# out> <mit = [(mit/w)]>
|
|
70
|
-
# out> <Kompositumerkennung|KOM = [(kompositumerkennung/k), (erkennung/s), (kompositum/s)]>
|
|
71
|
-
# out> :./PUNC:
|
|
72
|
-
# out> *EOL('test.txt')
|
|
73
|
-
# out> *EOF('test.txt')
|
|
29
|
+
class Attendee
|
|
74
30
|
|
|
75
|
-
|
|
31
|
+
# Komposita, also zusammengesetzte Wörter, sind eine Spezialität der deutschen Sprache
|
|
32
|
+
# (z.B. Indexierungssystem oder Kompositumerkennung).
|
|
33
|
+
# Könnte man alle Kombinationen in den Wörterbüchern hinterlegen, dann würde der
|
|
34
|
+
# Wordsearcher die Erkennung bereits erledigt haben. Die hohe Anzahl der möglichen
|
|
35
|
+
# Kombinationen verbietet jedoch einen solchen Ansatz aufgrund des immensen Pflegeaufwands,
|
|
36
|
+
# eine algorithmische Lösung erscheint sinnvoller.
|
|
37
|
+
# Der Decomposer wertet alle vom Wordsearcher nicht erkannten Wörter aus und prüft sie
|
|
38
|
+
# auf Kompositum.
|
|
39
|
+
#
|
|
40
|
+
# === Mögliche Verlinkung
|
|
41
|
+
# Erwartet:: Daten vom Typ *Word* (andere werden einfach durchgereicht) z.B. von Wordsearcher
|
|
42
|
+
# Erzeugt:: Daten vom Typ *Word* (erkannte Komposita werden entsprechend erweitert) z.B. für Synonymer, Ocr_variator, Multiworder, Sequencer, Noneword_filter, Vector_filter
|
|
43
|
+
#
|
|
44
|
+
# === Parameter
|
|
45
|
+
# Kursiv dargestellte Parameter sind optional (ggf. mit Angabe der Voreinstellung).
|
|
46
|
+
# Alle anderen Parameter müssen zwingend angegeben werden.
|
|
47
|
+
# <b>in</b>:: siehe allgemeine Beschreibung des Attendee
|
|
48
|
+
# <b>out</b>:: siehe allgemeine Beschreibung des Attendee
|
|
49
|
+
# <b>source</b>:: siehe allgemeine Beschreibung des Dictionary
|
|
50
|
+
# <b><i>mode</i></b>:: (Standard: all) siehe allgemeine Beschreibung des Dictionary
|
|
51
|
+
#
|
|
52
|
+
# === Beispiele
|
|
53
|
+
# Bei der Verarbeitung einer normalen Textdatei mit der Ablaufkonfiguration <tt>t1.cfg</tt>
|
|
54
|
+
# meeting:
|
|
55
|
+
# attendees:
|
|
56
|
+
# - text_reader: { out: lines, files: '$(files)' }
|
|
57
|
+
# - tokenizer: { in: lines, out: token }
|
|
58
|
+
# - abbreviator: { in: token, out: abbrev, source: 'sys-abk' }
|
|
59
|
+
# - word_searcher: { in: abbrev, out: words, source: 'sys-dic' }
|
|
60
|
+
# - decomposer: { in: words, out: comps, source: 'sys-dic' }
|
|
61
|
+
# - debugger: { in: comps, prompt: 'out>' }
|
|
62
|
+
# ergibt die Ausgabe über den Debugger: <tt>lingo -c t1 test.txt</tt>
|
|
63
|
+
# out> *FILE('test.txt')
|
|
64
|
+
# out> <Lingo|?>
|
|
65
|
+
# out> :,/PUNC:
|
|
66
|
+
# out> <ein = [(ein/w)]>
|
|
67
|
+
# out> <Indexierungssystem|KOM = [(indexierungssystem/k), (indexierung/s), (system/s)]>
|
|
68
|
+
# out> <mit = [(mit/w)]>
|
|
69
|
+
# out> <Kompositumerkennung|KOM = [(kompositumerkennung/k), (erkennung/s), (kompositum/s)]>
|
|
70
|
+
# out> :./PUNC:
|
|
71
|
+
# out> *EOL('test.txt')
|
|
72
|
+
# out> *EOF('test.txt')
|
|
76
73
|
|
|
77
|
-
|
|
74
|
+
class Decomposer < self
|
|
78
75
|
|
|
79
|
-
|
|
80
|
-
# Wörterbuch bereitstellen
|
|
81
|
-
src = get_array('source')
|
|
82
|
-
mod = get_key('mode', 'all')
|
|
83
|
-
@grammar = Grammar.new({'source'=>src, 'mode'=>mod}, @lingo)
|
|
84
|
-
end
|
|
76
|
+
protected
|
|
85
77
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
} if cmd == STR_CMD_STATUS
|
|
90
|
-
end
|
|
78
|
+
def init
|
|
79
|
+
set_gra
|
|
80
|
+
end
|
|
91
81
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
obj = @grammar.find_compositum(obj.form)
|
|
82
|
+
def control(cmd, par)
|
|
83
|
+
@gra.report.each { |key, val| set(key, val) } if cmd == STR_CMD_STATUS
|
|
95
84
|
end
|
|
96
|
-
|
|
85
|
+
|
|
86
|
+
def process(obj)
|
|
87
|
+
forward(obj.is_a?(Word) && obj.unknown? ? @gra.find_compositum(obj.form) : obj)
|
|
88
|
+
end
|
|
89
|
+
|
|
97
90
|
end
|
|
98
91
|
|
|
99
92
|
end
|