~snowball-yiddish-dev/snowball-yiddish/trunk

« back to all changes in this revision

Viewing changes to snowball/algorithms/english/stem.sbl

  • Committer: richard
  • Date: 2003-03-30 12:08:09 UTC
  • Revision ID: svn-v4:633ccae0-01f4-0310-8c99-d3591da6f01f:trunk:216
This module will contain only the code and build system, and documentation
for building and running the stemming library.
All sample data will be in a separate module, and the website will be in
its own module too.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
integers ( p1 p2 )
 
2
booleans ( Y_found )
 
3
 
 
4
routines (
 
5
    prelude postlude
 
6
    mark_regions
 
7
    shortv
 
8
    R1 R2
 
9
    Step_1a Step_1b Step_1c Step_2 Step_3 Step_4 Step_5
 
10
    exception1
 
11
    exception2
 
12
)
 
13
 
 
14
externals ( stem )
 
15
 
 
16
groupings ( v v_WXY valid_LI )
 
17
 
 
18
define v        'aeiouy'
 
19
define v_WXY    v + 'wxY'
 
20
 
 
21
define valid_LI 'cdeghkmnrt'
 
22
 
 
23
define prelude as (
 
24
    unset Y_found
 
25
    do ( ['y'] v <-'Y' set Y_found)
 
26
    do repeat(goto (v ['y']) <-'Y' set Y_found)
 
27
)
 
28
 
 
29
define mark_regions as (
 
30
    $p1 = limit
 
31
    $p2 = limit
 
32
    do(
 
33
        among (
 
34
            'gener'
 
35
            // ... extensions possible here ...
 
36
        ) or (gopast v  gopast non-v)
 
37
        setmark p1
 
38
        gopast v  gopast non-v  setmark p2
 
39
    )
 
40
)
 
41
 
 
42
backwardmode (
 
43
 
 
44
    define shortv as (
 
45
        ( non-v_WXY v non-v )
 
46
        or
 
47
        ( non-v v atlimit )
 
48
    )
 
49
 
 
50
    define R1 as $p1 <= cursor
 
51
    define R2 as $p2 <= cursor
 
52
 
 
53
    define Step_1a as (
 
54
        [substring] among (
 
55
            'sses' (<-'ss')
 
56
            'ied' 'ies'
 
57
                   ((next atlimit <-'ie') or <-'i')
 
58
            's'    (next gopast v delete)
 
59
            'us' 'ss'
 
60
        )
 
61
    )
 
62
 
 
63
    define Step_1b as (
 
64
        [substring] among (
 
65
            'eed' 'eedly'
 
66
                (R1 <-'ee')
 
67
            'ed' 'edly' 'ing' 'ingly'
 
68
                (
 
69
                test gopast v  delete
 
70
                test substring among(
 
71
                    'at' 'bl' 'iz'
 
72
                         (<+ 'e')
 
73
                    'bb' 'dd' 'ff' 'gg' 'mm' 'nn' 'pp' 'rr' 'tt'
 
74
                    // ignoring double c, h, j, k, q, v, w, and x
 
75
                         ([next]  delete)
 
76
                    ''   (atmark p1  test shortv  <+ 'e')
 
77
                )
 
78
            )
 
79
        )
 
80
    )
 
81
 
 
82
    define Step_1c as (
 
83
        ['y' or 'Y']
 
84
        non-v not atlimit
 
85
        <-'i'
 
86
    )
 
87
 
 
88
    define Step_2 as (
 
89
        [substring] R1 among (
 
90
            'tional'  (<-'tion')
 
91
            'enci'    (<-'ence')
 
92
            'anci'    (<-'ance')
 
93
            'abli'    (<-'able')
 
94
            'entli'   (<-'ent')
 
95
            'izer' 'ization'
 
96
                      (<-'ize')
 
97
            'ational' 'ation' 'ator'
 
98
                      (<-'ate')
 
99
            'alism' 'aliti' 'alli'
 
100
                      (<-'al')
 
101
            'fulness' (<-'ful')
 
102
            'ousli' 'ousness'
 
103
                      (<-'ous')
 
104
            'iveness' 'iviti'
 
105
                      (<-'ive')
 
106
            'biliti' 'bli'
 
107
                      (<-'ble')
 
108
            'ogi'     ('l' <-'og')
 
109
            'fulli'   (<-'ful')
 
110
            'lessli'  (<-'less')
 
111
            'li'      (valid_LI delete)
 
112
        )
 
113
    )
 
114
 
 
115
    define Step_3 as (
 
116
        [substring] R1 among (
 
117
            'tional'  (<- 'tion')
 
118
            'ational' (<- 'ate')
 
119
            'alize'   (<-'al')
 
120
            'icate' 'iciti' 'ical'
 
121
                      (<-'ic')
 
122
            'ful' 'ness'
 
123
                      (delete)
 
124
            'ative'
 
125
                      (R2 delete)  // 'R2' added Dec 2001
 
126
        )
 
127
    )
 
128
 
 
129
    define Step_4 as (
 
130
        [substring] R2 among (
 
131
            'al' 'ance' 'ence' 'er' 'ic' 'able' 'ible' 'ant' 'ement'
 
132
            'ment' 'ent' 'ism' 'ate' 'iti' 'ous' 'ive' 'ize'
 
133
                      (delete)
 
134
            'ion'     ('s' or 't' delete)
 
135
        )
 
136
    )
 
137
 
 
138
    define Step_5 as (
 
139
        [substring] among (
 
140
            'e' (R2 or (R1 not shortv) delete)
 
141
            'l' (R2 'l' delete)
 
142
        )
 
143
    )
 
144
 
 
145
    define exception2 as (
 
146
 
 
147
        [substring] atlimit among(
 
148
            'inning' 'outing' 'canning' 'herring' 'earring'
 
149
            'proceed' 'exceed' 'succeed'
 
150
 
 
151
            // ... extensions possible here ...
 
152
 
 
153
        )
 
154
    )
 
155
)
 
