lingo 1.8.5 → 1.8.6

Sign up to get free protection for your applications and to get access to all the features.
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