lingo 1.8.1 → 1.8.2

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.
Files changed (99) hide show
  1. data/ChangeLog +23 -5
  2. data/README +1 -1
  3. data/Rakefile +5 -7
  4. data/TODO +2 -0
  5. data/bin/lingo +5 -1
  6. data/de.lang +1 -1
  7. data/en/lingo-syn.txt +0 -0
  8. data/en.lang +2 -1
  9. data/lib/lingo/attendee/abbreviator.rb +8 -9
  10. data/lib/lingo/attendee/debugger.rb +5 -4
  11. data/lib/lingo/attendee/decomposer.rb +8 -3
  12. data/lib/lingo/attendee/dehyphenizer.rb +19 -63
  13. data/lib/lingo/attendee/formatter.rb +1 -1
  14. data/lib/lingo/attendee/multi_worder.rb +67 -155
  15. data/lib/lingo/attendee/noneword_filter.rb +16 -9
  16. data/lib/lingo/attendee/object_filter.rb +1 -1
  17. data/lib/lingo/attendee/sequencer.rb +32 -63
  18. data/lib/lingo/attendee/stemmer/porter.rb +343 -0
  19. data/{info/gpl-hdr.txt → lib/lingo/attendee/stemmer.rb} +33 -0
  20. data/lib/lingo/attendee/synonymer.rb +10 -9
  21. data/lib/lingo/attendee/text_reader.rb +102 -76
  22. data/lib/lingo/attendee/text_writer.rb +23 -26
  23. data/lib/lingo/attendee/tokenizer.rb +13 -27
  24. data/lib/lingo/attendee/variator.rb +26 -66
  25. data/lib/lingo/attendee/vector_filter.rb +42 -43
  26. data/lib/lingo/attendee/word_searcher.rb +6 -7
  27. data/lib/lingo/attendee.rb +25 -7
  28. data/lib/lingo/buffered_attendee.rb +36 -10
  29. data/lib/lingo/cachable.rb +8 -8
  30. data/lib/lingo/config.rb +5 -6
  31. data/lib/lingo/ctl.rb +2 -3
  32. data/lib/lingo/database/crypter.rb +9 -26
  33. data/lib/lingo/database/gdbm_store.rb +3 -5
  34. data/lib/lingo/database/libcdb_store.rb +4 -6
  35. data/lib/lingo/database/sdbm_store.rb +11 -6
  36. data/lib/lingo/database/show_progress.rb +3 -43
  37. data/lib/lingo/database/source/key_value.rb +2 -6
  38. data/lib/lingo/database/source/multi_key.rb +3 -5
  39. data/lib/lingo/database/source/multi_value.rb +2 -6
  40. data/lib/lingo/database/source/single_word.rb +4 -6
  41. data/lib/lingo/database/source/word_class.rb +4 -10
  42. data/lib/lingo/database/source.rb +20 -18
  43. data/lib/lingo/database.rb +84 -59
  44. data/lib/lingo/error.rb +57 -1
  45. data/lib/lingo/language/dictionary.rb +21 -18
  46. data/lib/lingo/language/grammar.rb +40 -49
  47. data/lib/lingo/language/lexical.rb +6 -6
  48. data/lib/lingo/language/lexical_hash.rb +6 -0
  49. data/lib/lingo/language/word.rb +32 -15
  50. data/lib/lingo/language/word_form.rb +1 -1
  51. data/lib/lingo/language.rb +14 -25
  52. data/lib/lingo/reportable.rb +12 -10
  53. data/lib/lingo/show_progress.rb +81 -0
  54. data/lib/lingo/version.rb +1 -1
  55. data/lib/lingo.rb +63 -24
  56. data/lingo-call.cfg +6 -10
  57. data/lingo.cfg +60 -44
  58. data/lir.cfg +42 -41
  59. data/test/attendee/ts_abbreviator.rb +3 -5
  60. data/test/attendee/ts_decomposer.rb +3 -5
  61. data/test/attendee/ts_multi_worder.rb +87 -145
  62. data/test/attendee/ts_noneword_filter.rb +5 -3
  63. data/test/attendee/ts_object_filter.rb +5 -3
  64. data/test/attendee/ts_sequencer.rb +3 -5
  65. data/test/attendee/ts_stemmer.rb +309 -0
  66. data/test/attendee/ts_synonymer.rb +15 -11
  67. data/test/attendee/ts_text_reader.rb +12 -15
  68. data/test/attendee/ts_text_writer.rb +24 -29
  69. data/test/attendee/ts_tokenizer.rb +9 -7
  70. data/test/attendee/ts_variator.rb +4 -4
  71. data/test/attendee/ts_vector_filter.rb +24 -16
  72. data/test/attendee/ts_word_searcher.rb +20 -36
  73. data/test/{lir.csv → lir.vec} +0 -0
  74. data/test/ref/artikel.vec +943 -943
  75. data/test/ref/artikel.ven +943 -943
  76. data/test/ref/lir.non +201 -201
  77. data/test/ref/lir.seq +178 -178
  78. data/test/ref/lir.syn +49 -49
  79. data/test/ref/lir.vec +329 -0
  80. data/test/test_helper.rb +20 -36
  81. data/test/ts_database.rb +10 -10
  82. data/test/ts_language.rb +279 -319
  83. metadata +93 -104
  84. data/info/Objekte.png +0 -0
  85. data/info/Typen.png +0 -0
  86. data/info/database.png +0 -0
  87. data/info/db_small.png +0 -0
  88. data/info/download.png +0 -0
  89. data/info/kerze.png +0 -0
  90. data/info/language.png +0 -0
  91. data/info/lingo.png +0 -0
  92. data/info/logo.png +0 -0
  93. data/info/meeting.png +0 -0
  94. data/info/types.png +0 -0
  95. data/lingo-all.cfg +0 -89
  96. data/porter/stem.cfg +0 -311
  97. data/porter/stem.rb +0 -150
  98. data/test/ref/lir.csv +0 -329
  99. data/test.cfg +0 -79
