lingo 1.8.6 → 1.8.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +40 -4
  3. data/README +22 -51
  4. data/Rakefile +3 -17
  5. data/config/lingo.cfg +24 -15
  6. data/config/lir.cfg +25 -16
  7. data/dict/de/test_muh.txt +6 -0
  8. data/dict/en/lingo-dic.txt +2 -3
  9. data/lang/de.lang +10 -9
  10. data/lang/en.lang +1 -1
  11. data/lib/lingo.rb +4 -4
  12. data/lib/lingo/attendee.rb +27 -7
  13. data/lib/lingo/attendee/analysis_filter.rb +81 -0
  14. data/lib/lingo/attendee/debug_filter.rb +42 -0
  15. data/lib/lingo/attendee/debugger.rb +2 -11
  16. data/lib/lingo/attendee/decomposer.rb +6 -3
  17. data/lib/lingo/attendee/formatter.rb +6 -6
  18. data/lib/lingo/attendee/hal_filter.rb +94 -0
  19. data/lib/lingo/attendee/lsi_filter.rb +99 -0
  20. data/lib/lingo/attendee/multi_worder.rb +69 -43
  21. data/lib/lingo/attendee/sequencer.rb +32 -19
  22. data/lib/lingo/attendee/synonymer.rb +2 -2
  23. data/lib/lingo/attendee/text_reader.rb +63 -92
  24. data/lib/lingo/attendee/text_writer.rb +12 -21
  25. data/lib/lingo/attendee/tokenizer.rb +32 -21
  26. data/lib/lingo/attendee/variator.rb +3 -3
  27. data/lib/lingo/attendee/vector_filter.rb +7 -9
  28. data/lib/lingo/attendee/word_searcher.rb +3 -3
  29. data/lib/lingo/buffered_attendee.rb +3 -36
  30. data/lib/lingo/config.rb +1 -1
  31. data/lib/lingo/ctl.rb +7 -155
  32. data/lib/lingo/ctl/analysis.rb +136 -0
  33. data/lib/lingo/ctl/files.rb +86 -0
  34. data/lib/lingo/ctl/other.rb +140 -0
  35. data/lib/lingo/database.rb +64 -60
  36. data/lib/lingo/database/crypter.rb +7 -5
  37. data/lib/lingo/error.rb +5 -4
  38. data/lib/lingo/language.rb +13 -5
  39. data/lib/lingo/language/grammar.rb +13 -7
  40. data/lib/lingo/language/token.rb +6 -0
  41. data/lib/lingo/language/word.rb +23 -36
  42. data/lib/lingo/language/word_form.rb +5 -1
  43. data/lib/lingo/srv.rb +2 -2
  44. data/lib/lingo/text_utils.rb +96 -0
  45. data/lib/lingo/version.rb +1 -1
  46. data/lib/lingo/web/views/index.erb +1 -1
  47. data/test/attendee/ts_decomposer.rb +23 -5
  48. data/test/attendee/ts_multi_worder.rb +66 -0
  49. data/test/attendee/ts_sequencer.rb +28 -4
  50. data/test/attendee/ts_text_reader.rb +20 -0
  51. data/test/attendee/ts_tokenizer.rb +20 -0
  52. data/test/attendee/ts_variator.rb +1 -1
  53. data/test/attendee/ts_word_searcher.rb +39 -3
  54. data/test/lir3.txt +12 -0
  55. data/test/ref/artikel.non +1 -12
  56. data/test/ref/artikel.seq +3 -1
  57. data/test/ref/artikel.vec +1 -0
  58. data/test/ref/artikel.vef +35 -34
  59. data/test/ref/artikel.ven +8 -7
  60. data/test/ref/artikel.ver +34 -33
  61. data/test/ref/artikel.vet +2573 -2563
  62. data/test/ref/lir.non +77 -78
  63. data/test/ref/lir.seq +9 -7
  64. data/test/ref/lir.syn +1 -1
  65. data/test/ref/lir.vec +41 -41
  66. data/test/ref/lir.vef +210 -210
  67. data/test/ref/lir.ven +46 -46
  68. data/test/ref/lir.ver +72 -72
  69. data/test/ref/lir.vet +329 -329
  70. data/test/ts_database.rb +166 -62
  71. data/test/ts_language.rb +23 -23
  72. metadata +53 -34
  73. data/lib/lingo/attendee/dehyphenizer.rb +0 -120
  74. data/lib/lingo/attendee/noneword_filter.rb +0 -115
  75. data/test/attendee/ts_noneword_filter.rb +0 -15
@@ -39,6 +39,7 @@ wort mist
39
39
  alt bibliothekskatalog
40
40
  neu bibliothekskatalög
41
41
  neu alttitelkatalog
42
+ episch dichtung der höfisch zeit
42
43
  EOT
43
44
 
44
45
  @keyvalue = <<-EOT
@@ -141,25 +142,27 @@ Wort2=
141
142
  ),
