Got the gem layout working
[porter2stemmer.git] / doc / String.html
1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5 <head>
6 <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
7
8 <title>Class: String</title>
9
10 <link rel="stylesheet" href="./rdoc.css" type="text/css" media="screen" />
11
12 <script src="./js/jquery.js" type="text/javascript"
13 charset="utf-8"></script>
14 <script src="./js/thickbox-compressed.js" type="text/javascript"
15 charset="utf-8"></script>
16 <script src="./js/quicksearch.js" type="text/javascript"
17 charset="utf-8"></script>
18 <script src="./js/darkfish.js" type="text/javascript"
19 charset="utf-8"></script>
20
21 </head>
22 <body class="class">
23
24 <div id="metadata">
25 <div id="home-metadata">
26 <div id="home-section" class="section">
27 <h3 class="section-header">
28 <a href="./index.html">Home</a>
29 <a href="./index.html#classes">Classes</a>
30 <a href="./index.html#methods">Methods</a>
31 </h3>
32 </div>
33 </div>
34
35 <div id="file-metadata">
36 <div id="file-list-section" class="section">
37 <h3 class="section-header">In Files</h3>
38 <div class="section-body">
39 <ul>
40
41 <li><a href="./lib/porter2_implementation_rb.html?TB_iframe=true&amp;height=550&amp;width=785"
42 class="thickbox" title="lib/porter2_implementation.rb">lib/porter2_implementation.rb</a></li>
43
44 </ul>
45 </div>
46 </div>
47
48
49 </div>
50
51 <div id="class-metadata">
52
53 <!-- Parent Class -->
54
55 <div id="parent-class-section" class="section">
56 <h3 class="section-header">Parent</h3>
57
58 <p class="link">Object</p>
59
60 </div>
61
62
63 <!-- Namespace Contents -->
64
65
66 <!-- Method Quickref -->
67
68 <div id="method-list-section" class="section">
69 <h3 class="section-header">Methods</h3>
70 <ul class="link-list">
71
72 <li><a href="#method-i-porter2_ends_with_short_syllable%3F">#porter2_ends_with_short_syllable?</a></li>
73
74 <li><a href="#method-i-porter2_is_short_word%3F">#porter2_is_short_word?</a></li>
75
76 <li><a href="#method-i-porter2_postprocess">#porter2_postprocess</a></li>
77
78 <li><a href="#method-i-porter2_preprocess">#porter2_preprocess</a></li>
79
80 <li><a href="#method-i-porter2_r1">#porter2_r1</a></li>
81
82 <li><a href="#method-i-porter2_r2">#porter2_r2</a></li>
83
84 <li><a href="#method-i-porter2_stem">#porter2_stem</a></li>
85
86 <li><a href="#method-i-porter2_stem_verbose">#porter2_stem_verbose</a></li>
87
88 <li><a href="#method-i-porter2_step0">#porter2_step0</a></li>
89
90 <li><a href="#method-i-porter2_step1a">#porter2_step1a</a></li>
91
92 <li><a href="#method-i-porter2_step1b">#porter2_step1b</a></li>
93
94 <li><a href="#method-i-porter2_step1c">#porter2_step1c</a></li>
95
96 <li><a href="#method-i-porter2_step2">#porter2_step2</a></li>
97
98 <li><a href="#method-i-porter2_step3">#porter2_step3</a></li>
99
100 <li><a href="#method-i-porter2_step4">#porter2_step4</a></li>
101
102 <li><a href="#method-i-porter2_step5">#porter2_step5</a></li>
103
104 <li><a href="#method-i-porter2_tidy">#porter2_tidy</a></li>
105
106 <li><a href="#method-i-stem">#stem</a></li>
107
108 </ul>
109 </div>
110
111
112 <!-- Included Modules -->
113
114 </div>
115
116 <div id="project-metadata">
117
118
119 <div id="fileindex-section" class="section project-section">
120 <h3 class="section-header">Files</h3>
121 <ul>
122
123 <li class="file"><a href="./Readme_rdoc.html">Readme.rdoc</a></li>
124
125 </ul>
126 </div>
127
128
129 <div id="classindex-section" class="section project-section">
130 <h3 class="section-header">Class Index
131 <span class="search-toggle"><img src="./images/find.png"
132 height="16" width="16" alt="[+]"
133 title="show/hide quicksearch" /></span></h3>
134 <form action="#" method="get" accept-charset="utf-8" class="initially-hidden">
135 <fieldset>
136 <legend>Quicksearch</legend>
137 <input type="text" name="quicksearch" value=""
138 class="quicksearch-field" />
139 </fieldset>
140 </form>
141
142 <ul class="link-list">
143
144 <li><a href="./Porter2.html">Porter2</a></li>
145
146 <li><a href="./String.html">String</a></li>
147
148 <li><a href="./TestPorter2.html">TestPorter2</a></li>
149
150 </ul>
151 <div id="no-class-search-results" style="display: none;">No matching classes.</div>
152 </div>
153
154
155 </div>
156 </div>
157
158 <div id="documentation">
159 <h1 class="class">String</h1>
160
161 <div id="description">
162 <p>
163 Implementation of the Porter 2 stemmer. <a
164 href="String.html#method-i-porter2_stem">String#porter2_stem</a> is the
165 main stemming procedure.
166 </p>
167
168 </div>
169
170 <!-- Constants -->
171
172
173 <!-- Attributes -->
174
175
176 <!-- Methods -->
177
178 <div id="public-instance-method-details" class="method-section section">
179 <h3 class="section-header">Public Instance Methods</h3>
180
181
182 <div id="porter-ends-with-short-syllable--method" class="method-detail ">
183 <a name="method-i-porter2_ends_with_short_syllable%3F"></a>
184
185 <div class="method-heading">
186
187 <span class="method-name">porter2_ends_with_short_syllable?</span><span
188 class="method-args">()</span>
189 <span class="method-click-advice">click to toggle source</span>
190
191 </div>
192
193 <div class="method-description">
194
195 <p>
196 Returns true if the word ends with a short syllable
197 </p>
198
199
200
201 <div class="method-source-code"
202 id="porter-ends-with-short-syllable--source">
203 <pre>
204 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 59</span>
205 59: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_ends_with_short_syllable?</span>
206 60: <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::SHORT_SYLLABLE}$/</span> <span class="ruby-operator">?</span> <span class="ruby-keyword kw">true</span> <span class="ruby-operator">:</span> <span class="ruby-keyword kw">false</span>
207 61: <span class="ruby-keyword kw">end</span></pre>
208 </div>
209
210 </div>
211
212
213
214
215 </div>
216
217
218 <div id="porter-is-short-word--method" class="method-detail ">
219 <a name="method-i-porter2_is_short_word%3F"></a>
220
221 <div class="method-heading">
222
223 <span class="method-name">porter2_is_short_word?</span><span
224 class="method-args">()</span>
225 <span class="method-click-advice">click to toggle source</span>
226
227 </div>
228
229 <div class="method-description">
230
231 <p>
232 A word is short if it ends in a short syllable, and R1 is null
233 </p>
234
235
236
237 <div class="method-source-code"
238 id="porter-is-short-word--source">
239 <pre>
240 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 65</span>
241 65: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_is_short_word?</span>
242 66: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_ends_with_short_syllable?</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span>.<span class="ruby-identifier">empty?</span>
243 67: <span class="ruby-keyword kw">end</span></pre>
244 </div>
245
246 </div>
247
248
249
250
251 </div>
252
253
254 <div id="porter-postprocess-method" class="method-detail ">
255 <a name="method-i-porter2_postprocess"></a>
256
257 <div class="method-heading">
258
259 <span class="method-name">porter2_postprocess</span><span
260 class="method-args">()</span>
261 <span class="method-click-advice">click to toggle source</span>
262
263 </div>
264
265 <div class="method-description">
266
267 <p>
268 Turn all Y letters into y
269 </p>
270
271
272
273 <div class="method-source-code"
274 id="porter-postprocess-source">
275 <pre>
276 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 261</span>
277 261: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_postprocess</span>
278 262: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-regexp re">/Y/</span>, <span class="ruby-value str">'y'</span>)
279 263: <span class="ruby-keyword kw">end</span></pre>
280 </div>
281
282 </div>
283
284
285
286
287 </div>
288
289
290 <div id="porter-preprocess-method" class="method-detail ">
291 <a name="method-i-porter2_preprocess"></a>
292
293 <div class="method-heading">
294
295 <span class="method-name">porter2_preprocess</span><span
296 class="method-args">()</span>
297 <span class="method-click-advice">click to toggle source</span>
298
299 </div>
300
301 <div class="method-description">
302
303 <p>
304 Preprocess the word. Remove any initial &#8217;, if present. Then, set
305 initial y, or y after a vowel, to Y
306 </p>
307 <p>
308 (The comment to &#8216;establish the regions R1 and R2&#8217; in the
309 original description is an implementation optimisation that identifies
310 where the regions start. As no modifications are made to the word that
311 affect those positions, you may want to cache them now. This implementation
312 doesn&#8217;t do that.)
313 </p>
314
315
316
317 <div class="method-source-code"
318 id="porter-preprocess-source">
319 <pre>
320 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 25</span>
321 25: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_preprocess</span>
322 26: <span class="ruby-identifier">w</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">dup</span>
323 27:
324 28: <span class="ruby-comment cmt"># remove any initial apostrophe</span>
325 29: <span class="ruby-identifier">w</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/^'*(.)/</span>, <span class="ruby-value str">'\1'</span>)
326 30:
327 31: <span class="ruby-comment cmt"># set initial y, or y after a vowel, to Y</span>
328 32: <span class="ruby-identifier">w</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/^y/</span>, <span class="ruby-value str">&quot;Y&quot;</span>)
329 33: <span class="ruby-identifier">w</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-node">/(#{Porter2::V})y/</span>, <span class="ruby-value str">'\1Y'</span>)
330 34:
331 35: <span class="ruby-identifier">w</span>
332 36: <span class="ruby-keyword kw">end</span></pre>
333 </div>
334
335 </div>
336
337
338
339
340 </div>
341
342
343 <div id="porter-r--method" class="method-detail ">
344 <a name="method-i-porter2_r1"></a>
345
346 <div class="method-heading">
347
348 <span class="method-name">porter2_r1</span><span
349 class="method-args">()</span>
350 <span class="method-click-advice">click to toggle source</span>
351
352 </div>
353
354 <div class="method-description">
355
356 <p>
357 R1 is the portion of the word after the first non-vowel after the first
358 vowel (with words beginning &#8216;gener-&#8217;, &#8216;commun-&#8217;,
359 and &#8216;arsen-&#8217; treated as special cases
360 </p>
361
362
363
364 <div class="method-source-code"
365 id="porter-r--source">
366 <pre>
367 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 41</span>
368 41: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_r1</span>
369 42: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^(gener|commun|arsen)(?&lt;r1&gt;.*)/</span>
370 43: <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">last_match</span>(<span class="ruby-value">:r1</span>)
371 44: <span class="ruby-keyword kw">else</span>
372 45: <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::V}#{Porter2::C}(?&lt;r1&gt;.*)$/</span>
373 46: <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">last_match</span>(<span class="ruby-value">:r1</span>) <span class="ruby-operator">||</span> <span class="ruby-value str">&quot;&quot;</span>
374 47: <span class="ruby-keyword kw">end</span>
375 48: <span class="ruby-keyword kw">end</span></pre>
376 </div>
377
378 </div>
379
380
381
382
383 </div>
384
385
386 <div id="porter-r--method" class="method-detail ">
387 <a name="method-i-porter2_r2"></a>
388
389 <div class="method-heading">
390
391 <span class="method-name">porter2_r2</span><span
392 class="method-args">()</span>
393 <span class="method-click-advice">click to toggle source</span>
394
395 </div>
396
397 <div class="method-description">
398
399 <p>
400 R2 is the portion of R1 (<a
401 href="String.html#method-i-porter2_r1">porter2_r1</a>) after the first
402 non-vowel after the first vowel
403 </p>
404
405
406
407 <div class="method-source-code"
408 id="porter-r--source">
409 <pre>
410 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 52</span>
411 52: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_r2</span>
412 53: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::V}#{Porter2::C}(?&lt;r2&gt;.*)$/</span>
413 54: <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">last_match</span>(<span class="ruby-value">:r2</span>) <span class="ruby-operator">||</span> <span class="ruby-value str">&quot;&quot;</span>
414 55: <span class="ruby-keyword kw">end</span></pre>
415 </div>
416
417 </div>
418
419
420
421
422 </div>
423
424
425 <div id="porter-stem-method" class="method-detail ">
426 <a name="method-i-porter2_stem"></a>
427
428 <div class="method-heading">
429
430 <span class="method-name">porter2_stem</span><span
431 class="method-args">(gb_english = false)</span>
432 <span class="method-click-advice">click to toggle source</span>
433
434 </div>
435
436 <div class="method-description">
437
438 <p>
439 Perform the stemming procedure. If <tt>gb_english</tt> is true, treat
440 &#8217;-ise&#8217; and similar suffixes as &#8217;-ize&#8217; in American
441 English.
442 </p>
443
444
445
446 <div class="method-source-code"
447 id="porter-stem-source">
448 <pre>
449 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 269</span>
450 269: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_stem</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
451 270: <span class="ruby-identifier">preword</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_tidy</span>
452 271: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">preword</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-value">2</span>
453 272:
454 273: <span class="ruby-identifier">word</span> = <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">porter2_preprocess</span>
455 274:
456 275: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">SPECIAL_CASES</span>.<span class="ruby-identifier">has_key?</span> <span class="ruby-identifier">word</span>
457 276: <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">SPECIAL_CASES</span>[<span class="ruby-identifier">word</span>]
458 277: <span class="ruby-keyword kw">else</span>
459 278: <span class="ruby-identifier">w1a</span> = <span class="ruby-identifier">word</span>.<span class="ruby-identifier">porter2_step0</span>.<span class="ruby-identifier">porter2_step1a</span>
460 279: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">STEP_1A_SPECIAL_CASES</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">w1a</span>
461 280: <span class="ruby-identifier">w1a</span>
462 281: <span class="ruby-keyword kw">else</span>
463 282: <span class="ruby-identifier">w1a</span>.<span class="ruby-identifier">porter2_step1b</span>(<span class="ruby-identifier">gb_english</span>).<span class="ruby-identifier">porter2_step1c</span>.<span class="ruby-identifier">porter2_step2</span>(<span class="ruby-identifier">gb_english</span>).<span class="ruby-identifier">porter2_step3</span>(<span class="ruby-identifier">gb_english</span>).<span class="ruby-identifier">porter2_step4</span>(<span class="ruby-identifier">gb_english</span>).<span class="ruby-identifier">porter2_step5</span>.<span class="ruby-identifier">porter2_postprocess</span>
464 283: <span class="ruby-keyword kw">end</span>
465 284: <span class="ruby-keyword kw">end</span>
466 285: <span class="ruby-keyword kw">end</span></pre>
467 </div>
468
469 </div>
470
471
472 <div class="aliases">
473 Also aliased as: <a href="String.html#method-i-stem">stem</a>
474 </div>
475
476
477
478 </div>
479
480
481 <div id="porter-stem-verbose-method" class="method-detail ">
482 <a name="method-i-porter2_stem_verbose"></a>
483
484 <div class="method-heading">
485
486 <span class="method-name">porter2_stem_verbose</span><span
487 class="method-args">(gb_english = false)</span>
488 <span class="method-click-advice">click to toggle source</span>
489
490 </div>
491
492 <div class="method-description">
493
494 <p>
495 A verbose version of <a
496 href="String.html#method-i-porter2_stem">porter2_stem</a> that prints the
497 output of each stage to STDOUT
498 </p>
499
500
501
502 <div class="method-source-code"
503 id="porter-stem-verbose-source">
504 <pre>
505 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 288</span>
506 288: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_stem_verbose</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
507 289: <span class="ruby-identifier">preword</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_tidy</span>
508 290: <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Preword: #{preword}&quot;</span>
509 291: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">preword</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-value">2</span>
510 292:
511 293: <span class="ruby-identifier">word</span> = <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">porter2_preprocess</span>
512 294: <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Preprocessed: #{word}&quot;</span>
513 295:
514 296: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">SPECIAL_CASES</span>.<span class="ruby-identifier">has_key?</span> <span class="ruby-identifier">word</span>
515 297: <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Returning #{word} as special case #{Porter2::SPECIAL_CASES[word]}&quot;</span>
516 298: <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">SPECIAL_CASES</span>[<span class="ruby-identifier">word</span>]
517 299: <span class="ruby-keyword kw">else</span>
518 300: <span class="ruby-identifier">r1</span> = <span class="ruby-identifier">word</span>.<span class="ruby-identifier">porter2_r1</span>
519 301: <span class="ruby-identifier">r2</span> = <span class="ruby-identifier">word</span>.<span class="ruby-identifier">porter2_r2</span>
520 302: <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;R1 = #{r1}, R2 = #{r2}&quot;</span>
521 303:
522 304: <span class="ruby-identifier">w0</span> = <span class="ruby-identifier">word</span>.<span class="ruby-identifier">porter2_step0</span> ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 0: #{w0} (R1 = #{w0.porter2_r1}, R2 = #{w0.porter2_r2})&quot;</span>
523 305: <span class="ruby-identifier">w1a</span> = <span class="ruby-identifier">w0</span>.<span class="ruby-identifier">porter2_step1a</span> ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 1a: #{w1a} (R1 = #{w1a.porter2_r1}, R2 = #{w1a.porter2_r2})&quot;</span>
524 306:
525 307: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">STEP_1A_SPECIAL_CASES</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">w1a</span>
526 308: <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Returning #{w1a} as 1a special case&quot;</span>
527 309: <span class="ruby-identifier">w1a</span>
528 310: <span class="ruby-keyword kw">else</span>
529 311: <span class="ruby-identifier">w1b</span> = <span class="ruby-identifier">w1a</span>.<span class="ruby-identifier">porter2_step1b</span>(<span class="ruby-identifier">gb_english</span>) ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 1b: #{w1b} (R1 = #{w1b.porter2_r1}, R2 = #{w1b.porter2_r2})&quot;</span>
530 312: <span class="ruby-identifier">w1c</span> = <span class="ruby-identifier">w1b</span>.<span class="ruby-identifier">porter2_step1c</span> ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 1c: #{w1c} (R1 = #{w1c.porter2_r1}, R2 = #{w1c.porter2_r2})&quot;</span>
531 313: <span class="ruby-identifier">w2</span> = <span class="ruby-identifier">w1c</span>.<span class="ruby-identifier">porter2_step2</span>(<span class="ruby-identifier">gb_english</span>) ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 2: #{w2} (R1 = #{w2.porter2_r1}, R2 = #{w2.porter2_r2})&quot;</span>
532 314: <span class="ruby-identifier">w3</span> = <span class="ruby-identifier">w2</span>.<span class="ruby-identifier">porter2_step3</span>(<span class="ruby-identifier">gb_english</span>) ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 3: #{w3} (R1 = #{w3.porter2_r1}, R2 = #{w3.porter2_r2})&quot;</span>
533 315: <span class="ruby-identifier">w4</span> = <span class="ruby-identifier">w3</span>.<span class="ruby-identifier">porter2_step4</span>(<span class="ruby-identifier">gb_english</span>) ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 4: #{w4} (R1 = #{w4.porter2_r1}, R2 = #{w4.porter2_r2})&quot;</span>
534 316: <span class="ruby-identifier">w5</span> = <span class="ruby-identifier">w4</span>.<span class="ruby-identifier">porter2_step5</span> ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 5: #{w5}&quot;</span>
535 317: <span class="ruby-identifier">wpost</span> = <span class="ruby-identifier">w5</span>.<span class="ruby-identifier">porter2_postprocess</span> ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After postprocess: #{wpost}&quot;</span>
536 318: <span class="ruby-identifier">wpost</span>
537 319: <span class="ruby-keyword kw">end</span>
538 320: <span class="ruby-keyword kw">end</span>
539 321: <span class="ruby-keyword kw">end</span></pre>
540 </div>
541
542 </div>
543
544
545
546
547 </div>
548
549
550 <div id="porter-step--method" class="method-detail ">
551 <a name="method-i-porter2_step0"></a>
552
553 <div class="method-heading">
554
555 <span class="method-name">porter2_step0</span><span
556 class="method-args">()</span>
557 <span class="method-click-advice">click to toggle source</span>
558
559 </div>
560
561 <div class="method-description">
562
563 <p>
564 Search for the longest among the suffixes,
565 </p>
566 <ul>
567 <li><p>
568 &#8216;
569 </p>
570 </li>
571 <li><p>
572 &#8217;s
573 </p>
574 </li>
575 <li><p>
576 &#8217;s&#8217;
577 </p>
578 </li>
579 </ul>
580 <p>
581 and remove if found.
582 </p>
583
584
585
586 <div class="method-source-code"
587 id="porter-step--source">
588 <pre>
589 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 75</span>
590 75: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step0</span>
591 76: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub!</span>(<span class="ruby-regexp re">/(.)('s'|'s|')$/</span>, <span class="ruby-value str">'\1'</span>) <span class="ruby-operator">||</span> <span class="ruby-keyword kw">self</span>
592 77: <span class="ruby-keyword kw">end</span></pre>
593 </div>
594
595 </div>
596
597
598
599
600 </div>
601
602
603 <div id="porter-step-a-method" class="method-detail ">
604 <a name="method-i-porter2_step1a"></a>
605
606 <div class="method-heading">
607
608 <span class="method-name">porter2_step1a</span><span
609 class="method-args">()</span>
610 <span class="method-click-advice">click to toggle source</span>
611
612 </div>
613
614 <div class="method-description">
615
616 <p>
617 Search for the longest among the following suffixes, and perform the action
618 indicated.
619 </p>
620 <table>
621 <tr><td valign="top">sses</td><td><p>
622 replace by ss
623 </p>
624 </td></tr>
625 <tr><td valign="top">ied, ies</td><td><p>
626 replace by i if preceded by more than one letter, otherwise by ie
627 </p>
628 </td></tr>
629 <tr><td valign="top">s</td><td><p>
630 delete if the preceding word part contains a vowel not immediately before
631 the s
632 </p>
633 </td></tr>
634 <tr><td valign="top">us, ss</td><td><p>
635 do nothing
636 </p>
637 </td></tr>
638 </table>
639
640
641
642 <div class="method-source-code"
643 id="porter-step-a-source">
644 <pre>
645 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 85</span>
646 85: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step1a</span>
647 86: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/sses$/</span>
648 87: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/sses$/</span>, <span class="ruby-value str">'ss'</span>)
649 88: <span class="ruby-keyword kw">elsif</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/..(ied|ies)$/</span>
650 89: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/(ied|ies)$/</span>, <span class="ruby-value str">'i'</span>)
651 90: <span class="ruby-keyword kw">elsif</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/(ied|ies)$/</span>
652 91: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/(ied|ies)$/</span>, <span class="ruby-value str">'ie'</span>)
653 92: <span class="ruby-keyword kw">elsif</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/(us|ss)$/</span>
654 93: <span class="ruby-keyword kw">self</span>
655 94: <span class="ruby-keyword kw">elsif</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/s$/</span>
656 95: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/(#{Porter2::V}.+)s$/</span>
657 96: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/s$/</span>, <span class="ruby-value str">''</span>)
658 97: <span class="ruby-keyword kw">else</span>
659 98: <span class="ruby-keyword kw">self</span>
660 99: <span class="ruby-keyword kw">end</span>
661 100: <span class="ruby-keyword kw">else</span>
662 101: <span class="ruby-keyword kw">self</span>
663 102: <span class="ruby-keyword kw">end</span>
664 103: <span class="ruby-keyword kw">end</span></pre>
665 </div>
666
667 </div>
668
669
670
671
672 </div>
673
674
675 <div id="porter-step-b-method" class="method-detail ">
676 <a name="method-i-porter2_step1b"></a>
677
678 <div class="method-heading">
679
680 <span class="method-name">porter2_step1b</span><span
681 class="method-args">(gb_english = false)</span>
682 <span class="method-click-advice">click to toggle source</span>
683
684 </div>
685
686 <div class="method-description">
687
688 <p>
689 Search for the longest among the following suffixes, and perform the action
690 indicated.
691 </p>
692 <table>
693 <tr><td valign="top">eed, eedly</td><td><p>
694 replace by ee if the suffix is also in R1
695 </p>
696 </td></tr>
697 <tr><td valign="top">ed, edly, ing, ingly</td><td><p>
698 delete if the preceding word part contains a vowel and, after the
699 deletion:
700 </p>
701 <ul>
702 <li><p>
703 if the word ends at, bl or iz: add e, or
704 </p>
705 </li>
706 </ul>
707 <ul>
708 <li><p>
709 if the word ends with a double: remove the last letter, or
710 </p>
711 </li>
712 </ul>
713 <ul>
714 <li><p>
715 if the word is short: add e
716 </p>
717 </li>
718 </ul>
719 </td></tr>
720 </table>
721 <p>
722 (If gb_english is <tt>true</tt>, treat the &#8216;is&#8217; suffix as
723 &#8216;iz&#8217; above.)
724 </p>
725
726
727
728 <div class="method-source-code"
729 id="porter-step-b-source">
730 <pre>
731 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 115</span>
732 115: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step1b</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
733 116: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/(eed|eedly)$/</span>
734 117: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/(eed|eedly)$/</span>
735 118: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/(eed|eedly)$/</span>, <span class="ruby-value str">'ee'</span>)
736 119: <span class="ruby-keyword kw">else</span>
737 120: <span class="ruby-keyword kw">self</span>
738 121: <span class="ruby-keyword kw">end</span>
739 122: <span class="ruby-keyword kw">else</span>
740 123: <span class="ruby-identifier">w</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">dup</span>
741 124: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">w</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::V}.*(ed|edly|ing|ingly)$/</span>
742 125: <span class="ruby-identifier">w</span>.<span class="ruby-identifier">sub!</span>(<span class="ruby-regexp re">/(ed|edly|ing|ingly)$/</span>, <span class="ruby-value str">''</span>)
743 126: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">w</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/(at|lb|iz)$/</span>
744 127: <span class="ruby-identifier">w</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">'e'</span>
745 128: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">w</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/is$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">gb_english</span>
746 129: <span class="ruby-identifier">w</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">'e'</span>
747 130: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">w</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::Double}$/</span>
748 131: <span class="ruby-identifier">w</span>.<span class="ruby-identifier">chop!</span>
749 132: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">w</span>.<span class="ruby-identifier">porter2_is_short_word?</span>
750 133: <span class="ruby-identifier">w</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">'e'</span>
751 134: <span class="ruby-keyword kw">end</span>
752 135: <span class="ruby-keyword kw">end</span>
753 136: <span class="ruby-identifier">w</span>
754 137: <span class="ruby-keyword kw">end</span>
755 138: <span class="ruby-keyword kw">end</span></pre>
756 </div>
757
758 </div>
759
760
761
762
763 </div>
764
765
766 <div id="porter-step-c-method" class="method-detail ">
767 <a name="method-i-porter2_step1c"></a>
768
769 <div class="method-heading">
770
771 <span class="method-name">porter2_step1c</span><span
772 class="method-args">()</span>
773 <span class="method-click-advice">click to toggle source</span>
774
775 </div>
776
777 <div class="method-description">
778
779 <p>
780 Replace a suffix of y or Y by i if it is preceded by a non-vowel which is
781 not the first letter of the word.
782 </p>
783
784
785
786 <div class="method-source-code"
787 id="porter-step-c-source">
788 <pre>
789 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 143</span>
790 143: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step1c</span>
791 144: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/.+#{Porter2::C}(y|Y)$/</span>
792 145: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/(y|Y)$/</span>, <span class="ruby-value str">'i'</span>)
793 146: <span class="ruby-keyword kw">else</span>
794 147: <span class="ruby-keyword kw">self</span>
795 148: <span class="ruby-keyword kw">end</span>
796 149: <span class="ruby-keyword kw">end</span></pre>
797 </div>
798
799 </div>
800
801
802
803
804 </div>
805
806
807 <div id="porter-step--method" class="method-detail ">
808 <a name="method-i-porter2_step2"></a>
809
810 <div class="method-heading">
811
812 <span class="method-name">porter2_step2</span><span
813 class="method-args">(gb_english = false)</span>
814 <span class="method-click-advice">click to toggle source</span>
815
816 </div>
817
818 <div class="method-description">
819
820 <p>
821 Search for the longest among the suffixes listed in the keys of
822 Porter2::STEP_2_MAPS. If one is found and that suffix occurs in R1,
823 replace it with the value found in STEP_2_MAPS.
824 </p>
825 <p>
826 (Suffixes &#8216;ogi&#8217; and &#8216;li&#8217; are treated as special
827 cases in the procedure.)
828 </p>
829 <p>
830 (If gb_english is <tt>true</tt>, replace the &#8216;iser&#8217; and
831 &#8216;isation&#8217; suffixes with &#8216;ise&#8217;, similarly to how
832 &#8216;izer&#8217; and &#8216;ization&#8217; are treated.)
833 </p>
834
835
836
837 <div class="method-source-code"
838 id="porter-step--source">
839 <pre>
840 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 160</span>
841 160: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step2</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
842 161: <span class="ruby-identifier">r1</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span>
843 162: <span class="ruby-identifier">s2m</span> = <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">STEP_2_MAPS</span>.<span class="ruby-identifier">dup</span>
844 163: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">gb_english</span>
845 164: <span class="ruby-identifier">s2m</span>[<span class="ruby-value str">&quot;iser&quot;</span>] = <span class="ruby-value str">&quot;ise&quot;</span>
846 165: <span class="ruby-identifier">s2m</span>[<span class="ruby-value str">&quot;isation&quot;</span>] = <span class="ruby-value str">&quot;ise&quot;</span>
847 166: <span class="ruby-keyword kw">end</span>
848 167: <span class="ruby-identifier">step_2_re</span> = <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">union</span>(<span class="ruby-identifier">s2m</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">map</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">r</span> <span class="ruby-operator">+</span> <span class="ruby-value str">&quot;$&quot;</span>)})
849 168: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-identifier">step_2_re</span>
850 169: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">r1</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{$&amp;}$/</span>
851 170: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-node">/#{$&amp;}$/</span>, <span class="ruby-identifier">s2m</span>[<span class="ruby-node">$&amp;</span>])
852 171: <span class="ruby-keyword kw">else</span>
853 172: <span class="ruby-keyword kw">self</span>
854 173: <span class="ruby-keyword kw">end</span>
855 174: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">r1</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/li$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/(#{Porter2::Valid_LI})li$/</span>
856 175: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/li$/</span>, <span class="ruby-value str">''</span>)
857 176: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">r1</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/ogi$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/logi$/</span>
858 177: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/ogi$/</span>, <span class="ruby-value str">'og'</span>)
859 178: <span class="ruby-keyword kw">else</span>
860 179: <span class="ruby-keyword kw">self</span>
861 180: <span class="ruby-keyword kw">end</span>
862 181: <span class="ruby-keyword kw">end</span></pre>
863 </div>
864
865 </div>
866
867
868
869
870 </div>
871
872
873 <div id="porter-step--method" class="method-detail ">
874 <a name="method-i-porter2_step3"></a>
875
876 <div class="method-heading">
877
878 <span class="method-name">porter2_step3</span><span
879 class="method-args">(gb_english = false)</span>
880 <span class="method-click-advice">click to toggle source</span>
881
882 </div>
883
884 <div class="method-description">
885
886 <p>
887 Search for the longest among the suffixes listed in the keys of
888 Porter2::STEP_3_MAPS. If one is found and that suffix occurs in R1,
889 replace it with the value found in STEP_3_MAPS.
890 </p>
891 <p>
892 (Suffix &#8216;ative&#8217; is treated as a special case in the procedure.)
893 </p>
894 <p>
895 (If gb_english is <tt>true</tt>, replace the &#8216;alise&#8217; suffix
896 with &#8216;al&#8217;, similarly to how &#8216;alize&#8217; is treated.)
897 </p>
898
899
900
901 <div class="method-source-code"
902 id="porter-step--source">
903 <pre>
904 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 192</span>
905 192: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step3</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
906 193: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/ative$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r2</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/ative$/</span>
907 194: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/ative$/</span>, <span class="ruby-value str">''</span>)
908 195: <span class="ruby-keyword kw">else</span>
909 196: <span class="ruby-identifier">s3m</span> = <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">STEP_3_MAPS</span>.<span class="ruby-identifier">dup</span>
910 197: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">gb_english</span>
911 198: <span class="ruby-identifier">s3m</span>[<span class="ruby-value str">&quot;alise&quot;</span>] = <span class="ruby-value str">&quot;al&quot;</span>
912 199: <span class="ruby-keyword kw">end</span>
913 200: <span class="ruby-identifier">step_3_re</span> = <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">union</span>(<span class="ruby-identifier">s3m</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">map</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">r</span> <span class="ruby-operator">+</span> <span class="ruby-value str">&quot;$&quot;</span>)})
914 201: <span class="ruby-identifier">r1</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span>
915 202: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-identifier">step_3_re</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">r1</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{$&amp;}$/</span>
916 203: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-node">/#{$&amp;}$/</span>, <span class="ruby-identifier">s3m</span>[<span class="ruby-node">$&amp;</span>])
917 204: <span class="ruby-keyword kw">else</span>
918 205: <span class="ruby-keyword kw">self</span>
919 206: <span class="ruby-keyword kw">end</span>
920 207: <span class="ruby-keyword kw">end</span>
921 208: <span class="ruby-keyword kw">end</span></pre>
922 </div>
923
924 </div>
925
926
927
928
929 </div>
930
931
932 <div id="porter-step--method" class="method-detail ">
933 <a name="method-i-porter2_step4"></a>
934
935 <div class="method-heading">
936
937 <span class="method-name">porter2_step4</span><span
938 class="method-args">(gb_english = false)</span>
939 <span class="method-click-advice">click to toggle source</span>
940
941 </div>
942
943 <div class="method-description">
944
945 <p>
946 Search for the longest among the suffixes listed in the keys of
947 Porter2::STEP_4_MAPS. If one is found and that suffix occurs in R2,
948 replace it with the value found in STEP_4_MAPS.
949 </p>
950 <p>
951 (Suffix &#8216;ion&#8217; is treated as a special case in the procedure.)
952 </p>
953 <p>
954 (If gb_english is <tt>true</tt>, delete the &#8216;ise&#8217; suffix if
955 found.)
956 </p>
957
958
959
960 <div class="method-source-code"
961 id="porter-step--source">
962 <pre>
963 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 218</span>
964 218: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step4</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
965 219: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r2</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/ion$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/(s|t)ion$/</span>
966 220: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/ion$/</span>, <span class="ruby-value str">''</span>)
967 221: <span class="ruby-keyword kw">else</span>
968 222: <span class="ruby-identifier">s4m</span> = <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">STEP_4_MAPS</span>.<span class="ruby-identifier">dup</span>
969 223: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">gb_english</span>
970 224: <span class="ruby-identifier">s4m</span>[<span class="ruby-value str">&quot;ise&quot;</span>] = <span class="ruby-value str">&quot;&quot;</span>
971 225: <span class="ruby-keyword kw">end</span>
972 226: <span class="ruby-identifier">step_4_re</span> = <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">union</span>(<span class="ruby-identifier">s4m</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">map</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">r</span> <span class="ruby-operator">+</span> <span class="ruby-value str">&quot;$&quot;</span>)})
973 227: <span class="ruby-identifier">r2</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r2</span>
974 228: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-identifier">step_4_re</span>
975 229: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">r2</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{$&amp;}/</span>
976 230: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-node">/#{$&amp;}$/</span>, <span class="ruby-identifier">s4m</span>[<span class="ruby-node">$&amp;</span>])
977 231: <span class="ruby-keyword kw">else</span>
978 232: <span class="ruby-keyword kw">self</span>
979 233: <span class="ruby-keyword kw">end</span>
980 234: <span class="ruby-keyword kw">else</span>
981 235: <span class="ruby-keyword kw">self</span>
982 236: <span class="ruby-keyword kw">end</span>
983 237: <span class="ruby-keyword kw">end</span>
984 238: <span class="ruby-keyword kw">end</span></pre>
985 </div>
986
987 </div>
988
989
990
991
992 </div>
993
994
995 <div id="porter-step--method" class="method-detail ">
996 <a name="method-i-porter2_step5"></a>
997
998 <div class="method-heading">
999
1000 <span class="method-name">porter2_step5</span><span
1001 class="method-args">()</span>
1002 <span class="method-click-advice">click to toggle source</span>
1003
1004 </div>
1005
1006 <div class="method-description">
1007
1008 <p>
1009 Search for the the following suffixes, and, if found, perform the action
1010 indicated.
1011 </p>
1012 <table>
1013 <tr><td valign="top">e</td><td><p>
1014 delete if in R2, or in R1 and not preceded by a short syllable
1015 </p>
1016 </td></tr>
1017 <tr><td valign="top">l</td><td><p>
1018 delete if in R2 and preceded by l
1019 </p>
1020 </td></tr>
1021 </table>
1022
1023
1024
1025 <div class="method-source-code"
1026 id="porter-step--source">
1027 <pre>
1028 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 244</span>
1029 244: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step5</span>
1030 245: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/ll$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r2</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/l$/</span>
1031 246: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/ll$/</span>, <span class="ruby-value str">'l'</span>)
1032 247: <span class="ruby-keyword kw">elsif</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/e$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r2</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/e$/</span>
1033 248: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/e$/</span>, <span class="ruby-value str">''</span>)
1034 249: <span class="ruby-keyword kw">else</span>
1035 250: <span class="ruby-identifier">r1</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span>
1036 251: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/e$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">r1</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/e$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">not</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::SHORT_SYLLABLE}e$/</span>
1037 252: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/e$/</span>, <span class="ruby-value str">''</span>)
1038 253: <span class="ruby-keyword kw">else</span>
1039 254: <span class="ruby-keyword kw">self</span>
1040 255: <span class="ruby-keyword kw">end</span>
1041 256: <span class="ruby-keyword kw">end</span>
1042 257: <span class="ruby-keyword kw">end</span></pre>
1043 </div>
1044
1045 </div>
1046
1047
1048
1049
1050 </div>
1051
1052
1053 <div id="porter-tidy-method" class="method-detail ">
1054 <a name="method-i-porter2_tidy"></a>
1055
1056 <div class="method-heading">
1057
1058 <span class="method-name">porter2_tidy</span><span
1059 class="method-args">()</span>
1060 <span class="method-click-advice">click to toggle source</span>
1061
1062 </div>
1063
1064 <div class="method-description">
1065
1066 <p>
1067 Tidy up the word before we get down to the algorithm
1068 </p>
1069
1070
1071
1072 <div class="method-source-code"
1073 id="porter-tidy-source">
1074 <pre>
1075 <span class="ruby-comment cmt"># File lib/porter2_implementation.rb, line 7</span>
1076 7: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_tidy</span>
1077 8: <span class="ruby-identifier">preword</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">strip</span>.<span class="ruby-identifier">downcase</span>
1078 9:
1079 10: <span class="ruby-comment cmt"># map apostrophe-like characters to apostrophes</span>
1080 11: <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/‘/</span>, <span class="ruby-value str">&quot;'&quot;</span>)
1081 12: <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/’/</span>, <span class="ruby-value str">&quot;'&quot;</span>)
1082 13:
1083 14: <span class="ruby-identifier">preword</span>
1084 15: <span class="ruby-keyword kw">end</span></pre>
1085 </div>
1086
1087 </div>
1088
1089
1090
1091
1092 </div>
1093
1094
1095 <div id="stem-method" class="method-detail method-alias">
1096 <a name="method-i-stem"></a>
1097
1098 <div class="method-heading">
1099
1100 <span class="method-name">stem</span><span
1101 class="method-args">(gb_english = false)</span>
1102 <span class="method-click-advice">click to toggle source</span>
1103
1104 </div>
1105
1106 <div class="method-description">
1107
1108
1109
1110
1111
1112 </div>
1113
1114
1115
1116
1117 <div class="aliases">
1118 Alias for: <a href="String.html#method-i-porter2_stem">porter2_stem</a>
1119 </div>
1120
1121 </div>
1122
1123
1124 </div>
1125
1126
1127 </div>
1128
1129
1130 <div id="rdoc-debugging-section-dump" class="debugging-section">
1131
1132 <p>Disabled; run with --debug to generate this.</p>
1133
1134 </div>
1135
1136 <div id="validator-badges">
1137 <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
1138 <p><small>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish
1139 Rdoc Generator</a> 1.1.6</small>.</p>
1140 </div>
1141
1142 </body>
1143 </html>
1144