data/lingo-call.cfg CHANGED
@@ -2,14 +2,10 @@
2
2
  meeting:
3
3
  attendees:
4
4
  - text_reader: { }
5
-
6
5
  - tokenizer: { }
7
- - word_searcher: { source: 'sys-dic', mode: 'first' }
8
- - decomposer: { source: 'sys-dic' }
9
- - multi_worder: { stopper: 'PUNC,OTHR', source: 'sys-mul' }
10
- - sequencer: { stopper: 'PUNC,OTHR' }
11
- - synonymer: { skip: '?,t', source: 'sys-syn', out: 'syn' }
12
- - debugger: { eval: 'true', ceval: 'false', prompt: '' }
13
-
14
- #- vector_filter: { in: 'syn', lexicals: 'y', sort: 'term_abs' }
15
- #- text_writer: { ext: 'STDOUT', sep: "\n" }
6
+ - word_searcher: { source: sys-dic, mode: first }
7
+ - decomposer: { source: sys-dic }
8
+ - multi_worder: { source: sys-mul }
9
+ - sequencer: { }
10
+ - synonymer: { source: sys-syn, skip: '?,t' }
11
+ - debugger: { prompt: '', ceval: 'false' }
data/lingo.cfg CHANGED
@@ -1,5 +1,5 @@
1
1
  #
2
- # Lingo-Konfiguration
2
+ # Lingo-Konfiguration
3
3
  #
4
4
  ---
5
5
  meeting:
@@ -7,74 +7,90 @@ meeting:
7
7
  attendees:
8
8
 
9
9
  ########################################
10
- # Text bereitstellen
10
+ # Text bereitstellen
11
11
  #
12
12
 
13
- # Angegebene Datei zeilenweise einlesen und verarbeitet
14
- - text_reader: { files: '$(files)' }
13
+ # Angegebene Datei zeilenweise einlesen und verarbeiten
14
+ - text_reader: { files: $(files), progress: true }
15
15
 
