lingo 1.8.5 → 1.8.6

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 (109) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +25 -0
  3. data/README +7 -5
  4. data/Rakefile +58 -55
  5. data/{lingo-call.cfg → config/lingo-call.cfg} +1 -1
  6. data/{lingo.cfg → config/lingo.cfg} +10 -2
  7. data/{lir.cfg → config/lir.cfg} +10 -2
  8. data/{de → dict/de}/lingo-abk.txt +0 -0
  9. data/{de → dict/de}/lingo-dic.txt +0 -0
  10. data/{de → dict/de}/lingo-mul.txt +0 -0
  11. data/{de → dict/de}/lingo-syn.txt +0 -0
  12. data/{de → dict/de}/test_dic.txt +0 -0
  13. data/{de → dict/de}/test_gen.txt +0 -0
  14. data/{de → dict/de}/test_mu2.txt +0 -0
  15. data/{de → dict/de}/test_mul.txt +0 -0
  16. data/{de → dict/de}/test_sgw.txt +0 -0
  17. data/{de → dict/de}/test_syn.txt +0 -0
  18. data/{de → dict/de}/user-dic.txt +0 -0
  19. data/{en → dict/en}/lingo-dic.txt +0 -0
  20. data/{en → dict/en}/lingo-irr.txt +0 -0
  21. data/{en → dict/en}/lingo-mul.txt +0 -0
  22. data/{en → dict/en}/lingo-syn.txt +0 -0
  23. data/{en → dict/en}/lingo-wdn.txt +0 -0
  24. data/{en → dict/en}/user-dic.txt +0 -0
  25. data/{ru → dict/ru}/lingo-dic.txt +0 -0
  26. data/{ru → dict/ru}/lingo-mul.txt +0 -0
  27. data/{ru → dict/ru}/lingo-syn.txt +0 -0
  28. data/{ru → dict/ru}/user-dic.txt +0 -0
  29. data/{de.lang → lang/de.lang} +1 -1
  30. data/{en.lang → lang/en.lang} +0 -0
  31. data/{ru.lang → lang/ru.lang} +0 -0
  32. data/lib/lingo.rb +14 -15
  33. data/lib/lingo/app.rb +4 -2
  34. data/lib/lingo/attendee.rb +23 -43
  35. data/lib/lingo/attendee/abbreviator.rb +5 -5
  36. data/lib/lingo/attendee/debugger.rb +39 -12
  37. data/lib/lingo/attendee/decomposer.rb +3 -4
  38. data/lib/lingo/attendee/dehyphenizer.rb +4 -4
  39. data/lib/lingo/attendee/formatter.rb +1 -3
  40. data/lib/lingo/attendee/multi_worder.rb +3 -4
  41. data/lib/lingo/attendee/noneword_filter.rb +8 -12
  42. data/lib/lingo/attendee/object_filter.rb +6 -3
  43. data/lib/lingo/attendee/sequencer.rb +5 -5
  44. data/lib/lingo/attendee/stemmer.rb +3 -2
  45. data/lib/lingo/attendee/synonymer.rb +3 -4
  46. data/lib/lingo/attendee/text_reader.rb +39 -38
  47. data/lib/lingo/attendee/text_writer.rb +10 -10
  48. data/lib/lingo/attendee/tokenizer.rb +63 -33
  49. data/lib/lingo/attendee/variator.rb +3 -7
  50. data/lib/lingo/attendee/vector_filter.rb +132 -65
  51. data/lib/lingo/attendee/word_searcher.rb +5 -3
  52. data/lib/lingo/buffered_attendee.rb +1 -3
  53. data/lib/lingo/call.rb +4 -3
  54. data/lib/lingo/cli.rb +5 -1
  55. data/lib/lingo/config.rb +11 -5
  56. data/lib/lingo/ctl.rb +3 -3
  57. data/lib/lingo/database.rb +3 -1
  58. data/lib/lingo/database/crypter.rb +1 -3
  59. data/lib/lingo/database/source.rb +3 -1
  60. data/lib/lingo/database/source/key_value.rb +3 -1
  61. data/lib/lingo/database/source/multi_key.rb +3 -1
  62. data/lib/lingo/database/source/multi_value.rb +3 -1
  63. data/lib/lingo/database/source/single_word.rb +3 -1
  64. data/lib/lingo/database/source/word_class.rb +3 -1
  65. data/lib/lingo/debug.rb +5 -5
  66. data/lib/lingo/{agenda_item.rb → deferred_attendee.rb} +21 -12
  67. data/lib/lingo/error.rb +1 -1
  68. data/lib/lingo/language.rb +1 -9
  69. data/lib/lingo/language/dictionary.rb +2 -17
  70. data/lib/lingo/language/grammar.rb +10 -10
  71. data/lib/lingo/language/lexical.rb +2 -0
  72. data/lib/lingo/language/lexical_hash.rb +2 -0
  73. data/lib/lingo/language/token.rb +17 -3
  74. data/lib/lingo/language/word.rb +13 -5
  75. data/lib/lingo/language/word_form.rb +5 -3
  76. data/lib/lingo/progress.rb +2 -2
  77. data/lib/lingo/srv.rb +1 -1
  78. data/lib/lingo/srv/lingosrv.cfg +1 -1
  79. data/lib/lingo/version.rb +1 -1
  80. data/lib/lingo/web.rb +1 -1
  81. data/lib/lingo/web/lingoweb.cfg +1 -1
  82. data/test/attendee/ts_abbreviator.rb +4 -2
  83. data/test/attendee/ts_multi_worder.rb +81 -88
  84. data/test/attendee/ts_noneword_filter.rb +2 -2
  85. data/test/attendee/ts_object_filter.rb +2 -2
  86. data/test/attendee/ts_sequencer.rb +40 -20
  87. data/test/attendee/ts_stemmer.rb +52 -26
  88. data/test/attendee/ts_text_reader.rb +75 -56
  89. data/test/attendee/ts_text_writer.rb +6 -4
  90. data/test/attendee/ts_tokenizer.rb +304 -193
  91. data/test/attendee/ts_vector_filter.rb +242 -9
  92. data/test/ref/artikel.non +3 -0
  93. data/test/ref/artikel.vec +1 -4
  94. data/test/ref/artikel.vef +940 -0
  95. data/test/ref/artikel.ven +0 -3
  96. data/test/ref/artikel.ver +0 -3
  97. data/test/ref/artikel.vet +2580 -0
  98. data/test/ref/lir.non +34 -31
  99. data/test/ref/lir.seq +14 -15
  100. data/test/ref/lir.vec +37 -37
  101. data/test/ref/lir.vef +329 -0
  102. data/test/ref/lir.ven +329 -0
  103. data/test/ref/lir.ver +329 -0
  104. data/test/ref/lir.vet +329 -0
  105. data/test/test_helper.rb +29 -16
  106. data/test/ts_language.rb +6 -47
  107. metadata +74 -87
  108. data/lingo.rb +0 -29
  109. data/spec/spec_helper.rb +0 -5