142
143
  'inflect' => true
143
144
  }, @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'
145
+ 'wort1' => 'wort1#s',
146
+ 'wort2' => 'wort2#s',
147
+ 'juristisch person' => 'juristische person#s',
148
+ 'natürlich person' => 'natürliche personen#s',
149
+ 'natürlich quatsch' => 'natürlichen quatsches#s',
150
+ 'lang essay' => 'langer essay#s',
151
+ 'groß kiefer' => 'große kiefer#s',
152
+ 'klug abel' => 'kluger abel#s',
153
+ 'warm abendluft' => 'warme abendluft#s',
154
+ 'klar abendluft' => 'klare abendluft#s',
155
+ 'gut abitur' => 'gutes abitur#s',
156
+ 'gut abitur schaff' => 'gutes abitur schaffen#s',
157
+ 'ein gut abitur' => 'ein gut abitur#s',
158
+ 'schmal rund zylinder' => 'schmaler runder zylinder#s',
159
+ 'der schmal zylinder' => 'der schmal zylinder#s',
160
+ 'wort mist' => 'wort mist#s',
161
+ 'alt bibliothekskatalog' => 'alter bibliothekskatalog#s',
162
+ 'neu bibliothekskatalög' => 'neu bibliothekskatalög#s',
163
+ 'neu alttitelkatalog' => 'neuer alttitelkatalog#s',
164
+ 'episch dichtung der' => '*5',
165
+ 'episch dichtung der höfisch zeit' => 'epische dichtung der höfisch zeit#s'
163
166
  })
164
167
  end
165
168
 
@@ -173,25 +176,27 @@ Wort2=
173
176
  ),
174
177
  'inflect' => 's'
175
178
  }, @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'
179
+ 'wort1' => 'wort1#s',
180
+ 'wort2' => 'wort2#s',
181
+ 'juristisch person' => 'juristische person#s',
182
+ 'natürlich person' => 'natürliche personen#s',
183
+ 'natürlich quatsch' => 'natürlichen quatsches#s',
184
+ 'lang essay' => 'langer essay#s',
185
+ 'groß kiefer' => 'große kiefer#s',
186
+ 'klug abel' => 'klug abel#s',
187
+ 'warm abendluft' => 'warme abendluft#s',
188
+ 'klar abendluft' => 'klare abendluft#s',
189
+ 'gut abitur' => 'gutes abitur#s',
190
+ 'gut abitur schaff' => 'gutes abitur schaffen#s',
191
+ 'ein gut abitur' => 'ein gut abitur#s',
192
+ 'schmal rund zylinder' => 'schmaler runder zylinder#s',
193
+ 'der schmal zylinder' => 'der schmal zylinder#s',
194
+ 'wort mist' => 'wort mist#s',
195
+ 'alt bibliothekskatalog' => 'alter bibliothekskatalog#s',
196
+ 'neu bibliothekskatalög' => 'neu bibliothekskatalög#s',
197
+ 'neu alttitelkatalog' => 'neuer alttitelkatalog#s',
198
+ 'episch dichtung der' => '*5',
199
+ 'episch dichtung der höfisch zeit' => 'epische dichtung der höfisch zeit#s'
195
200
  })
196
201
  end
197
202
 
@@ -205,25 +210,124 @@ Wort2=
205
210
  ),
206
211
  'inflect' => 'e'