16
16
 
17
17
  ########################################
18
- # Inhalte verarbeiten
18
+ # Inhalte verarbeiten
19
19
  #
20
20
 
21
- # Zeile in einzelnen Sinnbestandteile (Token) zerlegen
22
- - tokenizer: { }
21
+ # Zeile in einzelnen Sinnbestandteile (Token) zerlegen
22
+ - tokenizer: { }
23
23
 
24
- # Verbleibende Token im Wörterbuch suchen
25
- - word_searcher: { source: 'sys-dic', mode: 'first' }
24
+ # Abkürzungen erkennen und auflösen
25
+ # - abbreviator: { source: sys-abk }
26
26
 
27
- # Nicht erkannte Wörter auf Kompositum testen
28
- - decomposer: { source: 'sys-dic' }
27
+ # Verbleibende Token im Wörterbuch suchen
28
+ - word_searcher: { source: sys-dic, mode: first }
29
29
 
30
- # Mehrwortgruppen im Strom erkennen
31
- - multi_worder: { stopper: 'PUNC,OTHR', source: 'sys-mul' }
30
+ # Schreibweisen variieren und erneut suchen
31
+ # - variator: { source: sys-dic }
32
32
 
33
- # Wortsequenzen anhand von Regeln identifizieren
34
- - sequencer: { stopper: 'PUNC,OTHR' }
33
+ # Bindestrichergänzungen rekonstruieren
34
+ # - dehyphenizer: { source: sys-dic }
35
35
 
36
- # Relationierungen einfügen
37
- - synonymer: { skip: '?,t', source: 'sys-syn', out: syn }
36
+ # Wortstämme für nicht erkannte Wörter einfügen
37
+ # - stemmer: { }
38
+
39
+ # Nicht erkannte Wörter auf Kompositum testen
40
+ - decomposer: { source: sys-dic }
41
+
42
+ # Mehrwortgruppen im Strom erkennen
43
+ - multi_worder: { source: sys-mul }
44
+
45
+ # Wortsequenzen anhand von Regeln identifizieren
46
+ - sequencer: { stopper: PUNC,OTHR }
47
+
48
+ # Relationierungen einfügen
49
+ - synonymer: { skip: '?,t', source: sys-syn, out: syn }
38
50
 
39
51
 
40
52
  ########################################
41
- # Datenstrom anzeigen
53
+ # Datenstrom anzeigen
42
54
  #
43
- # - debugger: { eval: 'true', ceval: 'cmd!="EOL"', prompt: 'lex:) ' }
55
+ # - debugger: { eval: 'true', ceval: 'cmd!="EOL"', prompt: 'lex:) ' }
44
56
 
45
57
 
46
58
  ########################################
47
- # Ergebnisse ausgeben
59
+ # Ergebnisse ausgeben
48
60
  #
49
61
 
50
- # Erstelle Datei mit Endung .log für Datenstrom
51
- - vector_filter: { in: syn, debug: 'true', prompt: 'lex:) ' }
52
- - text_writer: { ext: log, sep: "\n" }
62
+ # Erstelle Datei mit Endung .log für Datenstrom
63
+ - vector_filter: { in: syn, debug: 'true', prompt: 'lex:) ' }
64
+ - text_writer: { ext: log, sep: "\n" }
65
+
66
+ # Erstelle Datei mit Endung .non für nicht erkannte Wörter
67
+ - noneword_filter: { in: syn }
68
+ - text_writer: { ext: non, sep: "\n" }
53
69
 
54
- # Erstelle Datei mit Endung .non für nicht erkannte Wörter
55
- - noneword_filter: { in: syn }
56
- - text_writer: { ext: non, sep: "\n" }
70
+ # Erstelle Datei mit Endung .ste für Wortstämme
71
+ - vector_filter: { in: syn, lexicals: z }
72
+ - text_writer: { ext: ste, sep: "\n" }
57
73
 