@@ -28,28 +28,42 @@ class Lingo
28
28
 
29
29
  module Language
30
30
 
31
+ #--
31
32
  # Die Klasse Token, abgeleitet von der Klasse WordForm, stellt den Container
32
33
  # für ein einzelnes Wort eines Textes dar. Das Wort wird mit einem Attribut versehen,
33
34
  # welches der Regel entspricht, die dieses Wort identifiziert hat.
34
35
  #
35
36
  # Steht z.B. in ruby.cfg eine Regel zur Erkennung einer Zahl, die mit NUM bezeichnet wird,
36
37
  # so wird dies dem Token angeheftet, z.B. Token.new('100', 'NUM') -> #100/NUM#
38
+ #++
37
39
 
38
40
  class Token < WordForm
39
41
 
42
+ POSITION_SEP = ':'
43
+
40
44
  def self.clean(attr)
41
45
  attr.sub(/:.*/, '')
42
46
  end
43
47
 
44
- def initialize(*)
45
- super
46
- @attr = self.class.clean(attr)
48
+ def initialize(form, attr, position = nil, offset = nil)
49
+ @position, @offset = position, offset
50
+ super(form, self.class.clean(attr))
47
51
  end
48
52
 
53
+ attr_reader :position, :offset
54
+
49
55
  def word?
50
56
  attr == TA_WORD
51
57
  end
52
58
 
59
+ def position_and_offset
60
+ "#{position}#{POSITION_SEP}#{offset}"
61
+ end
62
+
63
+ def to_a
64
+ [form, attr, position, offset]
65
+ end
66
+
53
67
  def to_s
54
68
  ":#{super}:"
55
69
  end
@@ -6,7 +6,7 @@
6
6
  # Lingo -- A full-featured automatic indexing system #
7
7
  # #
8
8
  # Copyright (C) 2005-2007 John Vorhauer #
9
- # Copyright (C) 2007-2013 John Vorhauer, Jens Wille #
9
+ # Copyright (C) 2007-2014 John Vorhauer, Jens Wille #
10
10
  # #
11
11
  # Lingo is free software; you can redistribute it and/or modify it under the #
12
12
  # terms of the GNU Affero General Public License as published by the Free #
@@ -28,8 +28,10 @@ class Lingo
28
28
 
29
29
  module Language
30
30
 
31
+ #--
31
32
  # Die Klasse Word bündelt spezifische Eigenschaften eines Wortes mit den
32
33
  # dazu notwendigen Methoden.
