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">
6 <meta content=
"text/html; charset=utf-8" http-equiv=
"Content-Type" />
8 <title>Module: Stemmable
</title>
10 <link rel=
"stylesheet" href=
"./rdoc.css" type=
"text/css" media=
"screen" />
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>
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>
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">
41 <li><a href=
"./lib/porter2_rb.html?TB_iframe=true&height=550&width=785"
42 class=
"thickbox" title=
"lib/porter2.rb">lib/porter2.rb
</a></li>
51 <div id=
"class-metadata">
56 <!-- Namespace Contents -->
59 <!-- Method Quickref -->
61 <div id=
"method-list-section" class=
"section">
62 <h3 class=
"section-header">Methods
</h3>
63 <ul class=
"link-list">
65 <li><a href=
"#method-i-porter2_ends_with_short_syllable%3F">#porter2_ends_with_short_syllable?
</a></li>
67 <li><a href=
"#method-i-porter2_is_short_word%3F">#porter2_is_short_word?
</a></li>
69 <li><a href=
"#method-i-porter2_postprocess">#porter2_postprocess
</a></li>
71 <li><a href=
"#method-i-porter2_preprocess">#porter2_preprocess
</a></li>
73 <li><a href=
"#method-i-porter2_r1">#porter2_r1
</a></li>
75 <li><a href=
"#method-i-porter2_r2">#porter2_r2
</a></li>
77 <li><a href=
"#method-i-porter2_stem">#porter2_stem
</a></li>
79 <li><a href=
"#method-i-porter2_stem_verbose">#porter2_stem_verbose
</a></li>
81 <li><a href=
"#method-i-porter2_tidy">#porter2_tidy
</a></li>
83 <li><a href=
"#method-i-stem">#stem
</a></li>
85 <li><a href=
"#method-i-step_0">#step_0
</a></li>
87 <li><a href=
"#method-i-step_1a">#step_1a
</a></li>
89 <li><a href=
"#method-i-step_1b">#step_1b
</a></li>
91 <li><a href=
"#method-i-step_1c">#step_1c
</a></li>
93 <li><a href=
"#method-i-step_2">#step_2
</a></li>
95 <li><a href=
"#method-i-step_3">#step_3
</a></li>
97 <li><a href=
"#method-i-step_4">#step_4
</a></li>
99 <li><a href=
"#method-i-step_5">#step_5
</a></li>
105 <!-- Included Modules -->
109 <div id=
"project-metadata">
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">
120 <legend>Quicksearch
</legend>
121 <input type=
"text" name=
"quicksearch" value=
""
122 class=
"quicksearch-field" />
126 <ul class=
"link-list">
128 <li><a href=
"./Stemmable.html">Stemmable
</a></li>
130 <li><a href=
"./String.html">String
</a></li>
132 <li><a href=
"./TestPorter2.html">TestPorter2
</a></li>
135 <div id=
"no-class-search-results" style=
"display: none;">No matching classes.
</div>
142 <div id=
"documentation">
143 <h1 class=
"module">Stemmable
</h1>
145 <div id=
"description">
147 Porter stemmer in Ruby.
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:
155 Porter,
1980, An algorithm for suffix stripping, Program, Vol.
14,
156 no.
3, pp
130-
137
</pre>
162 <div id=
"constants-list" class=
"section">
163 <h3 class=
"section-header">Constants
</h3>
166 <dt><a name=
"C">C
</a></dt>
168 <dd class=
"description"><p>
173 <dt><a name=
"V">V
</a></dt>
175 <dd class=
"description"><p>
180 <dt><a name=
"CW">CW
</a></dt>
182 <dd class=
"description"><p>
183 A non-vowel other than w, x, or Y
187 <dt><a name=
"Double">Double
</a></dt>
189 <dd class=
"description"><p>
190 Doubles created when added a suffix: these are undoubled when stemmed
194 <dt><a name=
"Valid_LI">Valid_LI
</a></dt>
196 <dd class=
"description"><p>
197 A valid letter that can come before
‘li
’
201 <dt><a name=
"SHORT_SYLLABLE">SHORT_SYLLABLE
</a></dt>
203 <dd class=
"description"><p>
204 A specification for a short syllable
208 <dt><a name=
"STEP_2_MAPS">STEP_2_MAPS
</a></dt>
210 <dd class=
"description"><p>
211 Suffix transformations used in Step
2.
(ogi, li endings dealt with in
216 <dt><a name=
"STEP_3_MAPS">STEP_3_MAPS
</a></dt>
218 <dd class=
"description"><p>
219 Suffix transformations used in Step
3.
(ative ending dealt with in
224 <dt><a name=
"STEP_4_MAPS">STEP_4_MAPS
</a></dt>
226 <dd class=
"description"><p>
227 Suffix transformations used in Step
4.
231 <dt><a name=
"SPECIAL_CASES">SPECIAL_CASES
</a></dt>
233 <dd class=
"description"><p>
234 Special-case stemmings
238 <dt><a name=
"STEP_1A_SPECIAL_CASES">STEP_1A_SPECIAL_CASES
</a></dt>
240 <dd class=
"description"><p>
241 Special case words to ignore after step
1a.
254 <div id=
"public-instance-method-details" class=
"method-section section">
255 <h3 class=
"section-header">Public Instance Methods
</h3>
258 <div id=
"porter-ends-with-short-syllable--method" class=
"method-detail ">
259 <a name=
"method-i-porter2_ends_with_short_syllable%3F"></a>
261 <div class=
"method-heading">
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>
269 <div class=
"method-description">
272 A short syllable in a word is either
276 a vowel followed by a non-vowel other than w, x or Y and preceded by
285 a vowel at the beginning of the word followed by a non-vowel.
292 <div class=
"method-source-code"
293 id=
"porter-ends-with-short-syllable--source">
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>
309 <div id=
"porter-is-short-word--method" class=
"method-detail ">
310 <a name=
"method-i-porter2_is_short_word%3F"></a>
312 <div class=
"method-heading">
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>
320 <div class=
"method-description">
323 A word is short if it ends in a short syllable, and if R1 is null
328 <div class=
"method-source-code"
329 id=
"porter-is-short-word--source">
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>
345 <div id=
"porter-postprocess-method" class=
"method-detail ">
346 <a name=
"method-i-porter2_postprocess"></a>
348 <div class=
"method-heading">
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>
356 <div class=
"method-description">
362 <div class=
"method-source-code"
363 id=
"porter-postprocess-source">
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>
379 <div id=
"porter-preprocess-method" class=
"method-detail ">
380 <a name=
"method-i-porter2_preprocess"></a>
382 <div class=
"method-heading">
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>
390 <div class=
"method-description">
396 <div class=
"method-source-code"
397 id=
"porter-preprocess-source">
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>
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>)
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">"Y
"</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>)
410 132:
<span class=
"ruby-identifier">w
</span>
411 133:
<span class=
"ruby-keyword kw">end
</span></pre>
422 <div id=
"porter-r--method" class=
"method-detail ">
423 <a name=
"method-i-porter2_r1"></a>
425 <div class=
"method-heading">
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>
433 <div class=
"method-description">
436 The word after the first non-vowel after the first vowel
441 <div class=
"method-source-code"
442 id=
"porter-r--source">
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)(?
<r1
>.*)/
</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}(?
<r1
>.*)$/
</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">""</span>
451 142:
<span class=
"ruby-keyword kw">end
</span>
452 143:
<span class=
"ruby-keyword kw">end
</span></pre>
463 <div id=
"porter-r--method" class=
"method-detail ">
464 <a name=
"method-i-porter2_r2"></a>
466 <div class=
"method-heading">
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>
474 <div class=
"method-description">
477 R1 after the first non-vowel after the first vowel
482 <div class=
"method-source-code"
483 id=
"porter-r--source">
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}(?
<r2
>.*)$/
</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">""</span>
489 149:
<span class=
"ruby-keyword kw">end
</span></pre>
500 <div id=
"porter-stem-method" class=
"method-detail ">
501 <a name=
"method-i-porter2_stem"></a>
503 <div class=
"method-heading">
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>
511 <div class=
"method-description">
517 <div class=
"method-source-code"
518 id=
"porter-stem-source">
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"><=
</span> <span class=
"ruby-value">2</span>
525 320:
<span class=
"ruby-identifier">word
</span> =
<span class=
"ruby-identifier">preword
</span>.
<span class=
"ruby-identifier">porter2_preprocess
</span>
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>
543 <div class=
"aliases">
544 Also aliased as:
<a href=
"Stemmable.html#method-i-stem">stem
</a>
552 <div id=
"porter-stem-verbose-method" class=
"method-detail ">
553 <a name=
"method-i-porter2_stem_verbose"></a>
555 <div class=
"method-heading">
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>
563 <div class=
"method-description">
569 <div class=
"method-source-code"
570 id=
"porter-stem-verbose-source">
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">"Preword: #{preword}
"</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"><=
</span> <span class=
"ruby-value">2</span>
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">"Preprocessed: #{word}
"</span>
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">"Returning #{word} as special case #{SPECIAL_CASES[word]}
"</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">"R1 = #{r1}, R2 = #{r2}
"</span>
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">"After step
0: #{w0} (R1 = #{w0.porter2_r1}, R2 = #{w0.porter2_r2})
"</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">"After step
1a: #{w1a} (R1 = #{w1a.porter2_r1}, R2 = #{w1a.porter2_r2})
"</span>
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">"Returning #{w1a} as
1a special case
"</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">"After step
1b: #{w1b} (R1 = #{w1b.porter2_r1}, R2 = #{w1b.porter2_r2})
"</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">"After step
1c: #{w1c} (R1 = #{w1c.porter2_r1}, R2 = #{w1c.porter2_r2})
"</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">"After step
2: #{w2} (R1 = #{w2.porter2_r1}, R2 = #{w2.porter2_r2})
"</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">"After step
3: #{w3} (R1 = #{w3.porter2_r1}, R2 = #{w3.porter2_r2})
"</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">"After step
4: #{w4} (R1 = #{w4.porter2_r1}, R2 = #{w4.porter2_r2})
"</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">"After step
5: #{w5}
"</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">"After postprocess: #{wpost}
"</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>
617 <div id=
"porter-tidy-method" class=
"method-detail ">
618 <a name=
"method-i-porter2_tidy"></a>
620 <div class=
"method-heading">
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>
628 <div class=
"method-description">
631 Tidy up the word before we get down to the algorithm
636 <div class=
"method-source-code"
637 id=
"porter-tidy-source">
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>
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">"'
"</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">"'
"</span>)
647 119:
<span class=
"ruby-identifier">preword
</span>
648 120:
<span class=
"ruby-keyword kw">end
</span></pre>
659 <div id=
"stem-method" class=
"method-detail method-alias">
660 <a name=
"method-i-stem"></a>
662 <div class=
"method-heading">
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>
670 <div class=
"method-description">
681 <div class=
"aliases">
682 Alias for:
<a href=
"Stemmable.html#method-i-porter2_stem">porter2_stem
</a>
688 <div id=
"step--method" class=
"method-detail ">
689 <a name=
"method-i-step_0"></a>
691 <div class=
"method-heading">
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>
699 <div class=
"method-description">
702 Search for the longest among the suffixes,
724 <div class=
"method-source-code"
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>
741 <div id=
"step-a-method" class=
"method-detail ">
742 <a name=
"method-i-step_1a"></a>
744 <div class=
"method-heading">
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>
752 <div class=
"method-description">
755 Remove plural suffixes
760 <div class=
"method-source-code"
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>
793 <div id=
"step-b-method" class=
"method-detail ">
794 <a name=
"method-i-step_1b"></a>
796 <div class=
"method-heading">
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>
804 <div class=
"method-description">
810 <div class=
"method-source-code"
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>
848 <div id=
"step-c-method" class=
"method-detail ">
849 <a name=
"method-i-step_1c"></a>
851 <div class=
"method-heading">
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>
859 <div class=
"method-description">
865 <div class=
"method-source-code"
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>
886 <div id=
"step--method" class=
"method-detail ">
887 <a name=
"method-i-step_2"></a>
889 <div class=
"method-heading">
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>
897 <div class=
"method-description">
903 <div class=
"method-source-code"
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">"iser
"</span>] =
<span class=
"ruby-value str">"ise
"</span>
912 234:
<span class=
"ruby-identifier">s2m
</span>[
<span class=
"ruby-value str">"isation
"</span>] =
<span class=
"ruby-value str">"ise
"</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">"$
"</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">/#{$
&}$/
</span>
917 239:
<span class=
"ruby-keyword kw">self
</span>.
<span class=
"ruby-identifier">sub
</span>(
<span class=
"ruby-node">/#{$
&}$/
</span>,
<span class=
"ruby-identifier">s2m
</span>[
<span class=
"ruby-node">$
&</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>
939 <div id=
"step--method" class=
"method-detail ">
940 <a name=
"method-i-step_3"></a>
942 <div class=
"method-heading">
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>
950 <div class=
"method-description">
956 <div class=
"method-source-code"
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">"alise
"</span>] =
<span class=
"ruby-value str">"al
"</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">"$
"</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">/#{$
&}$/
</span>
971 264:
<span class=
"ruby-keyword kw">self
</span>.
<span class=
"ruby-identifier">sub
</span>(
<span class=
"ruby-node">/#{$
&}$/
</span>,
<span class=
"ruby-identifier">s3m
</span>[
<span class=
"ruby-node">$
&</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>
987 <div id=
"step--method" class=
"method-detail ">
988 <a name=
"method-i-step_4"></a>
990 <div class=
"method-heading">
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>
998 <div class=
"method-description">
1004 <div class=
"method-source-code"
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">"ise
"</span>] =
<span class=
"ruby-value str">""</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">"$
"</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">/#{$
&}/
</span>
1020 284:
<span class=
"ruby-keyword kw">self
</span>.
<span class=
"ruby-identifier">sub
</span>(
<span class=
"ruby-node">/#{$
&}$/
</span>,
<span class=
"ruby-identifier">s4m
</span>[
<span class=
"ruby-node">$
&</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>
1039 <div id=
"step--method" class=
"method-detail ">
1040 <a name=
"method-i-step_5"></a>
1042 <div class=
"method-heading">
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>
1050 <div class=
"method-description">
1056 <div class=
"method-source-code"
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>
1090 <div id=
"rdoc-debugging-section-dump" class=
"debugging-section">
1092 <p>Disabled; run with --debug to generate this.
</p>
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>