58
- # Erstelle Datei mit Endung .vec für erkannte Indexterme
59
- - vector_filter: { in: syn, lexicals: '^[ksavem]$' }
60
- - text_writer: { ext: vec, sep: "\n" }
74
+ # Erstelle Datei mit Endung .vec für erkannte Indexterme
75
+ - vector_filter: { in: syn, lexicals: '^[ksavem]$' }
76
+ - text_writer: { ext: vec, sep: "\n" }
61
77
 
62
- # Erstelle Datei mit Endung .ven für erkannte Indexterme mit absoluter Häufigkeit
63
- - vector_filter: { in: syn, lexicals: '^[ksavem]$', sort: 'term_abs' }
64
- - text_writer: { ext: ven, sep: "\n" }
78
+ # Erstelle Datei mit Endung .ven für erkannte Indexterme mit absoluter Häufigkeit
79
+ - vector_filter: { in: syn, lexicals: '^[ksavem]$', sort: term_abs }
80
+ - text_writer: { ext: ven, sep: "\n" }
65
81
 
66
- # Erstelle Datei mit Endung .ver für erkannte Indexterme mit relativer Häufigkeit
67
- - vector_filter: { in: syn, lexicals: '^[ksavem]$', sort: 'term_rel' }
68
- - text_writer: { ext: ver, sep: "\n" }
82
+ # Erstelle Datei mit Endung .ver für erkannte Indexterme mit relativer Häufigkeit
83
+ - vector_filter: { in: syn, lexicals: '^[ksavem]$', sort: term_rel }
84
+ - text_writer: { ext: ver, sep: "\n" }
69
85
 
70
- # Erstelle Datei mit Endung .mul für erkannte Mehrwortgruppen
71
- - vector_filter: { in: syn, lexicals: m }
72
- - text_writer: { ext: mul, sep: "\n" }
86
+ # Erstelle Datei mit Endung .mul für erkannte Mehrwortgruppen
87
+ - vector_filter: { in: syn, lexicals: m }
88
+ - text_writer: { ext: mul, sep: "\n" }
73
89
 
74
- # Erstelle Datei mit Endung .seq für erkannte Wortsequenzen
75
- - vector_filter: { in: syn, lexicals: q, sort: 'term_abs' }
76
- - text_writer: { ext: seq, sep: "\n" }
90
+ # Erstelle Datei mit Endung .seq für erkannte Wortsequenzen
91
+ - vector_filter: { in: syn, lexicals: q, sort: term_abs }
92
+ - text_writer: { ext: seq, sep: "\n" }
77
93
 
78
- # Erstelle Datei mit Endung .syn für erkannte Synonyme
79
- - vector_filter: { in: syn, lexicals: y, sort: 'term_abs' }
80
- - text_writer: { ext: syn, sep: "\n" }
94
+ # Erstelle Datei mit Endung .syn für erkannte Synonyme
95
+ - vector_filter: { in: syn, lexicals: y, sort: term_abs }
96
+ - text_writer: { ext: syn, sep: "\n" }
data/lir.cfg CHANGED
@@ -1,9 +1,10 @@
1
1
  #
2
- # Lingo-Konfiguration für den Test mit einer LIR-Datei
2
+ # Lingo-Konfiguration für den Test mit einer LIR-Datei
3
3
  #
4
- # Gebräuchliche Patterns sind
5
- # "^\021(\d+\-\d+)\022"
6
- # "^\[(\d+)\.\]"
4
+ # Gebräuchliche Patterns sind
5
+ #
6
+ # "^\021(\d+\-\d+)\022"
7
+ # "^\[(\d+)\.\]"
7
8
  #
8
9
  ---
9
10
  meeting:
@@ -11,66 +12,66 @@ meeting:
11
12
  attendees:
12
13
 
13
14
  ########################################
14
- # Text bereitstellen
15
+ # Text bereitstellen
15
16
  #
16
17
 