207
212
  }, @singleword_inflect, {
213
+ 'wort1' => 'wort1#s',
214
+ 'wort2' => 'wort2#s',
215
+ 'juristisch person' => 'juristisch person#s',
216
+ 'natürlich person' => 'natürliche personen#s',
217
+ 'natürlich quatsch' => 'natürlichen quatsches#s',
218
+ 'lang essay' => 'lang essay#s',
219
+ 'klug abel' => 'kluger abel#s',
220
+ 'groß kiefer' => 'große kiefer#s',
221
+ 'warm abendluft' => 'warm abendluft#s',
222
+ 'klar abendluft' => 'klar abendluft#s',
223
+ 'gut abitur' => 'gut abitur#s',
224
+ 'gut abitur schaff' => 'gut abitur schaffen#s',
225
+ 'ein gut abitur' => 'ein gut abitur#s',
226
+ 'schmal rund zylinder' => 'schmal rund zylinder#s',
227
+ 'der schmal zylinder' => 'der schmal zylinder#s',
228
+ 'wort mist' => 'wort mist#s',
229
+ 'alt bibliothekskatalog' => 'alt bibliothekskatalog#s',
230
+ 'neu bibliothekskatalög' => 'neu bibliothekskatalög#s',
231
+ 'neu alttitelkatalog' => 'neu alttitelkatalog#s',
232
+ 'episch dichtung der' => '*5',
233
+ 'episch dichtung der höfisch zeit' => 'episch dichtung der höfisch zeit#s'
234
+ })
235
+ end
236
+
237
+ def test_singleword_hyphenate
238
+ compare({
239
+ 'txt-format' => 'SingleWord',
240
+ 'use-lex' => set_config('lex',
241
+ 'name' => 'de/lingo-dic.txt',
242
+ 'txt-format' => 'WordClass',
243
+ 'separator' => '='
244
+ ),
245
+ 'hyphenate' => true
246
+ }, @singleword, {
208
247
  'wort1' => 'wort1#s',
209
248
  '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'
249
+ 'ganz groß und blöd mist' => 'ganz großer und blöder mist#s',
250
+ 'ganz groß und blöd-mist' => 'ganz großer und blöder mist#s',
251
+ 'ganz groß und-blöd mist' => 'ganz großer und blöder mist#s',
252
+ 'ganz groß und-blöd-mist' => 'ganz großer und blöder mist#s',
253
+ 'ganz groß-und blöd mist' => 'ganz großer und blöder mist#s',
254
+ 'ganz groß-und blöd-mist' => 'ganz großer und blöder mist#s',
255
+ 'ganz groß-und-blöd mist' => 'ganz großer und blöder mist#s',
256
+ 'ganz groß-und-blöd-mist' => 'ganz großer und blöder mist#s',
257
+ 'ganz-groß und blöd mist' => 'ganz großer und blöder mist#s',
258
+ 'ganz-groß und blöd-mist' => 'ganz großer und blöder mist#s',
259
+ 'ganz-groß und-blöd mist' => 'ganz großer und blöder mist#s',
260
+ 'ganz-groß und-blöd-mist' => 'ganz großer und blöder mist#s',
261
+ 'ganz-groß-und blöd mist' => 'ganz großer und blöder mist#s',
262
+ 'ganz-groß-und blöd-mist' => 'ganz großer und blöder mist#s',
263
+ 'ganz-groß-und-blöd mist' => 'ganz großer und blöder mist#s',
264
+ 'juristisch person' => 'juristische personen#s',
265
+ 'hoch schnell weit' => 'höher schneller weiter#s|*4',
266
+ 'hoch schnell-weit' => 'höher schneller weiter#s',
267
+ 'hoch-schnell weit' => 'höher schneller weiter#s',
268
+ 'ganz groß und blöd quatsch' => 'ganz großer und blöder quatsch#s',
269
+ 'ganz groß und blöd-quatsch' => 'ganz großer und blöder quatsch#s',
270
+ 'ganz groß und-blöd quatsch' => 'ganz großer und blöder quatsch#s',
271
+ 'ganz groß und-blöd-quatsch' => 'ganz großer und blöder quatsch#s',
272
+ 'ganz groß-und blöd quatsch' => 'ganz großer und blöder quatsch#s',
273
+ 'ganz groß-und blöd-quatsch' => 'ganz großer und blöder quatsch#s',
274
+ 'ganz groß-und-blöd quatsch' => 'ganz großer und blöder quatsch#s',
275
+ 'ganz groß-und-blöd-quatsch' => 'ganz großer und blöder quatsch#s',
276
+ 'ganz-groß und blöd quatsch' => 'ganz großer und blöder quatsch#s',
277
+ 'ganz-groß und blöd-quatsch' => 'ganz großer und blöder quatsch#s',
278
+ 'ganz-groß und-blöd quatsch' => 'ganz großer und blöder quatsch#s',
279
+ 'ganz-groß und-blöd-quatsch' => 'ganz großer und blöder quatsch#s',
280
+ 'ganz-groß-und blöd quatsch' => 'ganz großer und blöder quatsch#s',
281
+ 'ganz-groß-und blöd-quatsch' => 'ganz großer und blöder quatsch#s',
282
+ 'ganz-groß-und-blöd quatsch' => 'ganz großer und blöder quatsch#s',
283
+ 'hoch schnell weit groß' => 'höher schneller weiter größer#s',
284
+ 'hoch schnell weit-groß' => 'höher schneller weiter größer#s',
285
+ 'hoch schnell-weit groß' => 'höher schneller weiter größer#s',
286
+ 'hoch schnell-weit-groß' => 'höher schneller weiter größer#s',
287
+ 'hoch-schnell weit groß' => 'höher schneller weiter größer#s',
288
+ 'hoch-schnell weit-groß' => 'höher schneller weiter größer#s',
289
+ 'hoch-schnell-weit groß' => 'höher schneller weiter größer#s',
290
+ 'ganz groß und blöd schwach sinn' => 'ganz großer und blöder schwach sinn#s',
291
+ 'ganz groß und blöd schwach-sinn' => 'ganz großer und blöder schwach sinn#s',
292
+ 'ganz groß und blöd-schwach sinn' => 'ganz großer und blöder schwach sinn#s',
293
+ 'ganz groß und blöd-schwach-sinn' => 'ganz großer und blöder schwach sinn#s',
294
+ 'ganz groß und-blöd schwach sinn' => 'ganz großer und blöder schwach sinn#s',
295
+ 'ganz groß und-blöd schwach-sinn' => 'ganz großer und blöder schwach sinn#s',
296
+ 'ganz groß und-blöd-schwach sinn' => 'ganz großer und blöder schwach sinn#s',
297
+ 'ganz groß und-blöd-schwach-sinn' => 'ganz großer und blöder schwach sinn#s',
298
+ 'ganz groß-und blöd schwach sinn' => 'ganz großer und blöder schwach sinn#s',
299
+ 'ganz groß-und blöd schwach-sinn' => 'ganz großer und blöder schwach sinn#s',
300
+ 'ganz groß-und blöd-schwach sinn' => 'ganz großer und blöder schwach sinn#s',
301
+ 'ganz groß-und blöd-schwach-sinn' => 'ganz großer und blöder schwach sinn#s',
302
+ 'ganz groß-und-blöd schwach sinn' => 'ganz großer und blöder schwach sinn#s',
303
+ 'ganz groß-und-blöd schwach-sinn' => 'ganz großer und blöder schwach sinn#s',
304
+ 'ganz groß-und-blöd-schwach sinn' => 'ganz großer und blöder schwach sinn#s',
305
+ 'ganz groß-und-blöd-schwach-sinn' => 'ganz großer und blöder schwach sinn#s',
306
+ 'ganz-groß und blöd schwach sinn' => 'ganz großer und blöder schwach sinn#s',
307
+ 'ganz-groß und blöd schwach-sinn' => 'ganz großer und blöder schwach sinn#s',
308
+ 'ganz-groß und blöd-schwach sinn' => 'ganz großer und blöder schwach sinn#s',
309
+ 'ganz-groß und blöd-schwach-sinn' => 'ganz großer und blöder schwach sinn#s',
310
+ 'ganz-groß und-blöd schwach sinn' => 'ganz großer und blöder schwach sinn#s',
311
+ 'ganz-groß und-blöd schwach-sinn' => 'ganz großer und blöder schwach sinn#s',
312
+ 'ganz-groß und-blöd-schwach sinn' => 'ganz großer und blöder schwach sinn#s',
313
+ 'ganz-groß und-blöd-schwach-sinn' => 'ganz großer und blöder schwach sinn#s',
314
+ 'ganz-groß-und blöd schwach sinn' => 'ganz großer und blöder schwach sinn#s',
315
+ 'ganz-groß-und blöd schwach-sinn' => 'ganz großer und blöder schwach sinn#s',
316
+ 'ganz-groß-und blöd-schwach sinn' => 'ganz großer und blöder schwach sinn#s',
317
+ 'ganz-groß-und blöd-schwach-sinn' => 'ganz großer und blöder schwach sinn#s',
318
+ 'ganz-groß-und-blöd schwach sinn' => 'ganz großer und blöder schwach sinn#s',
319
+ 'ganz-groß-und-blöd schwach-sinn' => 'ganz großer und blöder schwach sinn#s',
320
+ 'ganz-groß-und-blöd-schwach sinn' => 'ganz großer und blöder schwach sinn#s',
321
+ 'ganz groß und' => '*4|*5|*6',
322
+ 'ganz groß und-blöd' => '*4|*5',
323
+ 'ganz groß und-blöd-schwach' => '*4',
324
+ 'ganz groß-und blöd' => '*4|*5',
325
+ 'ganz groß-und blöd-schwach' => '*4',
326
+ 'ganz groß-und-blöd schwach' => '*4',
327
+ 'ganz-groß und blöd' => '*4|*5',
328
+ 'ganz-groß und blöd-schwach' => '*4',
329
+ 'ganz-groß und-blöd schwach' => '*4',
330
+ 'ganz-groß-und blöd schwach' => '*4'
227
331
  })
