lingo 1.8.0 → 1.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. data/ChangeLog +13 -0
  2. data/README +49 -29
  3. data/Rakefile +28 -4
  4. data/TODO +2 -9
  5. data/bin/lingo +24 -0
  6. data/bin/lingoctl +24 -0
  7. data/de/lingo-dic.txt +559 -74
  8. data/info/gpl-hdr.txt +21 -24
  9. data/lib/lingo.rb +83 -112
  10. data/lib/lingo/agenda_item.rb +53 -0
  11. data/lib/lingo/attendee.rb +261 -0
  12. data/lib/lingo/attendee/abbreviator.rb +95 -97
  13. data/lib/lingo/attendee/debugger.rb +94 -93
  14. data/lib/lingo/attendee/decomposer.rb +76 -83
  15. data/lib/lingo/attendee/dehyphenizer.rb +141 -144
  16. data/lib/lingo/attendee/formatter.rb +65 -0
  17. data/lib/lingo/attendee/multi_worder.rb +302 -0
  18. data/lib/lingo/attendee/noneword_filter.rb +89 -84
  19. data/lib/lingo/attendee/object_filter.rb +91 -0
  20. data/lib/lingo/attendee/sequencer.rb +159 -158
  21. data/lib/lingo/attendee/synonymer.rb +81 -84
  22. data/lib/lingo/attendee/text_reader.rb +242 -0
  23. data/lib/lingo/attendee/text_writer.rb +169 -0
  24. data/lib/lingo/attendee/tokenizer.rb +192 -191
  25. data/lib/lingo/attendee/variator.rb +152 -156
  26. data/lib/lingo/attendee/vector_filter.rb +140 -135
  27. data/lib/lingo/attendee/word_searcher.rb +98 -0
  28. data/lib/lingo/buffered_attendee.rb +69 -0
  29. data/lib/lingo/cachable.rb +58 -0
  30. data/lib/lingo/call.rb +72 -0
  31. data/lib/lingo/cli.rb +26 -0
  32. data/lib/lingo/config.rb +23 -26
  33. data/lib/lingo/core_ext.rb +42 -0
  34. data/lib/lingo/ctl.rb +239 -173
  35. data/lib/lingo/database.rb +148 -496
  36. data/lib/lingo/database/crypter.rb +85 -0
  37. data/lib/lingo/database/gdbm_store.rb +49 -0
  38. data/lib/lingo/database/hash_store.rb +67 -0
  39. data/lib/lingo/database/libcdb_store.rb +58 -0
  40. data/lib/lingo/database/sdbm_store.rb +64 -0
  41. data/lib/lingo/database/show_progress.rb +81 -0
  42. data/lib/lingo/database/source.rb +134 -0
  43. data/lib/lingo/database/source/key_value.rb +62 -0
  44. data/lib/lingo/database/source/multi_key.rb +65 -0
  45. data/lib/lingo/database/source/multi_value.rb +65 -0
  46. data/lib/lingo/database/source/single_word.rb +60 -0
  47. data/lib/lingo/database/source/word_class.rb +64 -0
  48. data/lib/lingo/error.rb +122 -0
  49. data/lib/lingo/language.rb +78 -518
  50. data/lib/lingo/language/dictionary.rb +173 -0
  51. data/lib/lingo/language/grammar.rb +211 -0
  52. data/lib/lingo/language/lexical.rb +66 -0
  53. data/lib/lingo/language/lexical_hash.rb +88 -0
  54. data/lib/lingo/language/token.rb +48 -0
  55. data/lib/lingo/language/word.rb +130 -0
  56. data/lib/lingo/language/word_form.rb +83 -0
  57. data/lib/lingo/reportable.rb +59 -0
  58. data/lib/lingo/version.rb +1 -1
  59. data/lingo-all.cfg +14 -10
  60. data/lingo-call.cfg +5 -5
  61. data/lingo.cfg +14 -12
  62. data/lingo.rb +26 -0
  63. data/lir.cfg +13 -9
  64. data/spec/spec_helper.rb +1 -0
  65. data/test.cfg +11 -11
  66. data/test/attendee/ts_abbreviator.rb +0 -6
  67. data/test/attendee/ts_decomposer.rb +0 -6
  68. data/test/attendee/{ts_multiworder.rb → ts_multi_worder.rb} +1 -7
  69. data/test/attendee/ts_noneword_filter.rb +1 -7
  70. data/test/attendee/{ts_objectfilter.rb → ts_object_filter.rb} +1 -7
  71. data/test/attendee/ts_sequencer.rb +0 -6
  72. data/test/attendee/ts_synonymer.rb +0 -6
  73. data/test/attendee/{ts_textreader.rb → ts_text_reader.rb} +1 -7
  74. data/test/attendee/{ts_textwriter.rb → ts_text_writer.rb} +1 -7
  75. data/test/attendee/ts_tokenizer.rb +0 -6
  76. data/test/attendee/ts_variator.rb +0 -6
  77. data/test/attendee/ts_vector_filter.rb +1 -7
  78. data/test/attendee/{ts_wordsearcher.rb → ts_word_searcher.rb} +1 -7
  79. data/test/ref/artikel.non +2 -29
  80. data/test/ref/artikel.seq +13 -8
  81. data/test/ref/artikel.vec +30 -15
  82. data/test/ref/artikel.ven +29 -14
  83. data/test/ref/artikel.ver +58 -43
  84. data/test/ref/lir.csv +146 -145
  85. data/test/ref/lir.non +186 -210
  86. data/test/ref/lir.seq +54 -50
  87. data/test/test_helper.rb +41 -36
  88. data/test/ts_database.rb +12 -11
  89. data/test/ts_language.rb +118 -68
  90. metadata +67 -29
  91. data/lib/lingo/attendee/multiworder.rb +0 -301
  92. data/lib/lingo/attendee/objectfilter.rb +0 -86
  93. data/lib/lingo/attendee/textreader.rb +0 -237
  94. data/lib/lingo/attendee/textwriter.rb +0 -196
  95. data/lib/lingo/attendee/wordsearcher.rb +0 -96
  96. data/lib/lingo/attendees.rb +0 -289
  97. data/lib/lingo/const.rb +0 -131
  98. data/lib/lingo/modules.rb +0 -98
  99. data/lib/lingo/types.rb +0 -285
  100. data/lib/lingo/utilities.rb +0 -40