34
+ #++
33
35
 
34
36
  class Word < WordForm
35
37
 
@@ -59,6 +61,7 @@ class Lingo
59
61
 
60
62
  end
61
63
 
64
+ #--
62
65
  # Exakte Representation der originären Zeichenkette, so wie sie im Satz
63
66
  # gefunden wurde, z.B. <tt>form = "RubyLing"</tt>
64
67
  #
@@ -71,12 +74,15 @@ class Lingo
71
74
  #
72
75
  # <b>Achtung: Lemma wird nicht durch die Word-Klasse bestückt, sondern extern
73
76
  # durch die Klasse Dictionary</b>
77
+ #++
74
78
 
75
- def initialize(form, attr = WA_UNSET)
79
+ def initialize(form, attr = WA_UNSET, token = nil)
80
+ @token, @lexicals = token, []
76
81
  super
77
- @lexicals = []
78
82
  end
79
83
 
84
+ attr_reader :token
85
+
80
86
  attr_writer :lexicals
81
87
 
82
88
  def lexicals(compound_parts = true)
@@ -113,8 +119,6 @@ class Lingo
113
119
  self
114
120
  end
115
121
 
116
- # Gibt genau die Grundform der Wortklasse zurück, die der RegExp des Übergabe-Parameters
117
- # entspricht, z.B. <tt>word.get_wc(/a/) = ['abgeschoben', '#a']</tt>
118
122
  def get_class(wc_re)
119
123
  wc_re = Regexp.new(wc_re) unless wc_re.is_a?(Regexp)
120
124
 
@@ -138,6 +142,10 @@ class Lingo
138
142
  lex = get_class(wc_re).first and lex.form.count(' ') + 1
139
143
  end
140
144
 
145
+ def position_and_offset
146
+ token.position_and_offset if token
147
+ end
148
+
141
149
  def <<(*lex)
142
150
  lex.flatten!
143
151
  @lexicals.concat(lex)
@@ -6,7 +6,7 @@
6
6
  # Lingo -- A full-featured automatic indexing system #
7
7
  # #
8
8
  # Copyright (C) 2005-2007 John Vorhauer #
9
- # Copyright (C) 2007-2013 John Vorhauer, Jens Wille #
9
+ # Copyright (C) 2007-2014 John Vorhauer, Jens Wille #
10
10
  # #
11
11
  # Lingo is free software; you can redistribute it and/or modify it under the #
12
12
  # terms of the GNU Affero General Public License as published by the Free #
@@ -28,9 +28,11 @@ class Lingo
28
28
 
29
29
  module Language
30
30
 
31
+ #--
31
32
  # Die Klasse WordForm ist die Basisklasse für weitere Klassen, die im Rahmen der
32
33
  # Objektstruktur eines Wortes benötigt werden. Die Klasse stellt eine Zeichenkette bereit,
33
34
  # die mit einem Attribut versehen werden kann.
35
+ #++
34
36
 
35
37
  class WordForm
36
38
 
@@ -56,11 +58,11 @@ class Lingo
56
58
  end
57
59
 
58
60
  def to_a
59
- [form, attr, gender].compact
61
+ [form, attr, gender]
60
62
  end
61
63
 
62
64
  def to_s
63
- to_a.join('/')
65
+ to_a.compact.join('/')
64
66
  end
65
67
 
66
68
  def inspect
@@ -6,7 +6,7 @@
6
6
  # Lingo -- A full-featured automatic indexing system #
7
7
  # #
8
8
  # Copyright (C) 2005-2007 John Vorhauer #
9
- # Copyright (C) 2007-2012 John Vorhauer, Jens Wille #
9
+ # Copyright (C) 2007-2014 John Vorhauer, Jens Wille #
10
10
  # #
11
11
  # Lingo is free software; you can redistribute it and/or modify it under the #
12
12
  # terms of the GNU Affero General Public License as published by the Free #
@@ -54,7 +54,7 @@ class Lingo
54
54
  begin
55
55
  yield self
56
56
  ensure
57
- trap(:INT, &int)
57
+ trap(:INT, int)
58
58
  end
59
59
 
60
60
  suc = true
@@ -58,7 +58,7 @@ class Lingo
58
58
  r = LINGO.talk(q) unless q.empty?
59
59
  return r unless r && SRC_SEP
60
60
 
61
- s = Hash.new { |h, k| h[k] = [] }
61
+ s = Hash.nest { [] }
62
62
 