17
- # Angegebene Datei zeilenweise einlesen und verarbeiten
18
- - text_reader: { files: '$(files)', lir-record-pattern: '^\[(\d+)\.\]' }
18
+ # Angegebene Datei zeilenweise einlesen und verarbeiten
19
+ - text_reader: { files: $(files), records: true, progress: true }
19
20
 
20
21
 
21
22
  ########################################
22
- # Inhalte verarbeiten
23
+ # Inhalte verarbeiten
23
24
  #
24
25
 
25
- # Zeile in einzelnen Sinnbestandteile (Token) zerlegen
26
- - tokenizer: { }
26
+ # Zeile in einzelnen Sinnbestandteile (Token) zerlegen
27
+ - tokenizer: { }
27
28
 
28
- # Verbleibende Token im Wörterbuch suchen
29
- - word_searcher: { source: 'sys-dic', mode: 'first' }
29
+ # Verbleibende Token im Wörterbuch suchen
30
+ - word_searcher: { source: sys-dic, mode: first }
30
31
 
31
- # Nicht erkannte Wörter auf Kompositum testen
32
- - decomposer: { source: 'sys-dic' }
32
+ # Nicht erkannte Wörter auf Kompositum testen
33
+ - decomposer: { source: sys-dic }
33
34
 
34
- # Mehrwortgruppen im Strom erkennen
35
- - multi_worder: { stopper: 'PUNC,OTHR', source: 'sys-mul' }
35
+ # Mehrwortgruppen im Strom erkennen
36
+ - multi_worder: { source: sys-mul }
36
37
 
37
- # Wortsequenzen anhand von Regeln identifizieren
38
- - sequencer: { stopper: 'PUNC,OTHR' }
38
+ # Wortsequenzen anhand von Regeln identifizieren
39
+ - sequencer: { stopper: PUNC,OTHR }
39
40
 
40
- # Relationierungen einfügen
41
- - synonymer: { skip: '?,t', source: 'sys-syn', out: syn }
41
+ # Relationierungen einfügen
42
+ - synonymer: { skip: '?,t', source: sys-syn, out: syn }
42
43
 
43
44
 
44
45
  ########################################
45
- # Datenstrom anzeigen
46
+ # Datenstrom anzeigen
46
47
  #
47
- # - debugger: { eval: 'true', ceval: 'cmd!="EOL"', prompt: 'lex:) ' }
48
+ # - debugger: { eval: 'true', ceval: 'cmd!="EOL"', prompt: 'lex:) ' }
48
49
 
49
50
 
50
51
  ########################################
51
- # Ergebnisse ausgeben
52
+ # Ergebnisse ausgeben
52
53
  #
53
54
 
54
- # Erstelle Datei mit Endung .log für Datenstrom
55
- - vector_filter: { in: syn, debug: 'true', prompt: 'lex:) ' }
56
- - text_writer: { ext: log, sep: "\n" }
55
+ # Erstelle Datei mit Endung .log für Datenstrom
56
+ - vector_filter: { in: syn, debug: 'true', prompt: 'lex:) ' }
57
+ - text_writer: { ext: log, sep: "\n" }
57
58
 
58
- # Erstelle Datei mit Endung .non für nicht erkannte Wörter
59
- - noneword_filter: { in: syn }
60
- - text_writer: { ext: non }
59
+ # Erstelle Datei mit Endung .non für nicht erkannte Wörter
60
+ - noneword_filter: { in: syn }
61
+ - text_writer: { ext: non, sep: '|' }
61
62
 
62
- # Erstelle Datei mit Endung .csv für erkannte Indexterme
63
- - vector_filter: { in: syn, lexicals: '^[ksavem]$' }
64
- - text_writer: { ext: csv }
63
+ # Erstelle Datei mit Endung .vec für erkannte Indexterme
64
+ - vector_filter: { in: syn, lexicals: '^[ksavem]$' }
65
+ - text_writer: { ext: vec, sep: '|' }
65
66
 