@@ -1,117 +1,115 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # LINGO ist ein Indexierungssystem mit Grundformreduktion, Kompositumzerlegung,
5
- # Mehrworterkennung und Relationierung.
6
- #
7
- # Copyright (C) 2005-2007 John Vorhauer
8
- # Copyright (C) 2007-2011 John Vorhauer, Jens Wille
9
- #
10
- # This program is free software; you can redistribute it and/or modify it under
11
- # the terms of the GNU Affero General Public License as published by the Free
12
- # Software Foundation; either version 3 of the License, or (at your option)
13
- # any later version.
14
- #
15
- # This program is distributed in the hope that it will be useful, but WITHOUT
16
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17
- # FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
18
- # details.
19
- #
20
- # You should have received a copy of the GNU Affero General Public License along
21
- # with this program; if not, write to the Free Software Foundation, Inc.,
22
- # 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
23
- #
24
- # For more information visit http://www.lex-lingo.de or contact me at
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
- # Die Erkennung von Abkürzungen kann auf vielfältige Weise erfolgen. In jedem Fall
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
- def control(cmd, par)
84
- @dic.report.each_pair { |key, value| set(key, value) } if cmd == STR_CMD_STATUS
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
- # Jedes Control-Object ist auch Auslöser der Verarbeitung
87
- process_buffer
88
- end
71
+ class Abbreviator < BufferedAttendee
89
72
 