63
63
  r.each { |t|
64
64
  a, b = t.split(SRC_SEP, 2)
@@ -10,5 +10,5 @@ meeting:
10
10
  - sequencer: { stopper: 'PUNC,OTHR' }
11
11
  - synonymer: { skip: '?,t', source: sys-syn }
12
12
 
13
- - vector_filter: { debug: 'true', prompt: '', preamble: false }
13
+ - debug_filter: { preamble: false }
14
14
  - text_writer: { ext: STDOUT, sep: "\n" }
@@ -4,7 +4,7 @@ class Lingo
4
4
 
5
5
  MAJOR = 1
6
6
  MINOR = 8
7
- TINY = 5
7
+ TINY = 6
8
8
 
9
9
  class << self
10
10
 
@@ -48,7 +48,7 @@ class Lingo
48
48
  use(Rack::Auth::Basic) { |*b| b == c } unless c.empty?
49
49
  end
50
50
 
51
- LINGO = Hash.new { |h, k| h[k] = Lingo.call(cfg, ['-l', k]) }
51
+ LINGO = Hash.nest { |k| Lingo.call(cfg, ['-l', k]) }
52
52
 
53
53
  CFG, s, h = '', StringScanner.new(''), ERB::Util.method(:h)
54
54
  c = lambda { |n| %Q{<span style="color:#{n}">#{h[s.matched]}</span>} }
@@ -10,5 +10,5 @@ meeting:
10
10
  - sequencer: { stopper: 'PUNC,OTHR' }
11
11
  - synonymer: { skip: '?,t', source: sys-syn }
12
12
 
13
- - vector_filter: { debug: 'true', prompt: '', preamble: false }
13
+ - debug_filter: { preamble: false }
14
14
  - text_writer: { ext: STDOUT, sep: "\n" }
@@ -33,7 +33,8 @@ class TestAttendeeAbbreviator < AttendeeTestCase
33
33
  tk('Punkt|WORD'),
34
34
  tk('am|WORD'),
35
35
  tk('Ende|WORD'),
36
- ai('EOF|')
36
+ ai('EOF|'),
37
+ ai('EOT|')
37
38
  ], [
38
39
  tk('Dieser|WORD'),
39
40
  tk('Satz|WORD'),
@@ -42,7 +43,8 @@ class TestAttendeeAbbreviator < AttendeeTestCase
42
43
  tk('Punkt|WORD'),
43
44
  tk('am|WORD'),
44
45
  tk('Ende|WORD'),
45
- ai('EOF|')
46
+ ai('EOF|'),
47
+ ai('EOT|')
46
48
  ])
47
49
  end
48
50
 
@@ -7,53 +7,41 @@ class TestAttendeeMultiWorder < AttendeeTestCase
7
7
  def test_basic
8
8
  meet({ 'source' => 'tst-mul' }, [
9
9
  ai('FILE|mul.txt'),
10
- # John_F_._Kennedy
11
10
  wd('John|IDF', 'john|e'), wd('F|?'), tk('.|PUNC'), wd('Kennedy|IDF', 'kennedy|e'),
12
- # John_F_Kennedy
13
11
  wd('John|IDF', 'john|e'), wd('F|?'), wd('Kennedy|IDF', 'kennedy|e'),
14
- # John_F_Kennedy_.
15
12
  wd('John|IDF', 'john|e'), wd('F|?'), wd('Kennedy|IDF', 'kennedy|e'), tk('.|PUNC'),
16
- # a_priori
17
13
  wd('a|?'), wd('priori|IDF', 'priori|w'),
18
- # Ableitung_nicht_ganzzahliger_Ordnung
19
14
  wd('Ableitung|IDF', 'ableitung|s'),
20
15
  wd('nicht|IDF', 'nicht|w'),
21
16
  wd('ganzzahliger|IDF', 'ganzzahlig|a'),
22
17
  wd('Ordnung|IDF', 'ordnung|s'),
23
- # Academic_learning_time_in_physical_education
24
18
  wd('academic|?'), wd('learning|?'), wd('time|IDF', 'timen|v'),
25
19
  wd('in|IDF', 'in|t'), wd('physical|?'), wd('education|?'),
26
- # Satzende
27
20
  tk('.|PUNC'),
28
- ai('EOF|mul.txt')
21
+ ai('EOF|mul.txt'),
22
+ ai('EOT|')
29
23
  ], [
30
24
  ai('FILE|mul.txt'),
31
- # John_F_._Kennedy
32
25
  wd('John F. Kennedy|MUL', 'john f. kennedy|m'),
33
26
  wd('John|IDF', 'john|e'), wd('F|MU?'), wd('Kennedy|IDF', 'kennedy|e'),
34
- # John_F_Kennedy
35
27
  wd('John F Kennedy|MUL', 'john f. kennedy|m'),
36
28
  wd('John|IDF', 'john|e'), wd('F|MU?'), wd('Kennedy|IDF', 'kennedy|e'),
37
- # John_F_Kennedy_.
38
29
  wd('John F Kennedy|MUL', 'john f. kennedy|m'),
39
30
  wd('John|IDF', 'john|e'), wd('F|MU?'), wd('Kennedy|IDF', 'kennedy|e'),
40
31
  tk('.|PUNC'),
41
- # a_priori
42
32
  wd('a priori|MUL', 'a priori|m'),
43
33
  wd('a|MU?'), wd('priori|IDF', 'priori|w'),
44
- # Ableitung_nicht_ganzzahliger_Ordnung
45
34
  wd('Ableitung nicht ganzzahliger Ordnung|MUL', 'ableitung nicht ganzzahliger ordnung|m'),
46
35
  wd('Ableitung|IDF', 'ableitung|s'),
47
36
  wd('nicht|IDF', 'nicht|w'),
48
37
  wd('ganzzahliger|IDF', 'ganzzahlig|a'),
49
38
  wd('Ordnung|IDF', 'ordnung|s'),
50
- # Academic_learning_time_in_physical_education
51
39
  wd('academic learning time in physical education|MUL', 'academic learning time in physical education|m'),
52
40
  wd('academic|MU?'), wd('learning|MU?'), wd('time|IDF', 'timen|v'),
53
41
  wd('in|IDF', 'in|t'), wd('physical|MU?'), wd('education|MU?'),
54
- # Satzende
55
42
  tk('.|PUNC'),
56
- ai('EOF|mul.txt')
43
+ ai('EOF|mul.txt'),
44
+ ai('EOT|')
57
45
  ])
58
46
  end
59
47
 
@@ -61,45 +49,53 @@ class TestAttendeeMultiWorder < AttendeeTestCase
61
49
  meet({ 'source' => 'tst-mul' }, [
62
50
  ai('FILE|mul.txt'),
63
51
  wd('Abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), tk('.|PUNC'),
64
- ai('EOF|mul.txt')
52
+ ai('EOF|mul.txt'),
53
+ ai('EOT|')
65
54
  ], [
66
55
  ai('FILE|mul.txt'),
67
56
  wd('Abelsches Schema|MUL', 'abelsches schema|m'),
68
57
  wd('Abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), tk('.|PUNC'),
69
- ai('EOF|mul.txt')
58
+ ai('EOF|mul.txt'),
59
+ ai('EOT|')
70
60
  ])
71
61
 
72
62
  meet({ 'source' => 'tst-mul' }, [
73
63
  ai('FILE|mul.txt'),
74
64
  wd('Tolles|IDF', 'toll|a'), wd('abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), tk('.|PUNC'),
75
- ai('EOF|mul.txt')
65
+ ai('EOF|mul.txt'),
66
+ ai('EOT|')
76
67
  ], [
77
68
  ai('FILE|mul.txt'),
78
69
  wd('Tolles abelsches Schema|MUL', 'tolles abelsches schema|m'),
79
70
  wd('Tolles|IDF', 'toll|a'), wd('abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), tk('.|PUNC'),
80
- ai('EOF|mul.txt')
71
+ ai('EOF|mul.txt'),
72
+ ai('EOT|')
81
73
  ])
82
74
 
83
75
  meet({ 'source' => 'tst-mul' }, [
84
76
  ai('FILE|mul.txt'),
85
77
  wd('Super|IDF', 'super|a'), wd('tolles|IDF', 'toll|a'), wd('abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), tk('.|PUNC'),
86
- ai('EOF|mul.txt')
78
+ ai('EOF|mul.txt'),
79
+ ai('EOT|')
87
80
  ], [
88
81
  ai('FILE|mul.txt'),
89
82
  wd('Super tolles abelsches Schema|MUL', 'super tolles abelsches schema|m'),
90
83
  wd('Super|IDF', 'super|a'), wd('tolles|IDF', 'toll|a'), wd('abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), tk('.|PUNC'),
91
- ai('EOF|mul.txt')
84
+ ai('EOF|mul.txt'),
85
+ ai('EOT|')
92
86
  ])
93
87
 
94
88
  meet({ 'source' => 'tst-mul' }, [
95
89
  ai('FILE|mul.txt'),
96
90
  wd('Extra|IDF', 'extra|a'), wd('super|IDF', 'super|a'), wd('tolles|IDF', 'toll|a'), wd('abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), tk('.|PUNC'),
97
- ai('EOF|mul.txt')
91
+ ai('EOF|mul.txt'),
92
+ ai('EOT|')
98
93
  ], [
99
94
  ai('FILE|mul.txt'),
100
95
  wd('Extra super tolles abelsches Schema|MUL', 'extra super tolles abelsches schema|m'),
101
96
  wd('Extra|IDF', 'extra|a'), wd('super|IDF', 'super|a'), wd('tolles|IDF', 'toll|a'), wd('abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), tk('.|PUNC'),
102
- ai('EOF|mul.txt')
97
+ ai('EOF|mul.txt'),
98
+ ai('EOT|')
103
99
  ])
104
100
  end
105
101
 
@@ -107,45 +103,53 @@ class TestAttendeeMultiWorder < AttendeeTestCase
107
103
  meet({ 'source' => 'tst-mul' }, [
108
104
  ai('FILE|mul.txt'),
109
105
  wd('Abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), tk('.|PUNC'),
110
- ai('EOF|mul.txt')
106
+ ai('EOF|mul.txt'),
107
+ ai('EOT|')
111
108
  ], [
112
109
  ai('FILE|mul.txt'),
113
110
  wd('Abelsches Schema|MUL', 'abelsches schema|m'),
114
111
  wd('Abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), tk('.|PUNC'),
115
- ai('EOF|mul.txt')
112
+ ai('EOF|mul.txt'),
113
+ ai('EOT|')
116
114
  ])
117
115
 
118
116
  meet({ 'source' => 'tst-mul' }, [
119
117
  ai('FILE|mul.txt'),
120
118
  wd('Abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), wd('toll|IDF', 'toll|a'), tk('.|PUNC'),
121
- ai('EOF|mul.txt')
119
+ ai('EOF|mul.txt'),
120
+ ai('EOT|')
122
121
  ], [
123
122
  ai('FILE|mul.txt'),
124
123
  wd('Abelsches Schema toll|MUL', 'abelsches schema toll|m'),
125
124
  wd('Abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), wd('toll|IDF', 'toll|a'), tk('.|PUNC'),
126
- ai('EOF|mul.txt')
125
+ ai('EOF|mul.txt'),
126
+ ai('EOT|')
127
127
  ])
128
128
 
129
129
  meet({ 'source' => 'tst-mul' }, [
130
130
  ai('FILE|mul.txt'),
131
131
  wd('Abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), wd('toll|IDF', 'toll|a'), wd('super|IDF', 'super|a'), tk('.|PUNC'),
132
- ai('EOF|mul.txt')
132
+ ai('EOF|mul.txt'),
133
+ ai('EOT|')
133
134
  ], [
134
135
  ai('FILE|mul.txt'),
135
136
  wd('Abelsches Schema toll super|MUL', 'abelsches schema toll super|m'),
136
137
  wd('Abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), wd('toll|IDF', 'toll|a'), wd('super|IDF', 'super|a'), tk('.|PUNC'),
137
- ai('EOF|mul.txt')
138
+ ai('EOF|mul.txt'),
139
+ ai('EOT|')
138
140
  ])
139
141
 
140
142
  meet({ 'source' => 'tst-mul' }, [
141
143
  ai('FILE|mul.txt'),
142
144
  wd('Abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), wd('toll|IDF', 'toll|a'), wd('super|IDF', 'super|a'), wd('extra|IDF', 'extra|a'), tk('.|PUNC'),
143
- ai('EOF|mul.txt')
145
+ ai('EOF|mul.txt'),
146
+ ai('EOT|')
144
147
  ], [
145
148
  ai('FILE|mul.txt'),
146
149
  wd('Abelsches Schema toll super extra|MUL', 'abelsches schema toll super extra|m'),
147
150
  wd('Abelsches|IDF', 'abelsch|a'), wd('Schema|IDF', 'schema|s'), wd('toll|IDF', 'toll|a'), wd('super|IDF', 'super|a'), wd('extra|IDF', 'extra|a'), tk('.|PUNC'),
148
- ai('EOF|mul.txt')
151
+ ai('EOF|mul.txt'),
152
+ ai('EOT|')
149
153
  ])
150
154
  end
151
155
 
@@ -154,172 +158,161 @@ class TestAttendeeMultiWorder < AttendeeTestCase
154
158
  ai('FILE|mul.txt'),
155
159
  wd('John|IDF', 'john|e'), wd('F|?'), tk('.|PUNC'), wd('Kennedy|IDF', 'kennedy|e'),
156
160
  wd('war|IDF', 'war|w'), wd('einmal|IDF', 'einmal|w'), wd('Präsident|IDF', 'präsident|s'), tk('.|PUNC'),
157
- ai('EOF|mul.txt')
161
+ ai('EOF|mul.txt'),
162
+ ai('EOT|')
158
163
  ], [
159
164
  ai('FILE|mul.txt'),
160
165
  wd('John F. Kennedy|MUL', 'john f. kennedy|m'),
161
166
  wd('John|IDF', 'john|e'), wd('F|MU?'), wd('Kennedy|IDF', 'kennedy|e'),
162
167
  wd('war|IDF', 'war|w'), wd('einmal|IDF', 'einmal|w'), wd('Präsident|IDF', 'präsident|s'), tk('.|PUNC'),
163
- ai('EOF|mul.txt')
168
+ ai('EOF|mul.txt'),
169
+ ai('EOT|')
164
170
  ])
165
171
 
166
- input.delete_at(-3)
172
+ input.delete_at(-4)
167
173
  meet({ 'source' => 'tst-mul' }, input, [
168
174
  ai('FILE|mul.txt'),
169
175
  wd('John F. Kennedy|MUL', 'john f. kennedy|m'),
170
176
  wd('John|IDF', 'john|e'), wd('F|MU?'), wd('Kennedy|IDF', 'kennedy|e'),
171
177
  wd('war|IDF', 'war|w'), wd('einmal|IDF', 'einmal|w'), tk('.|PUNC'),
172
- ai('EOF|mul.txt')
178
+ ai('EOF|mul.txt'),
179
+ ai('EOT|')
173
180
  ])
174
181
 
175
- input.delete_at(-3)
182
+ input.delete_at(-4)
176
183
  meet({ 'source' => 'tst-mul' }, input, [
177
184
  ai('FILE|mul.txt'),
178
185
  wd('John F. Kennedy|MUL', 'john f. kennedy|m'),
179
186
  wd('John|IDF', 'john|e'), wd('F|MU?'), wd('Kennedy|IDF', 'kennedy|e'),
180
187
  wd('war|IDF', 'war|w'), tk('.|PUNC'),
181
- ai('EOF|mul.txt')
188
+ ai('EOF|mul.txt'),
189
+ ai('EOT|')
182
190
  ])
183
191
 
184
- input.delete_at(-3)
192
+ input.delete_at(-4)
185
193
  meet({ 'source' => 'tst-mul' }, input, [
186
194
  ai('FILE|mul.txt'),
187
195
  wd('John F. Kennedy|MUL', 'john f. kennedy|m'),
188
196
  wd('John|IDF', 'john|e'), wd('F|MU?'), wd('Kennedy|IDF', 'kennedy|e'),
189
197
  tk('.|PUNC'),
190
- ai('EOF|mul.txt')
198
+ ai('EOF|mul.txt'),
199
+ ai('EOT|')
191
200
  ])
192
201
  end
193
202
 
194
203
  def test_two_sources_mode_first
195
- # in keinen WB enthalten
196
204
  meet({ 'source' => 'tst-mul,tst-mu2', 'mode' => 'first' }, [
197
- wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt')
205
+ wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt'), ai('EOT|')
198
206
  ], [
199
- wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt')
207
+ wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt'), ai('EOT|')
200
208
  ])
201
209
 
202
- # im ersten WB enthalten
203
210
  meet({ 'source' => 'tst-mul,tst-mu2', 'mode' => 'first' }, [
204
- wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt')
211
+ wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt'), ai('EOT|')
205
212
  ], [
206
213
  wd('abstrakten Kunst|MUL', 'abstrakte kunst|m'),
207
- wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt')
214
+ wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt'), ai('EOT|')
208
215
  ])
209
216
 
210
- # im zweiten WB enthalten
211
217
  meet({ 'source' => 'tst-mul,tst-mu2', 'mode' => 'first' }, [
212
- wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt')
218
+ wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt'), ai('EOT|')
213
219
  ], [
214
220
  wd('traumatischer Angelegenheit|MUL', 'traumatische angelegenheit|m'),
215
- wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt')
221
+ wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt'), ai('EOT|')
216
222
  ])
217
223
 
218
- # in beiden WB enthalten
219
224
  meet({ 'source' => 'tst-mul,tst-mu2', 'mode' => 'first' }, [
220
- wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt')
225
+ wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt'), ai('EOT|')
221
226
  ], [
222
227
  wd('azyklischen Bewegungen|MUL', 'chaotisches movement|m'),
223
- wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt')
228
+ wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt'), ai('EOT|')
224
229
  ])
225
230
  end
226
231
 
227
232
  def test_two_sources_mode_first_flipped
228
- # in keinen WB enthalten
229
233
  meet({ 'source' => 'tst-mu2,tst-mul', 'mode' => 'first' }, [
230
- wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt')
234
+ wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt'), ai('EOT|')
231
235
  ], [
232
- wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt')
236
+ wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt'), ai('EOT|')
233
237
  ])
234
238
 
235
- # im ersten WB enthalten
236
239
  meet({ 'source' => 'tst-mu2,tst-mul', 'mode' => 'first' }, [
237
- wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt')
240
+ wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt'), ai('EOT|')
238
241
  ], [
239
242
  wd('abstrakten Kunst|MUL', 'abstrakte kunst|m'),
240
- wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt')
243
+ wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt'), ai('EOT|')
241
244
  ])
242
245
 
243
- # im zweiten WB enthalten
244
246
  meet({ 'source' => 'tst-mu2,tst-mul', 'mode' => 'first' }, [
245
- wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt')
247
+ wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt'), ai('EOT|')
246
248
  ], [
247
249
  wd('traumatischer Angelegenheit|MUL', 'traumatische angelegenheit|m'),
248
- wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt')
250
+ wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt'), ai('EOT|')
249
251
  ])
250
252
 
251
- # in beiden WB enthalten
252
253
  meet({ 'source' => 'tst-mu2,tst-mul', 'mode' => 'first' }, [
253
- wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt')
254
+ wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt'), ai('EOT|')
254
255
  ], [
255
256
  wd('azyklischen Bewegungen|MUL', 'azyklische bewegung|m'),
256
- wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt')
257
+ wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt'), ai('EOT|')
257
258
  ])
258
259
  end
259
260
 
260
261
  def test_select_two_sources_mode_all
261
- # in keinen WB enthalten
262
262
  meet({ 'source' => 'tst-mu2,tst-mul', 'mode' => 'all' }, [
263
- wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt')
263
+ wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt'), ai('EOT|')
264
264
  ], [
265
- wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt')
265
+ wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt'), ai('EOT|')
266
266
  ])
267
267
 
268
- # im ersten WB enthalten
269
268
  meet({ 'source' => 'tst-mu2,tst-mul', 'mode' => 'all' }, [
270
- wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt')
269
+ wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt'), ai('EOT|')
271
270
  ], [
272
271
  wd('abstrakten Kunst|MUL', 'abstrakte kunst|m'),
273
- wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt')
272
+ wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt'), ai('EOT|')
274
273
  ])
275
274
 
276
- # im zweiten WB enthalten
277
275
  meet({ 'source' => 'tst-mu2,tst-mul', 'mode' => 'all' }, [
278
- wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt')
276
+ wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt'), ai('EOT|')
279
277
  ], [
280
278
  wd('traumatischer Angelegenheit|MUL', 'traumatische angelegenheit|m'),
281
- wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt')
279
+ wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt'), ai('EOT|')
282
280
  ])
283
281
 
284
- # in beiden WB enthalten
285
282
  meet({ 'source' => 'tst-mu2,tst-mul', 'mode' => 'all' }, [
286
- wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt')
283
+ wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt'), ai('EOT|')
287
284
  ], [
288
285
  wd('azyklischen Bewegungen|MUL', 'azyklische bewegung|m', 'chaotisches movement|m'),
289
- wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt')
286
+ wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt'), ai('EOT|')
290
287
  ])
291
288
  end
292
289
 
293
290
  def test_select_two_sources_mode_def
294
- # in keinen WB enthalten
295
291
  meet({ 'source' => 'tst-mu2,tst-mul' }, [
296
- wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt')
292
+ wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt'), ai('EOT|')
297
293
  ], [
298
- wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt')
294
+ wd('intelligente|IDF', 'intelligent|a'), wd('Indexierung|IDF', 'indexierung|s'), ai('EOF|mul.txt'), ai('EOT|')
299
295
  ])
300
296
 
301
- # im ersten WB enthalten
302
297
  meet({ 'source' => 'tst-mu2,tst-mul' }, [
303
- wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt')
298
+ wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt'), ai('EOT|')
304
299
  ], [
305
300
  wd('abstrakten Kunst|MUL', 'abstrakte kunst|m'),
306
- wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt')
301
+ wd('abstrakten|IDF', 'abstrakt|a'), wd('Kunst|IDF', 'kunst|s'), ai('EOF|mul.txt'), ai('EOT|')
307
302
  ])
308
303
 
309
- # im zweiten WB enthalten
310
304
  meet({ 'source' => 'tst-mu2,tst-mul' }, [
311
- wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt')
305
+ wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt'), ai('EOT|')
312
306
  ], [
313
307
  wd('traumatischer Angelegenheit|MUL', 'traumatische angelegenheit|m'),
314
- wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt')
308
+ wd('traumatischer|IDF', 'traumatisch|a'), wd('Angelegenheit|IDF', 'angelegenheit|s'), ai('EOF|mul.txt'), ai('EOT|')
315
309
  ])
316
310
 
317
- # in beiden WB enthalten
318
311
  meet({ 'source' => 'tst-mu2,tst-mul' }, [
319
- wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt')
312
+ wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt'), ai('EOT|')
320
313
  ], [
321
314
  wd('azyklischen Bewegungen|MUL', 'azyklische bewegung|m', 'chaotisches movement|m'),
322
- wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt')
315
+ wd('azyklischen|IDF', 'azyklisch|a'), wd('Bewegungen|IDF', 'bewegung|s'), ai('EOF|mul.txt'), ai('EOT|')
323
316
  ])
324
317
  end
325
318