156
 
 
157
define exception1 as (
 
158
 
 
159
    [substring] atlimit among(
 
160
 
 
161
        /* special changes: */
 
162
 
 
163
        'skis'      (<-'ski')
 
164
        'skies'     (<-'sky')
 
165
        'dying'     (<-'die')
 
166
        'lying'     (<-'lie')
 
167
        'tying'     (<-'tie')
 
168
 
 
169
        /* special -LY cases */
 
170
 
 
171
        'idly'      (<-'idl')
 
172
        'gently'    (<-'gentl')
 
173
        'ugly'      (<-'ugli')
 
174
        'early'     (<-'earli')
 
175
        'only'      (<-'onli')
 
176
        'singly'    (<-'singl')
 
177
 
 
178
        // ... extensions possible here ...
 
179
 
 
180
        /* invariant forms: */
 
181
 
 
182
        'sky'
 
183
        'news'
 
184
        'howe'
 
185
 
 
186
        'atlas' 'cosmos' 'bias' 'andes' // not plural forms
 
187
 
 
188
        // ... extensions possible here ...
 
189
    )
 
190
)
 
191
 
 
192
define postlude as (Y_found  repeat(goto (['Y']) <-'y'))
 
193
 
 
194
define stem as (
 
195
 
 
196
    exception1 or (
 
197
 
 
198
        test hop 3
 
199
        do prelude
 
200
        do mark_regions
 
201
        backwards (
 
202
 
 
203
            do Step_1a
 
204
 
 
205
            exception2 or (
 
206
 
 
207
                do Step_1b
 
208
                do Step_1c
 
209
 
 
210
                do Step_2
 
211
                do Step_3
 
212
                do Step_4
 
213
 
 
214
                do Step_5
 
215
            )
 
216
        )
 
217
        do postlude
 
218
    )
 
219
)