90
- private
73
+ protected
91
74
 
92
- def process_buffer?
93
- @buffer[-1].kind_of?(Token) && @buffer[-1].form == CHAR_PUNCT
94
- end
75
+ def init
76
+ set_dic
77
+ end
95
78
 
96
- def process_buffer
97
- if @buffer.size < 2
98
- forward_buffer
99
- return
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
- # Wort vor dem Punkt im Abkürzungswörterbuch suchen
103
- if @buffer[-2].kind_of?(Token)
104
- inc('Anzahl gesuchter Abkürzungen')
105
- abbr = @dic.find_word(@buffer[-2].form)
106
- if abbr.attr == WA_IDENTIFIED
107
- inc('Anzahl gefundener Abkürzungen')
108
- abbr.form += CHAR_PUNCT
109
- @buffer[-2] = abbr
110
- @buffer.delete_at(-1)
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
- # LINGO ist ein Indexierungssystem mit Grundformreduktion, Kompositumzerlegung,
5
- # Mehrworterkennung und Relationierung.
6
- #
7
- # Copyright (C) 2005-2007 John Vorhauer
8
- # Copyright (C) 2007-2011 John Vorhauer, Jens Wille
9
- #
10
- # This program is free software; you can redistribute it and/or modify it under
11
- # the terms of the GNU Affero General Public License as published by the Free
12
- # Software Foundation; either version 3 of the License, or (at your option)
13
- # any later version.
14
- #
15
- # This program is distributed in the hope that it will be useful, but WITHOUT
16
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17
- # FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
18
- # details.
19
- #
20
- # You should have received a copy of the GNU Affero General Public License along
21
- # with this program; if not, write to the Free Software Foundation, Inc.,
22
- # 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
23
- #
24
- # For more information visit http://www.lex-lingo.de or contact me at
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
- # Die Attendees von Lingo übergeben Daten über ihre Kommunikationskanäle und entweder kommt bei
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
- class Attendee::Debugger < Attendee
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
- protected
88
+ class Debugger < self
92
89
 
93
- def init
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
- def control(cmd, par)
100
- if cmd!=STR_CMD_STATUS
101
- @lingo.config.stderr.puts "#{@prompt} #{AgendaItem.new(cmd, par).inspect}" if eval(@cmd_eval)
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
- # LINGO ist ein Indexierungssystem mit Grundformreduktion, Kompositumzerlegung,
5
- # Mehrworterkennung und Relationierung.
6
- #
7
- # Copyright (C) 2005-2007 John Vorhauer
8
- # Copyright (C) 2007-2011 John Vorhauer, Jens Wille
9
- #
10
- # This program is free software; you can redistribute it and/or modify it under
11
- # the terms of the GNU Affero General Public License as published by the Free
12
- # Software Foundation; either version 3 of the License, or (at your option)
13
- # any later version.
14
- #
15
- # This program is distributed in the hope that it will be useful, but WITHOUT
16
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17
- # FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
18
- # details.
19
- #
20
- # You should have received a copy of the GNU Affero General Public License along
21
- # with this program; if not, write to the Free Software Foundation, Inc.,
22
- # 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
23
- #
24
- # For more information visit http://www.lex-lingo.de or contact me at
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
- # Komposita, also zusammengesetzte Wörter, sind eine Spezialität der deutschen Sprache
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
- class Attendee::Decomposer < Attendee
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
- protected
74
+ class Decomposer < self
78
75
 
79
- def init
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
- def control(cmd, par)
87
- @grammar.report.each_pair { |key, value|
88
- set(key, value)
89
- } if cmd == STR_CMD_STATUS
90
- end
78
+ def init
79
+ set_gra
80
+ end
91
81
 
92
- def process(obj)
93
- if obj.is_a?(Word) && obj.attr == WA_UNKNOWN
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
- forward(obj)
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