66
- # Erstelle Datei mit Endung .mul für erkannte Mehrwortgruppen
67
- - vector_filter: { in: syn, lexicals: m }
68
- - text_writer: { ext: mul }
67
+ # Erstelle Datei mit Endung .mul für erkannte Mehrwortgruppen
68
+ - vector_filter: { in: syn, lexicals: m }
69
+ - text_writer: { ext: mul, sep: '|' }
69
70
 
70
- # Erstelle Datei mit Endung .seq für erkannte Wortsequenzen
71
- - vector_filter: { in: syn, lexicals: q, sort: 'term_abs' }
72
- - text_writer: { ext: seq }
71
+ # Erstelle Datei mit Endung .seq für erkannte Wortsequenzen
72
+ - vector_filter: { in: syn, lexicals: q, sort: term_abs }
73
+ - text_writer: { ext: seq, sep: '|' }
73
74
 
74
- # Erstelle Datei mit Endung .syn für erkannte Synonyme
75
- - vector_filter: { in: syn, lexicals: y, sort: 'term_abs' }
76
- - text_writer: { ext: syn }
75
+ # Erstelle Datei mit Endung .syn für erkannte Synonyme
76
+ - vector_filter: { in: syn, lexicals: y, sort: term_abs }
77
+ - text_writer: { ext: syn, sep: '|' }
@@ -5,7 +5,7 @@ require_relative '../test_helper'
5
5
  class TestAttendeeAbbreviator < AttendeeTestCase
6
6
 
7
7
  def test_basic
8
- @input = [
8
+ meet({ 'source' => 'sys-abk' }, [
9
9
  tk('z.b|ABRV'), tk('.|PUNC'),
10
10
  tk('im|WORD'),
11
11
  tk('14.|NUMS'),
@@ -13,8 +13,7 @@ class TestAttendeeAbbreviator < AttendeeTestCase
13
13
  tk('15.|NUMS'),
14
14
  tk('Jh|WORD'), tk('.|PUNC'),
15
15
  ai('EOL|')
16
- ]
17
- @expect = [
16
+ ], [
18
17
  wd('z.b.|IDF', 'zum beispiel|w'),
19
18
  tk('im|WORD'),
20
19
  tk('14.|NUMS'),
@@ -22,8 +21,7 @@ class TestAttendeeAbbreviator < AttendeeTestCase
22
21
  tk('15.|NUMS'),
23
22
  wd('Jh.|IDF', 'jahrhundert|s'),
24
23
  ai('EOL|')
25
- ]
26
- meet({'source'=>'sys-abk'})
24
+ ])
27
25
  end
28
26
 
29
27
  end
@@ -5,21 +5,19 @@ require_relative '../test_helper'
5
5
  class TestAttendeeDecomposer < AttendeeTestCase
6
6
 
7
7
  def test_basic
8
- @input = [
8
+ meet({ 'source' => 'sys-dic' }, [
9
9
  wd('Kleinseite|?'),
10
10
  wd('Arrafat-Nachfolger|?'),
11
11
  wd('Afganistan-Reisen|?'),
12
12
  wd('Kompositumzerlegung|?'),
13
13
  wd('Kompositumzerlegung|?')
14
- ]
15
- @expect = [
14
+ ], [
16
15
  wd('Kleinseite|KOM', 'kleinseite|k', 'klein|a+', 'seite|s+'),
17
16
  wd('Arrafat-Nachfolger|KOM', 'arrafat-nachfolger|k', 'nachfolger|s+', 'arrafat|x+'),
18
17
  wd('Afganistan-Reisen|KOM', 'afganistan-reise|k', 'reise|s+', 'reisen|v+', 'afganistan|x+'),
19
18
  wd('Kompositumzerlegung|KOM', 'kompositumzerlegung|k', 'kompositum|s+', 'zerlegung|s+'),
20
19
  wd('Kompositumzerlegung|KOM', 'kompositumzerlegung|k', 'kompositum|s+', 'zerlegung|s+')
21
- ]
22
- meet({'source'=>'sys-dic'})
20
+ ])
23
21
  end
24
22
 
25
23
  end