228
332
  end
229
333
 
@@ -381,13 +485,13 @@ Wort2=
381
485
  FileUtils.mkdir_p(File.dirname(TEST_FILE))
382
486
  File.open(TEST_FILE, 'w', encoding: Lingo::ENC) { |f| f.write(input) }
383
487
 
384
- Lingo::Database.open(set_config('tst', config.merge('name' => TEST_FILE)), @lingo) { |db|
385
- if block_given?
386
- yield db
387
- else
388
- assert_equal(output, db.to_h.tap { |store| store.delete(Lingo::Database::SYS_KEY) })
389
- end
390
- }
488
+ id, err = set_config('tst', config.merge('name' => TEST_FILE)), nil
489
+
490
+ Lingo::Database.open(id, @lingo) { |db| begin
491
+ block_given? ? yield(db) : assert_equal(output, db.to_h
492
+ .tap { |h| h.delete(Lingo::Database::SYS_KEY) }); rescue => err; end }
493
+
494
+ raise err if err
391
495
  ensure
392
496
  cleanup_store
393
497
  end
@@ -227,15 +227,15 @@ class TestGrammar < LingoTestCase
227
227
  def test_cache
228
228
  lg { |gra|
229
229
  assert_equal(
230
- wd('informationswissenschaften|KOM', 'informationswissenschaft|k', 'information|s+', 'wissenschaft|s+'),
230
+ wd('informationswissenschaften|COM', 'informationswissenschaft|k', 'information|s+', 'wissenschaft|s+'),
231
231
  gra.find_compound('informationswissenschaften')
232
232
  )
233
233
  assert_equal(
234
- wd('informationswissenschaften|KOM', 'informationswissenschaft|k', 'information|s+', 'wissenschaft|s+'),
234
+ wd('informationswissenschaften|COM', 'informationswissenschaft|k', 'information|s+', 'wissenschaft|s+'),
235
235
  gra.find_compound('informationswissenschaften')
236
236
  )
237
237
  assert_equal(
238
- wd('informationswissenschaften|KOM', 'informationswissenschaft|k', 'information|s+', 'wissenschaft|s+'),
238
+ wd('informationswissenschaften|COM', 'informationswissenschaft|k', 'information|s+', 'wissenschaft|s+'),
239
239
  gra.find_compound('informationswissenschaften')
240
240
  )
241
241
  }
