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