lingo 1.8.0
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/.rspec +1 -0
- data/COPYING +663 -0
- data/ChangeLog +754 -0
- data/README +322 -0
- data/Rakefile +100 -0
- data/TODO +28 -0
- data/bin/lingo +5 -0
- data/bin/lingoctl +6 -0
- data/de.lang +121 -0
- data/de/lingo-abk.txt +74 -0
- data/de/lingo-dic.txt +56822 -0
- data/de/lingo-mul.txt +3209 -0
- data/de/lingo-syn.txt +14841 -0
- data/de/test_dic.txt +24 -0
- data/de/test_mul.txt +17 -0
- data/de/test_mul2.txt +2 -0
- data/de/test_singleword.txt +2 -0
- data/de/test_syn.txt +4 -0
- data/de/test_syn2.txt +1 -0
- data/de/user-dic.txt +10 -0
- data/en.lang +113 -0
- data/en/lingo-dic.txt +55434 -0
- data/en/lingo-mul.txt +456 -0
- data/en/user-dic.txt +5 -0
- data/info/Objekte.png +0 -0
- data/info/Typen.png +0 -0
- data/info/database.png +0 -0
- data/info/db_small.png +0 -0
- data/info/download.png +0 -0
- data/info/gpl-hdr.txt +27 -0
- data/info/kerze.png +0 -0
- data/info/language.png +0 -0
- data/info/lingo.png +0 -0
- data/info/logo.png +0 -0
- data/info/meeting.png +0 -0
- data/info/types.png +0 -0
- data/lib/lingo.rb +321 -0
- data/lib/lingo/attendee/abbreviator.rb +119 -0
- data/lib/lingo/attendee/debugger.rb +111 -0
- data/lib/lingo/attendee/decomposer.rb +101 -0
- data/lib/lingo/attendee/dehyphenizer.rb +167 -0
- data/lib/lingo/attendee/multiworder.rb +301 -0
- data/lib/lingo/attendee/noneword_filter.rb +103 -0
- data/lib/lingo/attendee/objectfilter.rb +86 -0
- data/lib/lingo/attendee/sequencer.rb +190 -0
- data/lib/lingo/attendee/synonymer.rb +105 -0
- data/lib/lingo/attendee/textreader.rb +237 -0
- data/lib/lingo/attendee/textwriter.rb +196 -0
- data/lib/lingo/attendee/tokenizer.rb +218 -0
- data/lib/lingo/attendee/variator.rb +185 -0
- data/lib/lingo/attendee/vector_filter.rb +158 -0
- data/lib/lingo/attendee/wordsearcher.rb +96 -0
- data/lib/lingo/attendees.rb +289 -0
- data/lib/lingo/cli.rb +62 -0
- data/lib/lingo/config.rb +104 -0
- data/lib/lingo/const.rb +131 -0
- data/lib/lingo/ctl.rb +173 -0
- data/lib/lingo/database.rb +587 -0
- data/lib/lingo/language.rb +530 -0
- data/lib/lingo/modules.rb +98 -0
- data/lib/lingo/types.rb +285 -0
- data/lib/lingo/utilities.rb +40 -0
- data/lib/lingo/version.rb +27 -0
- data/lingo-all.cfg +85 -0
- data/lingo-call.cfg +15 -0
- data/lingo.cfg +78 -0
- data/lingo.rb +3 -0
- data/lir.cfg +72 -0
- data/porter/stem.cfg +311 -0
- data/porter/stem.rb +150 -0
- data/spec/spec_helper.rb +0 -0
- data/test.cfg +79 -0
- data/test/attendee/ts_abbreviator.rb +35 -0
- data/test/attendee/ts_decomposer.rb +31 -0
- data/test/attendee/ts_multiworder.rb +390 -0
- data/test/attendee/ts_noneword_filter.rb +19 -0
- data/test/attendee/ts_objectfilter.rb +19 -0
- data/test/attendee/ts_sequencer.rb +43 -0
- data/test/attendee/ts_synonymer.rb +33 -0
- data/test/attendee/ts_textreader.rb +58 -0
- data/test/attendee/ts_textwriter.rb +98 -0
- data/test/attendee/ts_tokenizer.rb +32 -0
- data/test/attendee/ts_variator.rb +24 -0
- data/test/attendee/ts_vector_filter.rb +62 -0
- data/test/attendee/ts_wordsearcher.rb +119 -0
- data/test/lir.csv +3 -0
- data/test/lir.txt +12 -0
- data/test/lir2.txt +12 -0
- data/test/mul.txt +1 -0
- data/test/ref/artikel.mul +1 -0
- data/test/ref/artikel.non +159 -0
- data/test/ref/artikel.seq +270 -0
- data/test/ref/artikel.syn +16 -0
- data/test/ref/artikel.vec +928 -0
- data/test/ref/artikel.ven +928 -0
- data/test/ref/artikel.ver +928 -0
- data/test/ref/lir.csv +328 -0
- data/test/ref/lir.mul +1 -0
- data/test/ref/lir.non +274 -0
- data/test/ref/lir.seq +249 -0
- data/test/ref/lir.syn +94 -0
- data/test/test_helper.rb +113 -0
- data/test/ts_database.rb +269 -0
- data/test/ts_language.rb +396 -0
- data/txt/artikel-en.txt +157 -0
- data/txt/artikel.txt +170 -0
- data/txt/lir.txt +1317 -0
- metadata +211 -0
data/test/ts_database.rb
ADDED
@@ -0,0 +1,269 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'test_helper'
|
4
|
+
|
5
|
+
class Lingo::Txt2DbmConverter
|
6
|
+
alias_method :original_initialize, :initialize
|
7
|
+
def initialize(id, lingo, verbose = false)
|
8
|
+
original_initialize(id, lingo, verbose)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class TestDatabase < LingoTestCase
|
13
|
+
|
14
|
+
def setup
|
15
|
+
@lingo = Lingo.new
|
16
|
+
|
17
|
+
@singleword = <<-EOT
|
18
|
+
Wort1
|
19
|
+
Wort2
|
20
|
+
Wort2
|
21
|
+
juristische Personen
|
22
|
+
höher schneller weiter
|
23
|
+
höher schneller weiter größer
|
24
|
+
ganz großer und blöder quatsch
|
25
|
+
ganz großer und blöder mist
|
26
|
+
ganz großer und blöder schwach sinn
|
27
|
+
EOT
|
28
|
+
|
29
|
+
@keyvalue = <<-EOT
|
30
|
+
Wort1*Projektion1
|
31
|
+
Wort2*Projektion2
|
32
|
+
Wort3*Projektion3
|
33
|
+
Wort4*
|
34
|
+
Wort1*Projektion4
|
35
|
+
Wort1 * Projektion5
|
36
|
+
Mehr Wort Satz*Pro Jeck Zion 1
|
37
|
+
Mehr Wort Satz*Pro Jeck Zion 2
|
38
|
+
Albert Einstein*Einstein, Albert
|
39
|
+
EOT
|
40
|
+
|
41
|
+
@wordclass = <<-EOT
|
42
|
+
Wort1=Projektion1#h
|
43
|
+
Wort2=Projektion2#i
|
44
|
+
Wort3=Projektion3#e
|
45
|
+
Wort1=Projektion4 #e
|
46
|
+
Wort1=#s
|
47
|
+
Wort2=
|
48
|
+
EOT
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_singleword
|
52
|
+
compare({
|
53
|
+
'txt-format' => 'SingleWord'
|
54
|
+
}, @singleword, {
|
55
|
+
'wort1' => '#s',
|
56
|
+
'wort2' => '#s',
|
57
|
+
'juristische personen' => '#s',
|
58
|
+
'höher schneller weiter' => '#s',
|
59
|
+
'höher schneller weiter größer' => '#s',
|
60
|
+
'ganz großer und blöder quatsch' => '#s',
|
61
|
+
'ganz großer und blöder mist' => '#s',
|
62
|
+
'ganz großer und blöder schwach sinn' => '#s'
|
63
|
+
})
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_singleword_defwc
|
67
|
+
compare({
|
68
|
+
'txt-format' => 'SingleWord',
|
69
|
+
'def-wc' => '*'
|
70
|
+
}, @singleword, {
|
71
|
+
'wort1' => '#*',
|
72
|
+
'wort2' => '#*',
|
73
|
+
'juristische personen' => '#*',
|
74
|
+
'höher schneller weiter' => '#*',
|
75
|
+
'höher schneller weiter größer' => '#*',
|
76
|
+
'ganz großer und blöder quatsch' => '#*',
|
77
|
+
'ganz großer und blöder mist' => '#*',
|
78
|
+
'ganz großer und blöder schwach sinn' => '#*'
|
79
|
+
})
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_singleword_defmulwc
|
83
|
+
compare({
|
84
|
+
'txt-format' => 'SingleWord',
|
85
|
+
'def-mul-wc' => 'm'
|
86
|
+
}, @singleword, {
|
87
|
+
'wort1' => '#s',
|
88
|
+
'wort2' => '#s',
|
89
|
+
'juristische personen' => '#m',
|
90
|
+
'höher schneller weiter' => '#m',
|
91
|
+
'höher schneller weiter größer' => '#m',
|
92
|
+
'ganz großer und blöder quatsch' => '#m',
|
93
|
+
'ganz großer und blöder mist' => '#m',
|
94
|
+
'ganz großer und blöder schwach sinn' => '#m'
|
95
|
+
})
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_singleword_uselex
|
99
|
+
compare({
|
100
|
+
'txt-format' => 'SingleWord',
|
101
|
+
'use-lex' => set_config('lex',
|
102
|
+
'name' => 'de/lingo-dic.txt',
|
103
|
+
'txt-format' => 'WordClass'
|
104
|
+
)
|
105
|
+
}, @singleword, {
|
106
|
+
'wort1' => '#s',
|
107
|
+
'wort2' => '#s',
|
108
|
+
'ganz groß und blöd mist' => 'ganz großer und blöder mist#s',
|
109
|
+
'juristisch person' => 'juristische personen#s',
|
110
|
+
'hoch schnell weit' => '*4|höher schneller weiter#s',
|
111
|
+
'ganz groß und blöd quatsch' => 'ganz großer und blöder quatsch#s',
|
112
|
+
'hoch schnell weit groß' => 'höher schneller weiter größer#s',
|
113
|
+
'ganz groß und blöd schwach sinn' => 'ganz großer und blöder schwach sinn#s',
|
114
|
+
'ganz groß und' => '*5|*6'
|
115
|
+
})
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_singleword_crypt
|
119
|
+
config = {
|
120
|
+
'txt-format' => 'SingleWord',
|
121
|
+
'crypt' => true
|
122
|
+
}
|
123
|
+
|
124
|
+
compare(config, @singleword, {
|
125
|
+
'd8ac4360a5f707d518212e27dcba9dd42d980f96' => '5116',
|
126
|
+
'81463f9c7e0ad40e329e83d3358232851d50ed9a' => '4d16',
|
127
|
+
'8da4a0c30c912543be2d88da64c0192e577efa9d' => '1107',
|
128
|
+
'2c24b4707e77c74abfb12748317693dc1e43c215' => '5700',
|
129
|
+
'810ff7a76f39febcb1cf67993d4fb29819ce40a6' => '5116',
|
130
|
+
'a28b4ca84ac08aeef4e420445f94f632ad010a30' => '1207',
|
131
|
+
'1496f4febbc647f3ac74b0af11dadbd6322f6732' => '4d1d',
|
132
|
+
'b7501a62cb083be6730a7a179a4ab346d23efe53' => '4b10'
|
133
|
+
})
|
134
|
+
|
135
|
+
compare(config, @singleword) { |dbm| {
|
136
|
+
'wort1' => '#s',
|
137
|
+
'wort2' => '#s',
|
138
|
+
'juristische personen' => '#s',
|
139
|
+
'höher schneller weiter' => '#s',
|
140
|
+
'höher schneller weiter größer' => '#s',
|
141
|
+
'ganz großer und blöder quatsch' => '#s',
|
142
|
+
'ganz großer und blöder mist' => '#s',
|
143
|
+
'ganz großer und blöder schwach sinn' => '#s'
|
144
|
+
}.each { |key, val| assert_equal([val], dbm[key]) } }
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_keyvalue
|
148
|
+
compare({
|
149
|
+
'txt-format' => 'KeyValue'
|
150
|
+
}, @keyvalue, {
|
151
|
+
'wort1' => 'projektion1#?|projektion4#?|projektion5#?',
|
152
|
+
'wort2' => 'projektion2#?',
|
153
|
+
'wort3' => 'projektion3#?',
|
154
|
+
'mehr wort satz' => 'pro jeck zion 1#?|pro jeck zion 2#?',
|
155
|
+
'albert einstein' => 'einstein, albert#?'
|
156
|
+
})
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_keyvalue_separator
|
160
|
+
compare({
|
161
|
+
'txt-format' => 'KeyValue',
|
162
|
+
'separator' => '*'
|
163
|
+
}, @keyvalue, {
|
164
|
+
'wort1' => 'projektion1#?|projektion4#?|projektion5#?',
|
165
|
+
'wort2' => 'projektion2#?',
|
166
|
+
'wort3' => 'projektion3#?',
|
167
|
+
'mehr wort satz' => 'pro jeck zion 1#?|pro jeck zion 2#?',
|
168
|
+
'albert einstein' => 'einstein, albert#?'
|
169
|
+
})
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_keyvalue_defwc
|
173
|
+
compare({
|
174
|
+
'txt-format' => 'KeyValue',
|
175
|
+
'separator' => '*',
|
176
|
+
'def-wc' => 's'
|
177
|
+
}, @keyvalue, {
|
178
|
+
'wort1'=>'projektion1#s|projektion4#s|projektion5#s',
|
179
|
+
'wort2'=>'projektion2#s',
|
180
|
+
'wort3'=>'projektion3#s',
|
181
|
+
'mehr wort satz'=>'pro jeck zion 1#s|pro jeck zion 2#s',
|
182
|
+
'albert einstein'=>'einstein, albert#s'
|
183
|
+
})
|
184
|
+
end
|
185
|
+
|
186
|
+
def test_wordclass
|
187
|
+
compare({
|
188
|
+
'txt-format' => 'WordClass',
|
189
|
+
'separator' => '='
|
190
|
+
}, %q{
|
191
|
+
Wort1=Projektion1#h
|
192
|
+
Wort2=Projektion2#i
|
193
|
+
Wort3=Projektion3#e
|
194
|
+
Wort1=Projektion4 #e
|
195
|
+
Wort1=#s
|
196
|
+
Wort2=
|
197
|
+
}, {
|
198
|
+
'wort1' => 'projektion1#h|projektion4#e',
|
199
|
+
'wort2' => 'projektion2#i',
|
200
|
+
'wort3' => 'projektion3#e'
|
201
|
+
})
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_multivalue
|
205
|
+
compare({
|
206
|
+
'txt-format' => 'MultiValue',
|
207
|
+
'separator' => ';'
|
208
|
+
}, %q{
|
209
|
+
Hasen;Nasen;Vasen;Rasen
|
210
|
+
Gold;Edelmetall;Mehrwert
|
211
|
+
Rasen;Gras;Grüne Fläche
|
212
|
+
Rasen;Rennen;Wettrennen
|
213
|
+
}, {
|
214
|
+
'^0' => 'hasen|nasen|rasen|vasen',
|
215
|
+
'^1' => 'edelmetall|gold|mehrwert',
|
216
|
+
'^2' => 'gras|grüne fläche|rasen',
|
217
|
+
'^3' => 'rasen|rennen|wettrennen',
|
218
|
+
'hasen' => '^0',
|
219
|
+
'nasen' => '^0',
|
220
|
+
'rasen' => '^0|^2|^3',
|
221
|
+
'vasen' => '^0',
|
222
|
+
'edelmetall' => '^1',
|
223
|
+
'gold' => '^1',
|
224
|
+
'mehrwert' => '^1',
|
225
|
+
'gras' => '^2',
|
226
|
+
'grüne fläche' => '^2',
|
227
|
+
'wettrennen' => '^3',
|
228
|
+
'rennen' => '^3'
|
229
|
+
})
|
230
|
+
end
|
231
|
+
|
232
|
+
def test_multikey
|
233
|
+
compare({
|
234
|
+
'txt-format' => 'MultiKey'
|
235
|
+
}, %q{
|
236
|
+
Hasen;Nasen;Vasen;Rasen
|
237
|
+
Gold;Edelmetall;Mehrwert
|
238
|
+
}, {
|
239
|
+
'nasen' => 'hasen',
|
240
|
+
'vasen' => 'hasen',
|
241
|
+
'rasen' => 'hasen',
|
242
|
+
'edelmetall' => 'gold',
|
243
|
+
'mehrwert' => 'gold',
|
244
|
+
})
|
245
|
+
end
|
246
|
+
|
247
|
+
def compare(config, input, output = nil)
|
248
|
+
FileUtils.mkdir_p(File.dirname(TEST_FILE))
|
249
|
+
File.write(TEST_FILE, input, encoding: Lingo::ENC)
|
250
|
+
|
251
|
+
Lingo::DbmFile.open(set_config('tst', config.merge('name' => TEST_FILE)), @lingo) { |dbm|
|
252
|
+
if block_given?
|
253
|
+
yield dbm
|
254
|
+
else
|
255
|
+
store = dbm.to_h
|
256
|
+
store.delete(Lingo::SYS_KEY)
|
257
|
+
|
258
|
+
assert_equal(output, store)
|
259
|
+
end
|
260
|
+
}
|
261
|
+
ensure
|
262
|
+
cleanup_store
|
263
|
+
end
|
264
|
+
|
265
|
+
def set_config(id, config)
|
266
|
+
"_test_#{id}_".tap { |id| @lingo.config["language/dictionary/databases/#{id}"] = config }
|
267
|
+
end
|
268
|
+
|
269
|
+
end
|
data/test/ts_language.rb
ADDED
@@ -0,0 +1,396 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'test_helper'
|
4
|
+
|
5
|
+
class TestLexicalHash < LingoTestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@lingo = Lingo.new
|
9
|
+
@database_config = @lingo.config['language/dictionary/databases']
|
10
|
+
end
|
11
|
+
|
12
|
+
def teardown
|
13
|
+
cleanup_store
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_params
|
17
|
+
old_stderr, $stderr = $stderr, StringIO.new('')
|
18
|
+
|
19
|
+
# Datenquelle nicht in Konfiguration enthalten
|
20
|
+
assert_raise(SystemExit) { Lingo::LexicalHash.new('nonsens', @lingo) }
|
21
|
+
ensure
|
22
|
+
$stderr = old_stderr
|
23
|
+
end
|
24
|
+
|
25
|
+
# TODO: Crypt testen...
|
26
|
+
|
27
|
+
def test_cache
|
28
|
+
ds = Lingo::LexicalHash.new('sys-dic', @lingo)
|
29
|
+
assert_equal([lx('regen|s'), lx('regen|v'), lx('rege|a')], ds['regen'])
|
30
|
+
assert_equal([lx('regen|s'), lx('regen|v'), lx('rege|a')], ds['regen'])
|
31
|
+
assert_equal([lx('regen|s'), lx('regen|v'), lx('rege|a')], ds['regen'])
|
32
|
+
ds.close
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_report
|
36
|
+
ds = Lingo::LexicalHash.new('tst-syn', @lingo)
|
37
|
+
ds['abwickeln'] # source read
|
38
|
+
ds['abwickeln'] # cache hit
|
39
|
+
ds['regen'] # source read
|
40
|
+
ds['nonesens'] # source read, nothing found
|
41
|
+
|
42
|
+
expect = { \
|
43
|
+
"tst-syn: cache hits" => 1, \
|
44
|
+
"tst-syn: total requests" => 4, \
|
45
|
+
"tst-syn: source reads" => 3, \
|
46
|
+
"tst-syn: data found" => 2
|
47
|
+
}
|
48
|
+
|
49
|
+
assert_equal(expect, ds.report)
|
50
|
+
ds.close
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_auto_create
|
54
|
+
txt_file = @database_config['tst-sgw']['name']
|
55
|
+
sto_file = Lingo.find(:store, txt_file) << '.pag'
|
56
|
+
|
57
|
+
ds = Lingo::LexicalHash.new('tst-sgw', @lingo)
|
58
|
+
assert_equal([lx('substantiv|s')], ds['substantiv'])
|
59
|
+
ds.close
|
60
|
+
|
61
|
+
# Keine Store-Datei vorhanden, nur Text vorhanden
|
62
|
+
File.delete(sto_file)
|
63
|
+
ds = Lingo::LexicalHash.new('tst-sgw', @lingo)
|
64
|
+
assert_equal([lx('substantiv|s')], ds['substantiv'])
|
65
|
+
ds.close
|
66
|
+
|
67
|
+
# Store vorhanden, aber Text ist neuer
|
68
|
+
ds = Lingo::LexicalHash.new('tst-sgw', @lingo)
|
69
|
+
assert_equal([lx('substantiv|s')], ds['substantiv'])
|
70
|
+
ds.close
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_singleword
|
74
|
+
ds = Lingo::LexicalHash.new('tst-sgw', @lingo)
|
75
|
+
assert_equal([lx('substantiv|s')], ds['substantiv'])
|
76
|
+
assert_equal([lx('mehr wort gruppe|s')], ds['mehr wort gruppe'])
|
77
|
+
assert_equal(nil, ds['nicht vorhanden'])
|
78
|
+
ds.close
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_keyvalue
|
82
|
+
ds = Lingo::LexicalHash.new('sys-mul', @lingo)
|
83
|
+
assert_equal([lx('abelscher ring ohne nullteiler|m')], ds['abelscher ring ohne nullteiler'])
|
84
|
+
assert_equal(['*4'], ds['abelscher ring ohne'])
|
85
|
+
assert_equal([lx('alleinreisende frau|m')], ds['alleinreisend frau'])
|
86
|
+
assert_equal([lx('abschaltbarer leistungshalbleiter|m')], ds['abschaltbar leistungshalbleiter'])
|
87
|
+
assert_equal(nil, ds['abschaltbarer leistungshalbleiter'])
|
88
|
+
ds.close
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_wordclass
|
92
|
+
ds = Lingo::LexicalHash.new('sys-dic', @lingo)
|
93
|
+
assert_equal([lx('a-dur|s')], ds['a-dur'])
|
94
|
+
assert_equal([lx('aalen|v'), lx('aalen|e')], ds['aalen'])
|
95
|
+
assert_equal([lx('abarbeitend|a')], ds['abarbeitend'])
|
96
|
+
ds.close
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_case
|
100
|
+
ds = Lingo::LexicalHash.new('sys-dic', @lingo)
|
101
|
+
assert_equal([lx('abänderung|s')], ds['abänderung'])
|
102
|
+
assert_equal([lx('abänderung|s')], ds['Abänderung'])
|
103
|
+
assert_equal([lx('abänderung|s')], ds['ABÄNDERUNG'])
|
104
|
+
ds.close
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_multivalue
|
108
|
+
ds = Lingo::LexicalHash.new('sys-syn', @lingo)
|
109
|
+
# assert_equal([lx('abrollen', LA_SYNONYM), lx('abschaffen', LA_SYNONYM), lx('abwickeln', LA_SYNONYM), lx('auflösen (geschäft)','y')], ds['abwickeln'])
|
110
|
+
# assert_equal([lx('niederschlag', LA_SYNONYM), lx('regen', LA_SYNONYM), lx('schauer', LA_SYNONYM)], ds['regen'])
|
111
|
+
ds.close
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
class TestDictionary < LingoTestCase
|
117
|
+
|
118
|
+
def setup
|
119
|
+
@lingo = Lingo.new
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_params
|
123
|
+
# Keine Sprach-Konfiguration angegeben
|
124
|
+
#assert_raise(RuntimeError) { Lingo::Dictionary.new({'source'=>['sys-dic']}, @lingo) }
|
125
|
+
# Keine Parameter angegeben
|
126
|
+
assert_raise(RuntimeError) { Lingo::Dictionary.new(nil, @lingo) }
|
127
|
+
# Falsche Parameter angegeben (Pflichtparameter ohne Defaultwert)
|
128
|
+
assert_raise(RuntimeError) { Lingo::Dictionary.new({'course'=>['sys-dic']}, @lingo) }
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_cache
|
132
|
+
dic = Lingo::Dictionary.new({'source'=>['sys-dic']}, @lingo)
|
133
|
+
assert_equal([lx('nase|s')], dic.select('nase'))
|
134
|
+
assert_equal([lx('nase|s')], dic.select('nase'))
|
135
|
+
assert_equal([lx('nase|s')], dic.select('nase'))
|
136
|
+
dic.close
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_report
|
140
|
+
dic = Lingo::Dictionary.new({'source'=>['sys-dic']}, @lingo)
|
141
|
+
dic.select('abwickeln') # source read
|
142
|
+
dic.select('abwickeln') # cache hit
|
143
|
+
dic.select('regen') # source read
|
144
|
+
dic.select('nonesens') # source read, nothing found
|
145
|
+
|
146
|
+
expect = {
|
147
|
+
"sys-dic: total requests" => 4,
|
148
|
+
"sys-dic: data found" => 2,
|
149
|
+
"sys-dic: cache hits" => 1,
|
150
|
+
"sys-dic: source reads" => 3
|
151
|
+
}
|
152
|
+
|
153
|
+
assert_equal(expect, dic.report)
|
154
|
+
dic.close
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_select_one_source
|
158
|
+
dic = Lingo::Dictionary.new({'source'=>['sys-dic']}, @lingo)
|
159
|
+
assert_equal([lx('nase|s')], dic.select('nase'))
|
160
|
+
assert_equal([lx('nase|s')], dic.select('NASE'))
|
161
|
+
assert_equal([], dic.select('hasennasen'))
|
162
|
+
dic.close
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_select_two_sources_mode_first
|
166
|
+
dic = Lingo::Dictionary.new({'source'=>['sys-dic', 'tst-dic'], 'mode'=>'first'}, @lingo)
|
167
|
+
# in keiner Quelle vorhanden
|
168
|
+
assert_equal([], dic.select('hasennasen'))
|
169
|
+
# nur in erster Quelle vorhanden
|
170
|
+
assert_equal([lx('knaller|s')], dic.select('knaller'))
|
171
|
+
# nur in zweiter Quelle vorhanden
|
172
|
+
assert_equal([lx('super indexierungssystem|m')], dic.select('lex-lingo'))
|
173
|
+
# in beiden Quellen vorhanden
|
174
|
+
assert_equal([lx('a-dur|s')], dic.select('a-dur'))
|
175
|
+
dic.close
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_select_two_sources_mode_first_flipped
|
179
|
+
dic = Lingo::Dictionary.new({'source'=>['tst-dic','sys-dic'], 'mode'=>'first'}, @lingo)
|
180
|
+
# in keiner Quelle vorhanden
|
181
|
+
assert_equal([], dic.select('hasennasen'))
|
182
|
+
# nur in erster Quelle vorhanden
|
183
|
+
assert_equal([lx('knaller|s')], dic.select('knaller'))
|
184
|
+
# nur in zweiter Quelle vorhanden
|
185
|
+
assert_equal([lx('super indexierungssystem|m')], dic.select('lex-lingo'))
|
186
|
+
# in beiden Quellen vorhanden
|
187
|
+
assert_equal([lx('b-dur|s')], dic.select('a-dur'))
|
188
|
+
dic.close
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_select_two_sources_mode_all
|
192
|
+
dic = Lingo::Dictionary.new({'source'=>['sys-dic','tst-dic'], 'mode'=>'all'}, @lingo)
|
193
|
+
# in keiner Quelle vorhanden
|
194
|
+
assert_equal([], dic.select('hasennasen'))
|
195
|
+
# nur in erster Quelle vorhanden
|
196
|
+
assert_equal([lx('knaller|s')], dic.select('knaller'))
|
197
|
+
# nur in zweiter Quelle vorhanden
|
198
|
+
assert_equal([lx('super indexierungssystem|m')], dic.select('lex-lingo'))
|
199
|
+
# in beiden Quellen vorhanden
|
200
|
+
assert_equal([lx('a-dur|s'), lx('b-dur|s')], dic.select('a-dur'))
|
201
|
+
assert_equal([lx('aas|s')], dic.select('aas'))
|
202
|
+
dic.close
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_select_two_sources_mode_default
|
206
|
+
dic = Lingo::Dictionary.new({'source'=>['sys-dic','tst-dic']}, @lingo)
|
207
|
+
# in keiner Quelle vorhanden
|
208
|
+
assert_equal([], dic.select('hasennasen'))
|
209
|
+
# nur in erster Quelle vorhanden
|
210
|
+
assert_equal([lx('knaller|s')], dic.select('knaller'))
|
211
|
+
# nur in zweiter Quelle vorhanden
|
212
|
+
assert_equal([lx('super indexierungssystem|m')], dic.select('lex-lingo'))
|
213
|
+
# in beiden Quellen vorhanden
|
214
|
+
assert_equal([lx('a-dur|s'), lx('b-dur|s')], dic.select('a-dur'))
|
215
|
+
assert_equal([lx('aas|s')], dic.select('aas'))
|
216
|
+
dic.close
|
217
|
+
end
|
218
|
+
|
219
|
+
def test_suffix_lexicals
|
220
|
+
dic = Lingo::Dictionary.new({'source'=>['sys-dic']}, @lingo)
|
221
|
+
assert_equal([lx('mau|s'), lx('mauer|s')], dic.suffix_lexicals('mauern'))
|
222
|
+
assert_equal([lx('hasen|s'), lx('hasen|v'), lx('hasen|e')], dic.suffix_lexicals('hasens'))
|
223
|
+
assert_equal([lx('schönst|s'), lx('schön|a'), lx('schönst|a')], dic.suffix_lexicals('schönster'))
|
224
|
+
assert_equal([lx('segnen|v'), lx('segneen|v')], dic.suffix_lexicals('segnet'))
|
225
|
+
dic.close
|
226
|
+
end
|
227
|
+
|
228
|
+
def test_infix_lexicals
|
229
|
+
dic = Lingo::Dictionary.new({'source'=>['sys-dic']}, @lingo)
|
230
|
+
assert_equal( [lx('information|s'), lx('information|v'), lx('information|e')], dic.suffix_lexicals('informations'))
|
231
|
+
dic.close
|
232
|
+
end
|
233
|
+
|
234
|
+
def test_select_with_suffix
|
235
|
+
dic = Lingo::Dictionary.new({'source'=>['sys-dic']}, @lingo)
|
236
|
+
assert_equal([lx('mauern|v')], dic.select_with_suffix('mauern'))
|
237
|
+
assert_equal([lx('hase|s')], dic.select_with_suffix('hasen'))
|
238
|
+
assert_equal([lx('schön|a')], dic.select_with_suffix('schönster'))
|
239
|
+
assert_equal([lx('segnen|v')], dic.select_with_suffix('segnet'))
|
240
|
+
dic.close
|
241
|
+
end
|
242
|
+
|
243
|
+
def test_select_with_infix
|
244
|
+
dic = Lingo::Dictionary.new({'source'=>['sys-dic']}, @lingo)
|
245
|
+
assert_equal( [lx('information|s'), lx('information|v'), lx('information|e')], dic.suffix_lexicals('informations'))
|
246
|
+
dic.close
|
247
|
+
end
|
248
|
+
|
249
|
+
def test_find_word
|
250
|
+
dic = Lingo::Dictionary.new({'source'=>['sys-dic']}, @lingo)
|
251
|
+
assert_equal(wd('hasennasen|?'), dic.find_word('hasennasen'))
|
252
|
+
assert_equal(wd('hase|IDF', 'hase|s'), dic.find_word('hase'))
|
253
|
+
assert_equal(wd('haseses|IDF', 'hase|s'), dic.find_word('haseses'))
|
254
|
+
dic.close
|
255
|
+
end
|
256
|
+
|
257
|
+
end
|
258
|
+
|
259
|
+
class TestGrammar < LingoTestCase
|
260
|
+
|
261
|
+
def setup
|
262
|
+
@lingo = Lingo.new
|
263
|
+
end
|
264
|
+
|
265
|
+
def test_params
|
266
|
+
# Die gleichen Fälle wie bei Dictionary, daher nicht notwendig
|
267
|
+
end
|
268
|
+
|
269
|
+
def test_cache
|
270
|
+
gra = Lingo::Grammar.new({'source'=>['sys-dic']}, @lingo)
|
271
|
+
assert_equal(
|
272
|
+
wd('informationswissenschaften|KOM', 'informationswissenschaft|k', 'information|s+', 'wissenschaft|s+'),
|
273
|
+
gra.find_compositum('informationswissenschaften')
|
274
|
+
)
|
275
|
+
assert_equal(
|
276
|
+
wd('informationswissenschaften|KOM', 'informationswissenschaft|k', 'information|s+', 'wissenschaft|s+'),
|
277
|
+
gra.find_compositum('informationswissenschaften')
|
278
|
+
)
|
279
|
+
assert_equal(
|
280
|
+
wd('informationswissenschaften|KOM', 'informationswissenschaft|k', 'information|s+', 'wissenschaft|s+'),
|
281
|
+
gra.find_compositum('informationswissenschaften')
|
282
|
+
)
|
283
|
+
gra.close
|
284
|
+
end
|
285
|
+
|
286
|
+
def t1est_test_compositum
|
287
|
+
gra = Lingo::Grammar.new({'source'=>['sys-dic']}, @lingo)
|
288
|
+
# hinterer Teil ist ein Wort mit Suffix
|
289
|
+
assert_equal([ [5, 6], [lx('hasenbraten|k'), lx('braten|s'), lx('hase|s'), lx('braten|v')] ],
|
290
|
+
gra.test_compositum('hasen', '', 'braten', 1, false)
|
291
|
+
)
|
292
|
+
# hinterer Teil ist ein Wort mit Infix ohne Schwanz
|
293
|
+
assert_equal([ [5, 7], [lx('nasenlaufen|k'), lx('laufen|s'), lx('nase|s'), lx('laufen|v')] ],
|
294
|
+
gra.test_compositum('nasen', '', 'laufens', 1, false)
|
295
|
+
)
|
296
|
+
# hinterer Teil ist ein Wort mit Infix mit Schwanz
|
297
|
+
assert_equal([ [5, 7], [lx('nasenlaufens|k'), lx('laufen|s'), lx('nase|s'), lx('laufen|v')] ],
|
298
|
+
gra.test_compositum('nasen', '', 'laufens', 1, true)
|
299
|
+
)
|
300
|
+
# hinterer Teil ist ein Kompositum nach Bindestrich
|
301
|
+
assert_equal([ [7, 9, 6], [lx('arrafat-nachfolgebedarf|k'), lx('bedarf|s'), lx('nachfolge|s'), lx('arrafat|x')] ],
|
302
|
+
gra.test_compositum('arrafat', '-', 'nachfolgebedarf', 1, false)
|
303
|
+
)
|
304
|
+
# hinterer Teil ist ein TakeItAsIs nach Bindestrich
|
305
|
+
assert_equal([ [9, 7], [lx('nachfolge-arrafat|k'), lx('nachfolge|s'), lx('arrafat|x')] ],
|
306
|
+
gra.test_compositum('nachfolge', '-', 'arrafat', 1, false)
|
307
|
+
)
|
308
|
+
# vorderer Teil ist ein Wort mit Suffix => siehe Hasenbraten
|
309
|
+
# vorderer Teil ist ein Kompositum
|
310
|
+
assert_equal([ [6, 5, 6], [lx('morgenonkelmantel|k'), lx('mantel|s'), lx('morgen|s'), lx('onkel|s'), lx('morgen|w')] ],
|
311
|
+
gra.test_compositum('morgenonkel', '', 'mantel', 1, false)
|
312
|
+
)
|
313
|
+
# vorderer Teil ist ein TakeItAsIs vor Bindestrich
|
314
|
+
assert_equal([ [7, 10], [lx('arrafat-nachfolger|k'), lx('nachfolger|s'), lx('arrafat|x')] ],
|
315
|
+
gra.test_compositum('arrafat', '-', 'nachfolger', 1, false)
|
316
|
+
)
|
317
|
+
gra.close
|
318
|
+
end
|
319
|
+
|
320
|
+
def t1est_permute_compositum
|
321
|
+
gra = Lingo::Grammar.new({'source'=>['sys-dic']}, @lingo)
|
322
|
+
# bindestrichversion
|
323
|
+
assert_equal([ [7, 10], [lx('arrafat-nachfolger|k'), lx('nachfolger|s'), lx('arrafat|x')] ],
|
324
|
+
gra.permute_compositum('arrafat-nachfolger', 1, false)
|
325
|
+
)
|
326
|
+
# bindestrichversion zwei-teilig
|
327
|
+
assert_equal([ [6, 11], \
|
328
|
+
[ lx('cd-rom-technologie|k'), \
|
329
|
+
lx('cd-rom|s'), \
|
330
|
+
lx('technologie|s')] ], \
|
331
|
+
gra.permute_compositum('cd-rom-technologie', 1, false) \
|
332
|
+
)
|
333
|
+
# bindestrichversion drei-teilig
|
334
|
+
assert_equal([ [6, 7, 11], \
|
335
|
+
[ lx('albert-ludwigs-universität|k'), \
|
336
|
+
lx('universität|s'), \
|
337
|
+
lx('albert|e'), \
|
338
|
+
lx('ludwig|e')] ], \
|
339
|
+
gra.permute_compositum('albert-ludwigs-universität', 1, false) \
|
340
|
+
)
|
341
|
+
# normal mit suggestion
|
342
|
+
assert_equal([ [8, 9], \
|
343
|
+
[ lx('benutzerforschung|k'), \
|
344
|
+
lx('benutzer|s'), \
|
345
|
+
lx('forschung|s')] ], \
|
346
|
+
gra.permute_compositum('benutzerforschung', 1, false) \
|
347
|
+
)
|
348
|
+
gra.close
|
349
|
+
end
|
350
|
+
|
351
|
+
def test_find_compositum
|
352
|
+
gra = Lingo::Grammar.new({'source'=>['sys-dic']}, @lingo)
|
353
|
+
assert_equal(
|
354
|
+
wd('informationswissenschaften|KOM', 'informationswissenschaft|k', 'information|s+', 'wissenschaft|s+'),
|
355
|
+
gra.find_compositum('informationswissenschaften') \
|
356
|
+
)
|
357
|
+
assert_equal(
|
358
|
+
wd('cd-rom-technologie|KOM', 'cd-rom-technologie|k', 'technologie|s+', 'cd-rom|x+'),
|
359
|
+
gra.find_compositum('cd-rom-technologie')
|
360
|
+
)
|
361
|
+
assert_equal(
|
362
|
+
wd('albert-ludwigs-universität|KOM', 'albert-ludwigs-universität|k', 'albert|e+', 'ludwig|e+', 'universität|s+'),
|
363
|
+
gra.find_compositum('albert-ludwigs-universität')
|
364
|
+
)
|
365
|
+
assert_equal(
|
366
|
+
wd('client-server-system|KOM', 'client-server-system|k', 'client|s+', 'server|s+', 'system|s+'),
|
367
|
+
gra.find_compositum('client-server-system')
|
368
|
+
)
|
369
|
+
assert_equal(
|
370
|
+
wd('benutzerforschung|KOM', 'benutzerforschung|k', 'erforschung|s+', 'benutzen|v+'),
|
371
|
+
gra.find_compositum('benutzerforschung')
|
372
|
+
)
|
373
|
+
assert_equal(
|
374
|
+
wd('clustersuche|KOM', 'clustersuche|k', 'cluster|s+', 'suche|s+', 'suchen|v+'),
|
375
|
+
gra.find_compositum('clustersuche')
|
376
|
+
)
|
377
|
+
gra.close
|
378
|
+
end
|
379
|
+
|
380
|
+
def test_min_word_size
|
381
|
+
gra = Lingo::Grammar.new({'source'=>['sys-dic']}, @lingo)
|
382
|
+
assert_equal( wd('undsund|?'), gra.find_compositum('undsund'))
|
383
|
+
gra.close
|
384
|
+
end
|
385
|
+
|
386
|
+
def test_max_parts
|
387
|
+
gra = Lingo::Grammar.new({'source'=>['sys-dic']}, @lingo)
|
388
|
+
assert_equal(
|
389
|
+
wd('baumsbaumsbaum|KOM', 'baumsbaumsbaum|k', 'baum|s+'),
|
390
|
+
gra.find_compositum('baumsbaumsbaum')
|
391
|
+
)
|
392
|
+
assert_equal( Lingo::Word.new('baumsbaumsbaumsbaumsbaumsbaum', Lingo::WA_UNKNOWN), gra.find_compositum('baumsbaumsbaumsbaumsbaumsbaum'))
|
393
|
+
gra.close
|
394
|
+
end
|
395
|
+
|
396
|
+
end
|