@@ -244,97 +244,97 @@ class TestGrammar < LingoTestCase
244
244
  def test_find_compound
245
245
  lg { |gra|
246
246
  assert_equal(
247
- wd('informationswissenschaften|KOM', 'informationswissenschaft|k', 'information|s+', 'wissenschaft|s+'),
247
+ wd('informationswissenschaften|COM', 'informationswissenschaft|k', 'information|s+', 'wissenschaft|s+'),
248
248
  gra.find_compound('informationswissenschaften')
249
249
  )
250
250
 
251
251
  assert_equal(
252
- wd('cd-rom-technologie|KOM', 'cd-rom-technologie|k', 'cd-rom|s+|f', 'cd-rom|s+|m', 'technologie|s+|f'),
252
+ wd('cd-rom-technologie|COM', 'cd-rom-technologie|k', 'cd-rom|s+|f', 'cd-rom|s+|m', 'technologie|s+|f'),
253
253
  gra.find_compound('cd-rom-technologie')
254
254
  )
255
255
 
256
256
  assert_equal(
257
- wd('albert-ludwigs-universität|KOM', 'albert-ludwigs-universität|k', 'albert|e+', 'ludwig|e+', 'universität|s+'),
257
+ wd('albert-ludwigs-universität|COM', 'albert-ludwigs-universität|k', 'albert|e+', 'ludwig|e+', 'universität|s+'),
258
258
  gra.find_compound('albert-ludwigs-universität')
259
259
  )
260
260
 
261
261
  assert_equal(
262
- wd('client-server-system|KOM', 'client-server-system|k', 'client|s+', 'server|s+', 'system|s+'),
262
+ wd('client-server-system|COM', 'client-server-system|k', 'client|s+', 'server|s+', 'system|s+'),
263
263
  gra.find_compound('client-server-system')
264
264
  )
265
265
 
266
266
  assert_equal(
267
- wd('benutzerforschung|KOM', 'benutzerforschung|k', 'benutzer|s+', 'forschung|s+'),
267
+ wd('benutzerforschung|COM', 'benutzerforschung|k', 'benutzer|s+', 'forschung|s+'),
268
268
  gra.find_compound('benutzerforschung')
269
269
  )
270
270
 
271
271
  assert_equal(
272
- wd('clustersuche|KOM', 'clustersuche|k', 'cluster|s+', 'suche|s+', 'suchen|v+'),
272
+ wd('clustersuche|COM', 'clustersuche|k', 'cluster|s+', 'suche|s+', 'suchen|v+'),
273
273
  gra.find_compound('clustersuche')
274
274
  )
275
275
 
276
276
  assert_equal(
277
- wd('titelkatalogstitel|KOM', 'titelkatalogstitel|k', 'titel|s+', 'katalog|s+', 'titel|s+'),
277
+ wd('titelkatalogstitel|COM', 'titelkatalogstitel|k', 'titel|s+', 'katalog|s+', 'titel|s+'),
278
278
  gra.find_compound('titelkatalogstitel')
279
279
  )
280
280
 
281
281
  assert_equal(
282
- wd('titelkatalogstiteltitel|KOM', 'titelkatalogstiteltitel|k', 'titel|s+', 'katalog|s+', 'titel|s+', 'titel|s+'),
282
+ wd('titelkatalogstiteltitel|COM', 'titelkatalogstiteltitel|k', 'titel|s+', 'katalog|s+', 'titel|s+', 'titel|s+'),
283
283
  gra.find_compound('titelkatalogstiteltitel')
284
284
  )
285
285
 
286
286
  assert_equal(
287
- wd('titelbestandsbestände|KOM', 'titelbestandsbestand|k', 'titel|s+', 'bestand|s+', 'bestand|s+', 'bestehen|v+'),
287
+ wd('titelbestandsbestände|COM', 'titelbestandsbestand|k', 'titel|s+', 'bestand|s+', 'bestand|s+', 'bestehen|v+'),
288
288
  gra.find_compound('titelbestandsbestände')
289
289
  )
290
290
 
291
291
  assert_equal(
292
- wd('hasenbraten|KOM', 'hasenbraten|k', 'hase|s+', 'braten|v+'),
292
+ wd('hasenbraten|COM', 'hasenbraten|k', 'hase|s+', 'braten|v+'),
293
293
  gra.find_compound('hasenbraten')
294
294
  )
295
295
 
296
296
  assert_equal(
297
- wd('nasenlaufen|KOM', 'nasenlaufen|k', 'nase|s+', 'laufen|v+'),
297
+ wd('nasenlaufen|COM', 'nasenlaufen|k', 'nase|s+', 'laufen|v+'),
298
298
  gra.find_compound('nasenlaufen')
299
299
  )
300
300
 
301
301
  assert_equal(
302
- wd('nasenlaufens|KOM', 'nasenlaufen|k', 'nase|s+', 'laufen|v+'),
302
+ wd('nasenlaufens|COM', 'nasenlaufen|k', 'nase|s+', 'laufen|v+'),
303
303
  gra.find_compound('nasenlaufens')
304
304
  )
305
305
 
306
306
  assert_equal(
307
- wd('arrafat-nachfolgebedarf|KOM', 'arrafat-nachfolgebedarf|k', 'arrafat|x+', 'nachfolge|s+', 'bedarf|s+'),
307
+ wd('arrafat-nachfolgebedarf|COM', 'arrafat-nachfolgebedarf|k', 'arrafat|x+', 'nachfolge|s+', 'bedarf|s+'),
308
308
  gra.find_compound('arrafat-nachfolgebedarf')
309
309
  )
310
310
 
311
311
  assert_equal(
312
- wd('nachfolge-arrafat|KOM', 'nachfolge-arrafat|k', 'nachfolge|s+', 'arrafat|x+'),
312
+ wd('nachfolge-arrafat|COM', 'nachfolge-arrafat|k', 'nachfolge|s+', 'arrafat|x+'),
313
313
  gra.find_compound('nachfolge-arrafat')
314
314
  )
315
315
 
316
316
  assert_equal(
317
- wd('morgenonkelmantel|KOM', 'morgenonkelmantel|k', 'morgen|w+', 'morgen|s+', 'onkel|s+', 'mantel|s+'),
317
+ wd('morgenonkelmantel|COM', 'morgenonkelmantel|k', 'morgen|w+', 'morgen|s+', 'onkel|s+', 'mantel|s+'),
318
318
  gra.find_compound('morgenonkelmantel')
319
319
  )
320
320
 
321
321
  assert_equal(
322
- wd('arrafat-nachfolger|KOM', 'arrafat-nachfolger|k', 'arrafat|x+', 'nachfolger|s+'),
322
+ wd('arrafat-nachfolger|COM', 'arrafat-nachfolger|k', 'arrafat|x+', 'nachfolger|s+'),
323
323
  gra.find_compound('arrafat-nachfolger')
324
324
  )
325
325
 
326
326
  assert_equal(
327
- wd('cd-rom-technologie|KOM', 'cd-rom-technologie|k', 'cd-rom|s+|f', 'cd-rom|s+|m', 'technologie|s+|f'),
327
+ wd('cd-rom-technologie|COM', 'cd-rom-technologie|k', 'cd-rom|s+|f', 'cd-rom|s+|m', 'technologie|s+|f'),
328
328
  gra.find_compound('cd-rom-technologie')
329
329
  )
330
330
 
331
331
  assert_equal(
332
- wd('albert-ludwigs-universität|KOM', 'albert-ludwigs-universität|k', 'albert|e+', 'ludwig|e+', 'universität|s+'),
332
+ wd('albert-ludwigs-universität|COM', 'albert-ludwigs-universität|k', 'albert|e+', 'ludwig|e+', 'universität|s+'),
333
333
  gra.find_compound('albert-ludwigs-universität')
334
334
  )
335
335
 
336
336
  assert_equal(
337
- wd('benutzerforschung|KOM', 'benutzerforschung|k', 'benutzer|s+', 'forschung|s+'),
337
+ wd('benutzerforschung|COM', 'benutzerforschung|k', 'benutzer|s+', 'forschung|s+'),
338
338
  gra.find_compound('benutzerforschung')
339
339
  )
340
340
  }
