lingo 1.8.4.2 → 1.8.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog +413 -325
- data/README +380 -131
- data/Rakefile +19 -21
- data/de/lingo-abk.txt +15 -17
- data/de/lingo-dic.txt +20210 -20659
- data/de/lingo-mul.txt +5 -13
- data/de/lingo-syn.txt +5 -8
- data/de/test_dic.txt +2 -0
- data/de/test_gen.txt +8 -0
- data/de/{test_mul2.txt → test_mu2.txt} +0 -0
- data/de/{test_singleword.txt → test_sgw.txt} +0 -0
- data/de/user-dic.txt +5 -7
- data/de.lang +64 -49
- data/en/lingo-dic.txt +6398 -6404
- data/en/lingo-irr.txt +2 -3
- data/en/lingo-mul.txt +6 -7
- data/en/lingo-wdn.txt +881 -1762
- data/en/user-dic.txt +2 -5
- data/en.lang +39 -39
- data/lib/lingo/app.rb +10 -6
- data/lib/lingo/attendee/abbreviator.rb +1 -0
- data/lib/lingo/attendee/decomposer.rb +2 -1
- data/lib/lingo/attendee/multi_worder.rb +5 -6
- data/lib/lingo/attendee/stemmer.rb +1 -1
- data/lib/lingo/attendee/synonymer.rb +4 -2
- data/lib/lingo/attendee/text_reader.rb +77 -57
- data/lib/lingo/attendee/text_writer.rb +1 -1
- data/lib/lingo/attendee/tokenizer.rb +101 -50
- data/lib/lingo/attendee/variator.rb +2 -1
- data/lib/lingo/attendee/vector_filter.rb +28 -6
- data/lib/lingo/attendee/word_searcher.rb +2 -1
- data/lib/lingo/attendee.rb +8 -4
- data/lib/lingo/call.rb +7 -3
- data/lib/lingo/cli.rb +8 -16
- data/lib/lingo/config.rb +11 -6
- data/lib/lingo/ctl.rb +54 -3
- data/lib/lingo/database/crypter.rb +8 -14
- data/lib/lingo/database/hash_store.rb +1 -1
- data/lib/lingo/database/{show_progress.rb → progress.rb} +7 -8
- data/lib/lingo/database/source/key_value.rb +6 -5
- data/lib/lingo/database/source/multi_key.rb +5 -2
- data/lib/lingo/database/source/multi_value.rb +6 -4
- data/lib/lingo/database/source/single_word.rb +2 -3
- data/lib/lingo/database/source/word_class.rb +24 -5
- data/lib/lingo/database/source.rb +5 -3
- data/lib/lingo/database.rb +102 -41
- data/lib/lingo/error.rb +24 -2
- data/lib/lingo/language/dictionary.rb +26 -54
- data/lib/lingo/language/grammar.rb +19 -23
- data/lib/lingo/language/lexical.rb +5 -1
- data/lib/lingo/language/lexical_hash.rb +7 -12
- data/lib/lingo/language/token.rb +10 -1
- data/lib/lingo/language/word.rb +35 -23
- data/lib/lingo/language/word_form.rb +5 -4
- data/lib/lingo/{show_progress.rb → progress.rb} +43 -30
- data/lib/lingo/srv/lingosrv.cfg +1 -1
- data/lib/lingo/srv/public/.gitkeep +0 -0
- data/lib/lingo/srv.rb +11 -6
- data/lib/lingo/version.rb +2 -2
- data/lib/lingo/web/lingoweb.cfg +1 -1
- data/lib/lingo/web/views/index.erb +4 -4
- data/lib/lingo/web.rb +4 -6
- data/lib/lingo.rb +4 -12
- data/lingo.cfg +1 -1
- data/lir.cfg +1 -1
- data/ru/lingo-dic.txt +33473 -2113
- data/ru/lingo-mul.txt +8430 -1913
- data/ru/lingo-syn.txt +1634 -0
- data/ru/user-dic.txt +6 -0
- data/ru.lang +49 -47
- data/spec/spec_helper.rb +4 -0
- data/test/attendee/ts_decomposer.rb +2 -2
- data/test/attendee/ts_synonymer.rb +3 -3
- data/test/attendee/ts_tokenizer.rb +215 -2
- data/test/attendee/ts_variator.rb +2 -2
- data/test/attendee/ts_word_searcher.rb +10 -6
- data/test/ref/artikel.seq +2 -2
- data/test/ref/artikel.vec +5 -5
- data/test/ref/artikel.ven +11 -11
- data/test/ref/artikel.ver +11 -11
- data/test/ref/lir.seq +13 -13
- data/test/ref/lir.vec +31 -31
- data/test/test_helper.rb +19 -5
- data/test/ts_database.rb +206 -77
- data/test/ts_language.rb +86 -26
- metadata +93 -49
- data/.rspec +0 -1
- data/de/test_syn2.txt +0 -1
data/test/ts_database.rb
CHANGED
@@ -2,16 +2,6 @@
|
|
2
2
|
|
3
3
|
require_relative 'test_helper'
|
4
4
|
|
5
|
-
class Lingo::Database
|
6
|
-
|
7
|
-
alias_method :original_convert, :convert
|
8
|
-
|
9
|
-
def convert(verbose = false)
|
10
|
-
original_convert(verbose)
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
5
|
class TestDatabase < LingoTestCase
|
16
6
|
|
17
7
|
def setup
|
@@ -29,6 +19,28 @@ ganz großer und blöder mist
|
|
29
19
|
ganz großer und blöder schwach sinn
|
30
20
|
EOT
|
31
21
|
|
22
|
+
@singleword_inflect = <<-EOT
|
23
|
+
Wort1
|
24
|
+
Wort2
|
25
|
+
juristisch person
|
26
|
+
natürliche personen
|
27
|
+
natürlichen quatsches
|
28
|
+
klug abel
|
29
|
+
lang essay
|
30
|
+
große kiefer
|
31
|
+
warm abendluft
|
32
|
+
klar abendluft
|
33
|
+
gut abitur
|
34
|
+
gut abitur schaffen
|
35
|
+
ein gut abitur
|
36
|
+
schmal rund zylinder
|
37
|
+
der schmal zylinder
|
38
|
+
wort mist
|
39
|
+
alt bibliothekskatalog
|
40
|
+
neu bibliothekskatalög
|
41
|
+
neu alttitelkatalog
|
42
|
+
EOT
|
43
|
+
|
32
44
|
@keyvalue = <<-EOT
|
33
45
|
Wort1*Projektion1
|
34
46
|
Wort2*Projektion2
|
@@ -55,14 +67,14 @@ Wort2=
|
|
55
67
|
compare({
|
56
68
|
'txt-format' => 'SingleWord'
|
57
69
|
}, @singleword, {
|
58
|
-
'wort1' => '#s',
|
59
|
-
'wort2' => '#s',
|
60
|
-
'juristische personen' => '#s',
|
61
|
-
'höher schneller weiter' => '#s',
|
62
|
-
'höher schneller weiter größer' => '#s',
|
63
|
-
'ganz großer und blöder quatsch' => '#s',
|
64
|
-
'ganz großer und blöder mist' => '#s',
|
65
|
-
'ganz großer und blöder schwach sinn' => '#s'
|
70
|
+
'wort1' => 'wort1#s',
|
71
|
+
'wort2' => 'wort2#s',
|
72
|
+
'juristische personen' => 'juristische personen#s',
|
73
|
+
'höher schneller weiter' => 'höher schneller weiter#s',
|
74
|
+
'höher schneller weiter größer' => 'höher schneller weiter größer#s',
|
75
|
+
'ganz großer und blöder quatsch' => 'ganz großer und blöder quatsch#s',
|
76
|
+
'ganz großer und blöder mist' => 'ganz großer und blöder mist#s',
|
77
|
+
'ganz großer und blöder schwach sinn' => 'ganz großer und blöder schwach sinn#s'
|
66
78
|
})
|
67
79
|
end
|
68
80
|
|
@@ -71,14 +83,14 @@ Wort2=
|
|
71
83
|
'txt-format' => 'SingleWord',
|
72
84
|
'def-wc' => '*'
|
73
85
|
}, @singleword, {
|
74
|
-
'wort1' => '#*',
|
75
|
-
'wort2' => '#*',
|
76
|
-
'juristische personen' => '#*',
|
77
|
-
'höher schneller weiter' => '#*',
|
78
|
-
'höher schneller weiter größer' => '#*',
|
79
|
-
'ganz großer und blöder quatsch' => '#*',
|
80
|
-
'ganz großer und blöder mist' => '#*',
|
81
|
-
'ganz großer und blöder schwach sinn' => '#*'
|
86
|
+
'wort1' => 'wort1#*',
|
87
|
+
'wort2' => 'wort2#*',
|
88
|
+
'juristische personen' => 'juristische personen#*',
|
89
|
+
'höher schneller weiter' => 'höher schneller weiter#*',
|
90
|
+
'höher schneller weiter größer' => 'höher schneller weiter größer#*',
|
91
|
+
'ganz großer und blöder quatsch' => 'ganz großer und blöder quatsch#*',
|
92
|
+
'ganz großer und blöder mist' => 'ganz großer und blöder mist#*',
|
93
|
+
'ganz großer und blöder schwach sinn' => 'ganz großer und blöder schwach sinn#*'
|
82
94
|
})
|
83
95
|
end
|
84
96
|
|
@@ -87,14 +99,14 @@ Wort2=
|
|
87
99
|
'txt-format' => 'SingleWord',
|
88
100
|
'def-mul-wc' => 'm'
|
89
101
|
}, @singleword, {
|
90
|
-
'wort1' => '#s',
|
91
|
-
'wort2' => '#s',
|
92
|
-
'juristische personen' => '#m',
|
93
|
-
'höher schneller weiter' => '#m',
|
94
|
-
'höher schneller weiter größer' => '#m',
|
95
|
-
'ganz großer und blöder quatsch' => '#m',
|
96
|
-
'ganz großer und blöder mist' => '#m',
|
97
|
-
'ganz großer und blöder schwach sinn' => '#m'
|
102
|
+
'wort1' => 'wort1#s',
|
103
|
+
'wort2' => 'wort2#s',
|
104
|
+
'juristische personen' => 'juristische personen#m',
|
105
|
+
'höher schneller weiter' => 'höher schneller weiter#m',
|
106
|
+
'höher schneller weiter größer' => 'höher schneller weiter größer#m',
|
107
|
+
'ganz großer und blöder quatsch' => 'ganz großer und blöder quatsch#m',
|
108
|
+
'ganz großer und blöder mist' => 'ganz großer und blöder mist#m',
|
109
|
+
'ganz großer und blöder schwach sinn' => 'ganz großer und blöder schwach sinn#m'
|
98
110
|
})
|
99
111
|
end
|
100
112
|
|
@@ -107,11 +119,11 @@ Wort2=
|
|
107
119
|
'separator' => '='
|
108
120
|
)
|
109
121
|
}, @singleword, {
|
110
|
-
'wort1' => '#s',
|
111
|
-
'wort2' => '#s',
|
122
|
+
'wort1' => 'wort1#s',
|
123
|
+
'wort2' => 'wort2#s',
|
112
124
|
'ganz groß und blöd mist' => 'ganz großer und blöder mist#s',
|
113
125
|
'juristisch person' => 'juristische personen#s',
|
114
|
-
'hoch schnell weit' => '
|
126
|
+
'hoch schnell weit' => 'höher schneller weiter#s|*4',
|
115
127
|
'ganz groß und blöd quatsch' => 'ganz großer und blöder quatsch#s',
|
116
128
|
'hoch schnell weit groß' => 'höher schneller weiter größer#s',
|
117
129
|
'ganz groß und blöd schwach sinn' => 'ganz großer und blöder schwach sinn#s',
|
@@ -119,33 +131,125 @@ Wort2=
|
|
119
131
|
})
|
120
132
|
end
|
121
133
|
|
134
|
+
def test_singleword_inflect
|
135
|
+
compare({
|
136
|
+
'txt-format' => 'SingleWord',
|
137
|
+
'use-lex' => set_config('lex',
|
138
|
+
'name' => 'de/lingo-dic.txt',
|
139
|
+
'txt-format' => 'WordClass',
|
140
|
+
'separator' => '='
|
141
|
+
),
|
142
|
+
'inflect' => true
|
143
|
+
}, @singleword_inflect, {
|
144
|
+
'wort1' => 'wort1#s',
|
145
|
+
'wort2' => 'wort2#s',
|
146
|
+
'juristisch person' => 'juristische person#s',
|
147
|
+
'natürlich person' => 'natürliche personen#s',
|
148
|
+
'natürlich quatsch' => 'natürlichen quatsches#s',
|
149
|
+
'lang essay' => 'langer essay#s',
|
150
|
+
'groß kiefer' => 'große kiefer#s',
|
151
|
+
'klug abel' => 'kluger abel#s',
|
152
|
+
'warm abendluft' => 'warme abendluft#s',
|
153
|
+
'klar abendluft' => 'klare abendluft#s',
|
154
|
+
'gut abitur' => 'gutes abitur#s',
|
155
|
+
'gut abitur schaff' => 'gutes abitur schaffen#s',
|
156
|
+
'ein gut abitur' => 'ein gut abitur#s',
|
157
|
+
'schmal rund zylinder' => 'schmaler runder zylinder#s',
|
158
|
+
'der schmal zylinder' => 'der schmal zylinder#s',
|
159
|
+
'wort mist' => 'wort mist#s',
|
160
|
+
'alt bibliothekskatalog' => 'alter bibliothekskatalog#s',
|
161
|
+
'neu bibliothekskatalög' => 'neu bibliothekskatalög#s',
|
162
|
+
'neu alttitelkatalog' => 'neuer alttitelkatalog#s'
|
163
|
+
})
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_singleword_inflect_s
|
167
|
+
compare({
|
168
|
+
'txt-format' => 'SingleWord',
|
169
|
+
'use-lex' => set_config('lex',
|
170
|
+
'name' => 'de/lingo-dic.txt',
|
171
|
+
'txt-format' => 'WordClass',
|
172
|
+
'separator' => '='
|
173
|
+
),
|
174
|
+
'inflect' => 's'
|
175
|
+
}, @singleword_inflect, {
|
176
|
+
'wort1' => 'wort1#s',
|
177
|
+
'wort2' => 'wort2#s',
|
178
|
+
'juristisch person' => 'juristische person#s',
|
179
|
+
'natürlich person' => 'natürliche personen#s',
|
180
|
+
'natürlich quatsch' => 'natürlichen quatsches#s',
|
181
|
+
'lang essay' => 'langer essay#s',
|
182
|
+
'groß kiefer' => 'große kiefer#s',
|
183
|
+
'klug abel' => 'klug abel#s',
|
184
|
+
'warm abendluft' => 'warme abendluft#s',
|
185
|
+
'klar abendluft' => 'klare abendluft#s',
|
186
|
+
'gut abitur' => 'gutes abitur#s',
|
187
|
+
'gut abitur schaff' => 'gutes abitur schaffen#s',
|
188
|
+
'ein gut abitur' => 'ein gut abitur#s',
|
189
|
+
'schmal rund zylinder' => 'schmaler runder zylinder#s',
|
190
|
+
'der schmal zylinder' => 'der schmal zylinder#s',
|
191
|
+
'wort mist' => 'wort mist#s',
|
192
|
+
'alt bibliothekskatalog' => 'alter bibliothekskatalog#s',
|
193
|
+
'neu bibliothekskatalög' => 'neu bibliothekskatalög#s',
|
194
|
+
'neu alttitelkatalog' => 'neuer alttitelkatalog#s'
|
195
|
+
})
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_singleword_inflect_e
|
199
|
+
compare({
|
200
|
+
'txt-format' => 'SingleWord',
|
201
|
+
'use-lex' => set_config('lex',
|
202
|
+
'name' => 'de/lingo-dic.txt',
|
203
|
+
'txt-format' => 'WordClass',
|
204
|
+
'separator' => '='
|
205
|
+
),
|
206
|
+
'inflect' => 'e'
|
207
|
+
}, @singleword_inflect, {
|
208
|
+
'wort1' => 'wort1#s',
|
209
|
+
'wort2' => 'wort2#s',
|
210
|
+
'juristisch person' => 'juristisch person#s',
|
211
|
+
'natürlich person' => 'natürliche personen#s',
|
212
|
+
'natürlich quatsch' => 'natürlichen quatsches#s',
|
213
|
+
'lang essay' => 'lang essay#s',
|
214
|
+
'klug abel' => 'kluger abel#s',
|
215
|
+
'groß kiefer' => 'große kiefer#s',
|
216
|
+
'warm abendluft' => 'warm abendluft#s',
|
217
|
+
'klar abendluft' => 'klar abendluft#s',
|
218
|
+
'gut abitur' => 'gut abitur#s',
|
219
|
+
'gut abitur schaff' => 'gut abitur schaffen#s',
|
220
|
+
'ein gut abitur' => 'ein gut abitur#s',
|
221
|
+
'schmal rund zylinder' => 'schmal rund zylinder#s',
|
222
|
+
'der schmal zylinder' => 'der schmal zylinder#s',
|
223
|
+
'wort mist' => 'wort mist#s',
|
224
|
+
'alt bibliothekskatalog' => 'alt bibliothekskatalog#s',
|
225
|
+
'neu bibliothekskatalög' => 'neu bibliothekskatalög#s',
|
226
|
+
'neu alttitelkatalog' => 'neu alttitelkatalog#s'
|
227
|
+
})
|
228
|
+
end
|
229
|
+
|
122
230
|
def test_singleword_crypt
|
123
|
-
|
231
|
+
compare({
|
124
232
|
'txt-format' => 'SingleWord',
|
125
233
|
'crypt' => true
|
126
|
-
}
|
234
|
+
}, @singleword) { |db| hash = db.to_h; {
|
235
|
+
'wort1' => 'wort1#s',
|
236
|
+
'wort2' => 'wort2#s',
|
237
|
+
'juristische personen' => 'juristische personen#s',
|
238
|
+
'höher schneller weiter' => 'höher schneller weiter#s',
|
239
|
+
'höher schneller weiter größer' => 'höher schneller weiter größer#s',
|
240
|
+
'ganz großer und blöder quatsch' => 'ganz großer und blöder quatsch#s',
|
241
|
+
'ganz großer und blöder mist' => 'ganz großer und blöder mist#s',
|
242
|
+
'ganz großer und blöder schwach sinn' => 'ganz großer und blöder schwach sinn#s'
|
243
|
+
}.each { |key, val|
|
244
|
+
assert_nil(hash[key])
|
245
|
+
assert_equal([val], db[key])
|
127
246
|
|
128
|
-
|
129
|
-
|
130
|
-
'81463f9c7e0ad40e329e83d3358232851d50ed9a' => '4d16',
|
131
|
-
'8da4a0c30c912543be2d88da64c0192e577efa9d' => '1107',
|
132
|
-
'2c24b4707e77c74abfb12748317693dc1e43c215' => '5700',
|
133
|
-
'810ff7a76f39febcb1cf67993d4fb29819ce40a6' => '5116',
|
134
|
-
'a28b4ca84ac08aeef4e420445f94f632ad010a30' => '1207',
|
135
|
-
'1496f4febbc647f3ac74b0af11dadbd6322f6732' => '4d1d',
|
136
|
-
'b7501a62cb083be6730a7a179a4ab346d23efe53' => '4b10'
|
137
|
-
})
|
247
|
+
assert_nil(db[digest = Lingo::Database::Crypter.digest(key)])
|
248
|
+
assert_not_equal(key, digest)
|
138
249
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
'juristische personen' => '#s',
|
143
|
-
'höher schneller weiter' => '#s',
|
144
|
-
'höher schneller weiter größer' => '#s',
|
145
|
-
'ganz großer und blöder quatsch' => '#s',
|
146
|
-
'ganz großer und blöder mist' => '#s',
|
147
|
-
'ganz großer und blöder schwach sinn' => '#s'
|
148
|
-
}.each { |key, val| assert_equal([val], db[key]) } }
|
250
|
+
assert_instance_of(String, encrypted = hash[digest])
|
251
|
+
assert_not_equal(val, encrypted)
|
252
|
+
} }
|
149
253
|
end
|
150
254
|
|
151
255
|
def test_keyvalue
|
@@ -198,10 +302,39 @@ Wort2=
|
|
198
302
|
Wort1=Projektion4 #e
|
199
303
|
Wort1=#s
|
200
304
|
Wort2=
|
305
|
+
Wort4.illegal
|
306
|
+
Wort4=still illegal
|
307
|
+
Wort4=still illegal#s!
|
308
|
+
Wort4=now we're talking#s+
|
309
|
+
}, {
|
310
|
+
'wort1' => 'projektion1#h#|projektion4#e#',
|
311
|
+
'wort2' => 'projektion2#i#',
|
312
|
+
'wort3' => 'projektion3#e#',
|
313
|
+
'wort4' => "now we're talking#s+#"
|
314
|
+
})
|
315
|
+
end
|
316
|
+
|
317
|
+
def test_wordclass_gender
|
318
|
+
compare({
|
319
|
+
'txt-format' => 'WordClass'
|
320
|
+
}, %q{
|
321
|
+
substantiv,substantiv #a substantiv #s.n
|
322
|
+
mehr,mehr #w mehr #s.n mehren #v
|
323
|
+
wort,wort #s.n
|
324
|
+
gruppe,gruppe #s.f
|
325
|
+
modul,modul #s.m|n
|
326
|
+
nocken,nock #s.f|m|n nocke #s.f nocken #s.m
|
327
|
+
albern,albern #a|v
|
328
|
+
fortuna,fortuna #e|s.f
|
201
329
|
}, {
|
202
|
-
'
|
203
|
-
'
|
204
|
-
'
|
330
|
+
'substantiv' => 'substantiv#a#|substantiv#s#n',
|
331
|
+
'mehr' => 'mehr#w#|mehr#s#n|mehren#v#',
|
332
|
+
'wort' => 'wort#s#n',
|
333
|
+
'gruppe' => 'gruppe#s#f',
|
334
|
+
'modul' => 'modul#s#m|modul#s#n',
|
335
|
+
'nocken' => 'nock#s#f|nock#s#m|nock#s#n|nocke#s#f|nocken#s#m',
|
336
|
+
'albern' => 'albern#a#|albern#v#',
|
337
|
+
'fortuna' => 'fortuna#e#f|fortuna#s#f'
|
205
338
|
})
|
206
339
|
end
|
207
340
|
|
@@ -215,21 +348,17 @@ Wort2=
|
|
215
348
|
Rasen;Gras;Grüne Fläche
|
216
349
|
Rasen;Rennen;Wettrennen
|
217
350
|
}, {
|
218
|
-
'
|
219
|
-
'
|
220
|
-
'
|
221
|
-
'
|
222
|
-
'
|
223
|
-
'
|
224
|
-
'
|
225
|
-
'
|
226
|
-
'
|
227
|
-
'
|
228
|
-
'
|
229
|
-
'gras' => '^2',
|
230
|
-
'grüne fläche' => '^2',
|
231
|
-
'wettrennen' => '^3',
|
232
|
-
'rennen' => '^3'
|
351
|
+
'hasen' => 'hasen|nasen|vasen|rasen',
|
352
|
+
'nasen' => 'hasen|nasen|vasen|rasen',
|
353
|
+
'vasen' => 'hasen|nasen|vasen|rasen',
|
354
|
+
'rasen' => 'hasen|nasen|vasen|rasen|gras|grüne fläche|rennen|wettrennen',
|
355
|
+
'gold' => 'gold|edelmetall|mehrwert',
|
356
|
+
'edelmetall' => 'gold|edelmetall|mehrwert',
|
357
|
+
'mehrwert' => 'gold|edelmetall|mehrwert',
|
358
|
+
'gras' => 'rasen|gras|grüne fläche',
|
359
|
+
'grüne fläche' => 'rasen|gras|grüne fläche',
|
360
|
+
'rennen' => 'rasen|rennen|wettrennen',
|
361
|
+
'wettrennen' => 'rasen|rennen|wettrennen'
|
233
362
|
})
|
234
363
|
end
|
235
364
|
|
data/test/ts_language.rb
CHANGED
@@ -27,9 +27,9 @@ class TestLexicalHash < LingoTestCase
|
|
27
27
|
|
28
28
|
def test_cache
|
29
29
|
lh('sys-dic') { |ds|
|
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
|
-
assert_equal([lx('regen|s'), lx('regen|v'), lx('rege|a')], ds['regen'])
|
30
|
+
assert_equal([lx('regen|s|m'), lx('regen|s|n'), lx('regen|v'), lx('rege|a')], ds['regen'])
|
31
|
+
assert_equal([lx('regen|s|m'), lx('regen|s|n'), lx('regen|v'), lx('rege|a')], ds['regen'])
|
32
|
+
assert_equal([lx('regen|s|m'), lx('regen|s|n'), lx('regen|v'), lx('rege|a')], ds['regen'])
|
33
33
|
}
|
34
34
|
end
|
35
35
|
|
@@ -57,7 +57,7 @@ class TestLexicalHash < LingoTestCase
|
|
57
57
|
def test_keyvalue
|
58
58
|
lh('sys-mul') { |ds|
|
59
59
|
assert_equal([lx('abelscher ring ohne nullteiler|m')], ds['abelscher ring ohne nullteiler'])
|
60
|
-
assert_equal([
|
60
|
+
assert_equal([4], ds['abelscher ring ohne'])
|
61
61
|
assert_equal([lx('alleinreisende frau|m')], ds['alleinreisend frau'])
|
62
62
|
assert_equal([lx('abschaltbarer leistungshalbleiter|m')], ds['abschaltbar leistungshalbleiter'])
|
63
63
|
assert_equal(nil, ds['abschaltbarer leistungshalbleiter'])
|
@@ -66,12 +66,25 @@ class TestLexicalHash < LingoTestCase
|
|
66
66
|
|
67
67
|
def test_wordclass
|
68
68
|
lh('sys-dic') { |ds|
|
69
|
-
assert_equal([lx('a-dur|s')], ds['a-dur'])
|
70
|
-
assert_equal([lx('aalen|
|
69
|
+
assert_equal([lx('a-dur|s|m'), lx('a-dur|s|n')], ds['a-dur'])
|
70
|
+
assert_equal([lx('aalen|e'), lx('aalen|v')], ds['aalen'])
|
71
71
|
assert_equal([lx('abarbeitend|a')], ds['abarbeitend'])
|
72
72
|
}
|
73
73
|
end
|
74
74
|
|
75
|
+
def test_wordclass_gender
|
76
|
+
lh('tst-gen') { |ds|
|
77
|
+
assert_equal([lx('substantiv|a'), lx('substantiv|s|n')], ds['substantiv'])
|
78
|
+
assert_equal([lx('mehr|w'), lx('mehr|s|n'), lx('mehren|v')], ds['mehr'])
|
79
|
+
assert_equal([lx('wort|s|n')], ds['wort'])
|
80
|
+
assert_equal([lx('gruppe|s|f')], ds['gruppe'])
|
81
|
+
assert_equal([lx('modul|s|m'), lx('modul|s|n')], ds['modul'])
|
82
|
+
assert_equal([lx('nock|s|f'), lx('nock|s|m'), lx('nock|s|n'), lx('nocke|s|f'), lx('nocken|s|m')], ds['nocken'])
|
83
|
+
assert_equal([lx('albern|a'), lx('albern|v')], ds['albern'])
|
84
|
+
assert_equal([lx('fortuna|e|f'), lx('fortuna|s|f')], ds['fortuna'])
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
75
88
|
def test_case
|
76
89
|
lh('sys-dic') { |ds|
|
77
90
|
assert_equal([lx('abänderung|s')], ds['abänderung'])
|
@@ -83,7 +96,7 @@ class TestLexicalHash < LingoTestCase
|
|
83
96
|
def test_multivalue
|
84
97
|
lh('sys-syn') { |ds|
|
85
98
|
assert_equal([lx('abbau <chemie>|y'), lx('chemische abbaureaktion|y'), lx('chemischer abbau|y'), lx('photochemischer abbau|y')], ds['abbaureaktion'])
|
86
|
-
assert_equal([lx('dependenz|y'), lx('
|
99
|
+
assert_equal([lx('dependenz|y'), lx('unselbständigkeit|y'), lx('unselbstständigkeit|y')], ds['abhängigkeit'])
|
87
100
|
}
|
88
101
|
end
|
89
102
|
|
@@ -136,7 +149,7 @@ class TestDictionary < LingoTestCase
|
|
136
149
|
# nur in zweiter Quelle vorhanden
|
137
150
|
assert_equal([lx('super indexierungssystem|m')], dic.select('lex-lingo'))
|
138
151
|
# in beiden Quellen vorhanden
|
139
|
-
assert_equal([lx('a-dur|s')], dic.select('a-dur'))
|
152
|
+
assert_equal([lx('a-dur|s|m'), lx('a-dur|s|n')], dic.select('a-dur'))
|
140
153
|
}
|
141
154
|
end
|
142
155
|
|
@@ -162,8 +175,8 @@ class TestDictionary < LingoTestCase
|
|
162
175
|
# nur in zweiter Quelle vorhanden
|
163
176
|
assert_equal([lx('super indexierungssystem|m')], dic.select('lex-lingo'))
|
164
177
|
# in beiden Quellen vorhanden
|
165
|
-
assert_equal([lx('a-dur|s'), lx('b-dur|s')], dic.select('a-dur'))
|
166
|
-
assert_equal([lx('aas|s')], dic.select('aas'))
|
178
|
+
assert_equal([lx('a-dur|s|m'), lx('a-dur|s|n'), lx('b-dur|s')], dic.select('a-dur'))
|
179
|
+
assert_equal([lx('aas|s|n'), lx('aas|s')], dic.select('aas'))
|
167
180
|
}
|
168
181
|
end
|
169
182
|
|
@@ -175,24 +188,26 @@ class TestDictionary < LingoTestCase
|
|
175
188
|
assert_equal([lx('knaller|s')], dic.select('knaller'))
|
176
189
|
# nur in zweiter Quelle vorhanden
|
177
190
|
assert_equal([lx('super indexierungssystem|m')], dic.select('lex-lingo'))
|
191
|
+
assert_equal([lx('wirkungsort|s'), lx('wirkung|s+'), lx('ort|s+')], dic.select('wirkungsort'))
|
192
|
+
assert_equal([lx('zettelkatalog|k'), lx('zettel|s+'), lx('katalog|s+')], dic.select('zettelkatalog'))
|
178
193
|
# in beiden Quellen vorhanden
|
179
|
-
assert_equal([lx('a-dur|s'), lx('b-dur|s')], dic.select('a-dur'))
|
180
|
-
assert_equal([lx('aas|s')], dic.select('aas'))
|
194
|
+
assert_equal([lx('a-dur|s|m'), lx('a-dur|s|n'), lx('b-dur|s')], dic.select('a-dur'))
|
195
|
+
assert_equal([lx('aas|s|n'), lx('aas|s')], dic.select('aas'))
|
181
196
|
}
|
182
197
|
end
|
183
198
|
|
184
199
|
def test_suffix_lexicals
|
185
200
|
ld('source' => %w[sys-dic]) { |dic|
|
186
|
-
assert_equal([lx('mau|s'), lx('mauer|s')], dic
|
187
|
-
assert_equal([lx('hasen|s'), lx('hasen|v'), lx('hasen|e')], dic
|
188
|
-
assert_equal([lx('schönst|s'), lx('schön|a'), lx('schönst|a')], dic
|
189
|
-
assert_equal([lx('segnen|v'), lx('segneen|v')], dic
|
201
|
+
assert_equal([lx('mau|s'), lx('mauer|s')], ax(dic, 'mauern'))
|
202
|
+
assert_equal([lx('hasen|s'), lx('hasen|v'), lx('hasen|e')], ax(dic, 'hasens'))
|
203
|
+
assert_equal([lx('schönst|s'), lx('schön|a'), lx('schönst|a')], ax(dic, 'schönster'))
|
204
|
+
assert_equal([lx('segnen|v'), lx('segneen|v')], ax(dic, 'segnet'))
|
190
205
|
}
|
191
206
|
end
|
192
207
|
|
193
208
|
def test_infix_lexicals
|
194
209
|
ld('source' => %w[sys-dic]) { |dic|
|
195
|
-
assert_equal( [lx('information|
|
210
|
+
assert_equal( [lx('information|f'), lx('informationsen|f')], ax(dic, 'informations', :infix))
|
196
211
|
}
|
197
212
|
end
|
198
213
|
|
@@ -207,7 +222,7 @@ class TestDictionary < LingoTestCase
|
|
207
222
|
|
208
223
|
def test_select_with_infix
|
209
224
|
ld('source' => %w[sys-dic]) { |dic|
|
210
|
-
assert_equal( [lx('information|
|
225
|
+
assert_equal( [lx('information|f'), lx('informationsen|f')], ax(dic, 'informations', :infix))
|
211
226
|
}
|
212
227
|
end
|
213
228
|
|
@@ -223,6 +238,10 @@ class TestDictionary < LingoTestCase
|
|
223
238
|
Lingo::Language::Dictionary.open(cfg, @lingo, &block)
|
224
239
|
end
|
225
240
|
|
241
|
+
def ax(dic, *args)
|
242
|
+
[].tap { |x| dic.each_affix(*args) { |*a| x << Lingo::Language::Lexical.new(*a) } }
|
243
|
+
end
|
244
|
+
|
226
245
|
end
|
227
246
|
|
228
247
|
class TestGrammar < LingoTestCase
|
@@ -260,7 +279,7 @@ class TestGrammar < LingoTestCase
|
|
260
279
|
)
|
261
280
|
|
262
281
|
assert_equal(
|
263
|
-
wd('cd-rom-technologie|KOM', 'cd-rom-technologie|k', 'cd-rom|s
|
282
|
+
wd('cd-rom-technologie|KOM', 'cd-rom-technologie|k', 'cd-rom|s+|f', 'cd-rom|s+|m', 'technologie|s+|f'),
|
264
283
|
gra.find_compound('cd-rom-technologie')
|
265
284
|
)
|
266
285
|
|
@@ -275,7 +294,7 @@ class TestGrammar < LingoTestCase
|
|
275
294
|
)
|
276
295
|
|
277
296
|
assert_equal(
|
278
|
-
wd('benutzerforschung|KOM', 'benutzerforschung|k', '
|
297
|
+
wd('benutzerforschung|KOM', 'benutzerforschung|k', 'benutzen|v+', 'erforschung|s+'),
|
279
298
|
gra.find_compound('benutzerforschung')
|
280
299
|
)
|
281
300
|
|
@@ -284,6 +303,21 @@ class TestGrammar < LingoTestCase
|
|
284
303
|
gra.find_compound('clustersuche')
|
285
304
|
)
|
286
305
|
|
306
|
+
assert_equal(
|
307
|
+
wd('titelkatalogstitel|KOM', 'titelkatalogstitel|k', 'titel|s+', 'katalog|s+', 'titel|s+'),
|
308
|
+
gra.find_compound('titelkatalogstitel')
|
309
|
+
)
|
310
|
+
|
311
|
+
assert_equal(
|
312
|
+
wd('titelkatalogstiteltitel|KOM', 'titelkatalogstiteltitel|k', 'titel|s+', 'katalog|s+', 'titel|s+', 'titel|s+'),
|
313
|
+
gra.find_compound('titelkatalogstiteltitel')
|
314
|
+
)
|
315
|
+
|
316
|
+
assert_equal(
|
317
|
+
wd('titelbestandsbestände|KOM', 'titelbestandsbestand|k', 'titel|s+', 'bestand|s+', 'bestand|s+', 'bestehen|v+'),
|
318
|
+
gra.find_compound('titelbestandsbestände')
|
319
|
+
)
|
320
|
+
|
287
321
|
# hinterer Teil ist ein Wort mit Suffix
|
288
322
|
assert_equal(
|
289
323
|
wd('hasenbraten|KOM', 'hasenbraten|k', 'hase|s+', 'braten|v+'),
|
@@ -304,7 +338,7 @@ class TestGrammar < LingoTestCase
|
|
304
338
|
|
305
339
|
# hinterer Teil ist ein Kompositum nach Bindestrich
|
306
340
|
assert_equal(
|
307
|
-
wd('arrafat-nachfolgebedarf|KOM', 'arrafat-nachfolgebedarf|k', '
|
341
|
+
wd('arrafat-nachfolgebedarf|KOM', 'arrafat-nachfolgebedarf|k', 'arrafat|x+', 'nachfolge|s+', 'bedarf|s+'),
|
308
342
|
gra.find_compound('arrafat-nachfolgebedarf')
|
309
343
|
)
|
310
344
|
|
@@ -317,19 +351,19 @@ class TestGrammar < LingoTestCase
|
|
317
351
|
# vorderer Teil ist ein Wort mit Suffix => siehe Hasenbraten
|
318
352
|
# vorderer Teil ist ein Kompositum
|
319
353
|
assert_equal(
|
320
|
-
wd('morgenonkelmantel|KOM', 'morgenonkelmantel|k', '
|
354
|
+
wd('morgenonkelmantel|KOM', 'morgenonkelmantel|k', 'morgen|w+', 'morgen|s+', 'onkel|s+', 'mantel|s+'),
|
321
355
|
gra.find_compound('morgenonkelmantel')
|
322
356
|
)
|
323
357
|
|
324
358
|
# vorderer Teil ist ein TakeItAsIs vor Bindestrich / bindestrichversion
|
325
359
|
assert_equal(
|
326
|
-
wd('arrafat-nachfolger|KOM', 'arrafat-nachfolger|k', '
|
360
|
+
wd('arrafat-nachfolger|KOM', 'arrafat-nachfolger|k', 'arrafat|x+', 'nachfolger|s+'),
|
327
361
|
gra.find_compound('arrafat-nachfolger')
|
328
362
|
)
|
329
363
|
|
330
364
|
# bindestrichversion zwei-teilig
|
331
365
|
assert_equal(
|
332
|
-
wd('cd-rom-technologie|KOM', 'cd-rom-technologie|k', 'cd-rom|s
|
366
|
+
wd('cd-rom-technologie|KOM', 'cd-rom-technologie|k', 'cd-rom|s+|f', 'cd-rom|s+|m', 'technologie|s+|f'),
|
333
367
|
gra.find_compound('cd-rom-technologie')
|
334
368
|
)
|
335
369
|
|
@@ -341,19 +375,45 @@ class TestGrammar < LingoTestCase
|
|
341
375
|
|
342
376
|
# normal mit suggestion
|
343
377
|
assert_equal(
|
344
|
-
wd('benutzerforschung|KOM', 'benutzerforschung|k', '
|
378
|
+
wd('benutzerforschung|KOM', 'benutzerforschung|k', 'benutzen|v+', 'erforschung|s+'),
|
345
379
|
gra.find_compound('benutzerforschung')
|
346
380
|
)
|
347
381
|
}
|
348
382
|
end
|
349
383
|
|
384
|
+
def test_head
|
385
|
+
lg { |gra|
|
386
|
+
assert_equal(
|
387
|
+
wd('suche|-', 'suche|s', 'suchen|v'),
|
388
|
+
gra.find_compound('clustersuche').head
|
389
|
+
)
|
390
|
+
|
391
|
+
assert_equal(
|
392
|
+
wd('titel|-', 'titel|s'),
|
393
|
+
gra.find_compound('titelkatalogstitel').head
|
394
|
+
)
|
395
|
+
|
396
|
+
assert_equal(
|
397
|
+
wd('titel|-', 'titel|s'),
|
398
|
+
gra.find_compound('titelkatalogstiteltitel').head
|
399
|
+
)
|
400
|
+
|
401
|
+
assert_equal(
|
402
|
+
wd('bestand|-', 'bestand|s', 'bestehen|v'),
|
403
|
+
gra.find_compound('titelbestandsbestände').head
|
404
|
+
)
|
405
|
+
|
406
|
+
assert_nil(gra.find_compound('bibliothekskatalög').head)
|
407
|
+
}
|
408
|
+
end
|
409
|
+
|
350
410
|
def test_min_word_size
|
351
411
|
lg { |gra| assert_equal( wd('undsund|?'), gra.find_compound('undsund')) }
|
352
412
|
end
|
353
413
|
|
354
414
|
def test_max_parts
|
355
415
|
lg { |gra|
|
356
|
-
assert_equal(wd('baumsbaumsbaum|KOM', 'baumsbaumsbaum|k', 'baum|s+'), gra.find_compound('baumsbaumsbaum'))
|
416
|
+
assert_equal(wd('baumsbaumsbaum|KOM', 'baumsbaumsbaum|k', 'baum|s+', 'baum|s+', 'baum|s+'), gra.find_compound('baumsbaumsbaum'))
|
357
417
|
assert_equal(wd('baumsbaumsbaumsbaumsbaumsbaum|?'), gra.find_compound('baumsbaumsbaumsbaumsbaumsbaum'))
|
358
418
|
}
|
359
419
|
end
|