@@ -372,7 +372,7 @@ class TestGrammar < LingoTestCase
372
372
 
373
373
  def test_max_parts
374
374
  lg { |gra|
375
- assert_equal(wd('baumsbaumsbaum|KOM', 'baumsbaumsbaum|k', 'baum|s+', 'baum|s+', 'baum|s+'), gra.find_compound('baumsbaumsbaum'))
375
+ assert_equal(wd('baumsbaumsbaum|COM', 'baumsbaumsbaum|k', 'baum|s+', 'baum|s+', 'baum|s+'), gra.find_compound('baumsbaumsbaum'))
376
376
  assert_equal(wd('baumsbaumsbaumsbaumsbaumsbaum|?'), gra.find_compound('baumsbaumsbaumsbaumsbaumsbaum'))
377
377
  }
378
378
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lingo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.6
4
+ version: 1.8.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Vorhauer
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-02-09 00:00:00.000000000 Z
12
+ date: 2015-08-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cyclops
@@ -31,14 +31,14 @@ dependencies:
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '1.1'
34
+ version: '1.3'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '1.1'
41
+ version: '1.3'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rubyzip
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -118,7 +118,7 @@ dependencies:
118
118
  version: '0.8'
119
119
  - - ">="
120
120
  - !ruby/object:Gem::Version
121
- version: 0.8.1
121
+ version: 0.8.2
122
122
  type: :development
123
123
  prerelease: false
124
124
  version_requirements: !ruby/object:Gem::Requirement
@@ -128,7 +128,7 @@ dependencies:
128
128
  version: '0.8'
129
129
  - - ">="
130
130
  - !ruby/object:Gem::Version
131
- version: 0.8.1
131
+ version: 0.8.2
132
132
  - !ruby/object:Gem::Dependency
133
133
  name: rake
134
134
  requirement: !ruby/object:Gem::Requirement
@@ -199,6 +199,7 @@ files:
199
199
  - dict/de/test_dic.txt
200
200
  - dict/de/test_gen.txt
201
201
  - dict/de/test_mu2.txt
202
+ - dict/de/test_muh.txt
202
203
  - dict/de/test_mul.txt
203
204
  - dict/de/test_sgw.txt
204
205
  - dict/de/test_syn.txt
@@ -220,12 +221,14 @@ files:
220
221
  - lib/lingo/app.rb
221
222
  - lib/lingo/attendee.rb
222
223
  - lib/lingo/attendee/abbreviator.rb
224
+ - lib/lingo/attendee/analysis_filter.rb
225
+ - lib/lingo/attendee/debug_filter.rb
223
226
  - lib/lingo/attendee/debugger.rb
224
227
  - lib/lingo/attendee/decomposer.rb
225
- - lib/lingo/attendee/dehyphenizer.rb
226
228
  - lib/lingo/attendee/formatter.rb
229
+ - lib/lingo/attendee/hal_filter.rb
230
+ - lib/lingo/attendee/lsi_filter.rb
227
231
  - lib/lingo/attendee/multi_worder.rb
228
- - lib/lingo/attendee/noneword_filter.rb
229
232
  - lib/lingo/attendee/object_filter.rb
230
233
  - lib/lingo/attendee/sequencer.rb
231
234
  - lib/lingo/attendee/stemmer.rb
@@ -242,6 +245,9 @@ files:
242
245
  - lib/lingo/cli.rb
243
246
  - lib/lingo/config.rb
244
247
  - lib/lingo/ctl.rb
248
+ - lib/lingo/ctl/analysis.rb
249
+ - lib/lingo/ctl/files.rb
250
+ - lib/lingo/ctl/other.rb
245
251
  - lib/lingo/database.rb
246
252
  - lib/lingo/database/crypter.rb
247
253
  - lib/lingo/database/gdbm_store.rb
@@ -272,6 +278,7 @@ files:
272
278
  - lib/lingo/srv/config.ru
273
279
  - lib/lingo/srv/lingosrv.cfg
274
280
  - lib/lingo/srv/public/.gitkeep
281
+ - lib/lingo/text_utils.rb
275
282
  - lib/lingo/version.rb
276
283
  - lib/lingo/web.rb
277
284
  - lib/lingo/web/config.ru
@@ -282,7 +289,6 @@ files:
282
289
  - test/attendee/ts_abbreviator.rb
283
290
  - test/attendee/ts_decomposer.rb
284
291
  - test/attendee/ts_multi_worder.rb
285
- - test/attendee/ts_noneword_filter.rb
286
292
  - test/attendee/ts_object_filter.rb
287
293
  - test/attendee/ts_sequencer.rb
288
294
  - test/attendee/ts_stemmer.rb
@@ -296,6 +302,7 @@ files:
296
302
  - test/lir.txt
297
303
  - test/lir.vec
298
304
  - test/lir2.txt
305
+ - test/lir3.txt
299
306
  - test/mul.txt
300
307
  - test/ref/artikel.mul
301
308
  - test/ref/artikel.non
@@ -328,34 +335,46 @@ licenses:
328
335
  metadata: {}
329
336
  post_install_message: |2+
330
337
 
331
- lingo-1.8.6 [2015-02-09]:
338
+ lingo-1.8.7 [2015-08-07]:
332
339
 
333
- * Lingo::Attendee::VectorFilter learned +pos+ option to print position and
334
- byte offset with each word.
335
- * Lingo::Attendee::VectorFilter learned +tfidf+ option to sort results based
336
- on their tf–idf[https://en.wikipedia.org/wiki/Tf–idf] score; the document
337
- frequencies are calculated over the "corpus" of all files processed during
338
- a single program invocation.
339
- * Lingo::Attendee::VectorFilter learned +tokens+ option to filter on
340
- Lingo::Language::Token in addition to Lingo::Language::Word.
341
- * Lingo::Attendee::VectorFilter no longer supports +debug+ (as well as
342
- +prompt+ and +preamble+); use Lingo::Attendee::DebugFilter instead.
343
- * Lingo::Attendee::TextReader no longer removes line endings; option +chomp+
344
- is obsolete.
345
- * Lingo::Attendee::TextReader passes byte offset to the following attendee.
346
- * Lingo::Attendee::Tokenizer records token's byte offset.
347
- * Lingo::Attendee::Tokenizer records token's sequence position.
348
- * Lingo::Attendee::Tokenizer learned <tt>skip-tags</tt> option to skip over
349
- specified tags' contents.
350
- * Lingo::Attendee subclasses warn when invalid or obsolete options or names
351
- are used.
352
- * Changed German infix substitution +/en+ to +ch/chen+ in order to prevent
353
- overly aggressive identifications.
354
- * Internal refactoring and API changes.
340
+ * Added Lingo::Attendee::LsiFilter to correlate semantically related terms
341
+ (LSI[https://en.wikipedia.org/wiki/Latent_semantic_indexing]) over the
342
+ "corpus" of all files processed during a single program invocation; requires
343
+ lsi4r[https://blackwinter.github.com/lsi4r] which in turn requires
344
+ rb-gsl[https://blackwinter.github.com/rb-gsl]. [EXPERIMENTAL: Interface may
345
+ be changed or removed in next release.]
346
+ * Added Lingo::Attendee::HalFilter to correlate semantically related terms
347
+ (HAL[https://en.wikipedia.org/wiki/Hyperspace_Analogue_to_Language]) over
348
+ individual documents; requires hal4r[https://blackwinter.github.com/hal4r]
349
+ which in turn requires rb-gsl[https://blackwinter.github.com/rb-gsl].
350
+ [EXPERIMENTAL: Interface may be changed or removed in next release.]
351
+ * Added Lingo::Attendee::AnalysisFilter and associated +lingoctl+ tooling.
352
+ * Multiword dictionaries can now identify hyphenated variants (e.g.
353
+ <tt>automatic data-processing</tt>); set <tt>hyphenate: true</tt> in the
354
+ dictionary config.
355
+ * Lingo::Attendee::Tokenizer no longer considers hyphens at word edges as part
356
+ of the word. As a consequence, Lingo::Attendee::Dehyphenizer has been
357
+ dropped.
358
+ * Dropped Lingo::Attendee::NonewordFilter; use Lingo::Attendee::VectorFilter
359
+ with option <tt>lexicals: '\?'</tt> instead.
360
+ * Lingo::Attendee::TextReader and Lingo::Attendee::TextWriter learned
361
+ +encoding+ option to read/write text that is not UTF-8 encoded;
362
+ configuration files and dictionaries still need to be UTF-8, though.
363
+ * Lingo::Attendee::TextReader and Lingo::Attendee::TextWriter learned to
364
+ read/write Gzip-compressed files (file extension +.gz+ or +.gzip+).
365
+ * Lingo::Attendee::Sequencer learned to recognize +0+ in the pattern to match
366
+ number tokens.
367
+ * Fixed Lingo::Attendee::TextReader to recognize BOM in input files; does not
368
+ apply to input read from +STDIN+.
369
+ * Fixed regression introduced in 1.8.6 where Lingo::Attendee::Debugger would
370
+ no longer work immediately behind Lingo::Attendee::TextReader.
371
+ * Fixed +lingoctl+ copy commands when overwriting existing files.
372
+ * Refactored Lingo::Database::Crypter into a module.
373
+ * JRuby 9000 compatibility.
355
374
 
356
375
  rdoc_options:
357
376
  - "--title"
358
- - lingo Application documentation (v1.8.6)
377
+ - lingo Application documentation (v1.8.7)
359
378
  - "--charset"
360
379
  - UTF-8
361
380
  - "--line-numbers"
@@ -376,7 +395,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
376
395
  version: '0'
377
396
  requirements: []
378
397
  rubyforge_project:
379
- rubygems_version: 2.4.5
398
+ rubygems_version: 2.4.8
380
399
  signing_key:
381
400
  specification_version: 4
382
401
  summary: The full-featured automatic indexing system