cf70bbaee4ff9fe36d75cdabbbaae9db0184ccc2
[porter2stemmer.git] / rdoc / classes / String.html
1 <?xml version="1.0" encoding="iso-8859-1"?>
2 <!DOCTYPE html
3 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7 <head>
8 <title>Class: String</title>
9 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10 <meta http-equiv="Content-Script-Type" content="text/javascript" />
11 <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12 <script type="text/javascript">
13 // <![CDATA[
14
15 function popupCode( url ) {
16 window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17 }
18
19 function toggleCode( id ) {
20 if ( document.getElementById )
21 elem = document.getElementById( id );
22 else if ( document.all )
23 elem = eval( "document.all." + id );
24 else
25 return false;
26
27 elemStyle = elem.style;
28
29 if ( elemStyle.display != "block" ) {
30 elemStyle.display = "block"
31 } else {
32 elemStyle.display = "none"
33 }
34
35 return true;
36 }
37
38 // Make codeblocks hidden by default
39 document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
41 // ]]>
42 </script>
43
44 </head>
45 <body>
46
47
48
49 <div id="classHeader">
50 <table class="header-table">
51 <tr class="top-aligned-row">
52 <td><strong>Class</strong></td>
53 <td class="class-name-in-header">String</td>
54 </tr>
55 <tr class="top-aligned-row">
56 <td><strong>In:</strong></td>
57 <td>
58 <a href="../files/lib/porter2stemmer/implementation_rb.html">
59 lib/porter2stemmer/implementation.rb
60 </a>
61 <br />
62 </td>
63 </tr>
64
65 <tr class="top-aligned-row">
66 <td><strong>Parent:</strong></td>
67 <td>
68 Object
69 </td>
70 </tr>
71 </table>
72 </div>
73 <!-- banner header -->
74
75 <div id="bodyContent">
76
77
78
79 <div id="contextContent">
80
81 <div id="description">
82 <p>
83 Implementation of the Porter 2 stemmer. <a
84 href="String.html#M000016">String#porter2_stem</a> is the main stemming
85 procedure.
86 </p>
87
88 </div>
89
90
91 </div>
92
93 <div id="method-list">
94 <h3 class="section-bar">Methods</h3>
95
96 <div class="name-list">
97 <a href="#M000005">porter2_ends_with_short_syllable?</a>&nbsp;&nbsp;
98 <a href="#M000006">porter2_is_short_word?</a>&nbsp;&nbsp;
99 <a href="#M000015">porter2_postprocess</a>&nbsp;&nbsp;
100 <a href="#M000002">porter2_preprocess</a>&nbsp;&nbsp;
101 <a href="#M000003">porter2_r1</a>&nbsp;&nbsp;
102 <a href="#M000004">porter2_r2</a>&nbsp;&nbsp;
103 <a href="#M000016">porter2_stem</a>&nbsp;&nbsp;
104 <a href="#M000017">porter2_stem_verbose</a>&nbsp;&nbsp;
105 <a href="#M000007">porter2_step0</a>&nbsp;&nbsp;
106 <a href="#M000008">porter2_step1a</a>&nbsp;&nbsp;
107 <a href="#M000009">porter2_step1b</a>&nbsp;&nbsp;
108 <a href="#M000010">porter2_step1c</a>&nbsp;&nbsp;
109 <a href="#M000011">porter2_step2</a>&nbsp;&nbsp;
110 <a href="#M000012">porter2_step3</a>&nbsp;&nbsp;
111 <a href="#M000013">porter2_step4</a>&nbsp;&nbsp;
112 <a href="#M000014">porter2_step5</a>&nbsp;&nbsp;
113 <a href="#M000001">porter2_tidy</a>&nbsp;&nbsp;
114 <a href="#M000018">stem</a>&nbsp;&nbsp;
115 </div>
116 </div>
117
118 </div>
119
120
121 <!-- if includes -->
122
123 <div id="section">
124
125
126
127
128
129
130
131
132 <!-- if method_list -->
133 <div id="methods">
134 <h3 class="section-bar">Public Instance methods</h3>
135
136 <div id="method-M000005" class="method-detail">
137 <a name="M000005"></a>
138
139 <div class="method-heading">
140 <a href="#M000005" class="method-signature">
141 <span class="method-name">porter2_ends_with_short_syllable?</span><span class="method-args">()</span>
142 </a>
143 </div>
144
145 <div class="method-description">
146 <p>
147 Returns true if the word ends with a short syllable
148 </p>
149 <p><a class="source-toggle" href="#"
150 onclick="toggleCode('M000005-source');return false;">[Source]</a></p>
151 <div class="method-source-code" id="M000005-source">
152 <pre>
153 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 59</span>
154 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_ends_with_short_syllable?</span>
155 <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::SHORT_SYLLABLE}$/</span> <span class="ruby-operator">?</span> <span class="ruby-keyword kw">true</span> <span class="ruby-operator">:</span> <span class="ruby-keyword kw">false</span>
156 <span class="ruby-keyword kw">end</span>
157 </pre>
158 </div>
159 </div>
160 </div>
161
162 <div id="method-M000006" class="method-detail">
163 <a name="M000006"></a>
164
165 <div class="method-heading">
166 <a href="#M000006" class="method-signature">
167 <span class="method-name">porter2_is_short_word?</span><span class="method-args">()</span>
168 </a>
169 </div>
170
171 <div class="method-description">
172 <p>
173 A word is short if it ends in a short syllable, and R1 is null
174 </p>
175 <p><a class="source-toggle" href="#"
176 onclick="toggleCode('M000006-source');return false;">[Source]</a></p>
177 <div class="method-source-code" id="M000006-source">
178 <pre>
179 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 65</span>
180 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_is_short_word?</span>
181 <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>
182 <span class="ruby-keyword kw">end</span>
183 </pre>
184 </div>
185 </div>
186 </div>
187
188 <div id="method-M000015" class="method-detail">
189 <a name="M000015"></a>
190
191 <div class="method-heading">
192 <a href="#M000015" class="method-signature">
193 <span class="method-name">porter2_postprocess</span><span class="method-args">()</span>
194 </a>
195 </div>
196
197 <div class="method-description">
198 <p>
199 Turn all Y letters into y
200 </p>
201 <p><a class="source-toggle" href="#"
202 onclick="toggleCode('M000015-source');return false;">[Source]</a></p>
203 <div class="method-source-code" id="M000015-source">
204 <pre>
205 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 261</span>
206 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_postprocess</span>
207 <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>)
208 <span class="ruby-keyword kw">end</span>
209 </pre>
210 </div>
211 </div>
212 </div>
213
214 <div id="method-M000002" class="method-detail">
215 <a name="M000002"></a>
216
217 <div class="method-heading">
218 <a href="#M000002" class="method-signature">
219 <span class="method-name">porter2_preprocess</span><span class="method-args">()</span>
220 </a>
221 </div>
222
223 <div class="method-description">
224 <p>
225 Preprocess the word. Remove any initial &#8217;, if present. Then, set
226 initial y, or y after a vowel, to Y
227 </p>
228 <p>
229 (The comment to &#8216;establish the regions R1 and R2&#8217; in the
230 original description is an implementation optimisation that identifies
231 where the regions start. As no modifications are made to the word that
232 affect those positions, you may want to cache them now. This implementation
233 doesn&#8216;t do that.)
234 </p>
235 <p><a class="source-toggle" href="#"
236 onclick="toggleCode('M000002-source');return false;">[Source]</a></p>
237 <div class="method-source-code" id="M000002-source">
238 <pre>
239 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 25</span>
240 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_preprocess</span>
241 <span class="ruby-identifier">w</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">dup</span>
242
243 <span class="ruby-comment cmt"># remove any initial apostrophe</span>
244 <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>)
245
246 <span class="ruby-comment cmt"># set initial y, or y after a vowel, to Y</span>
247 <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>)
248 <span class="ruby-identifier">w</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-node">/(#{Porter2::V})y/</span>, <span class="ruby-value str">'\1Y'</span>)
249
250 <span class="ruby-identifier">w</span>
251 <span class="ruby-keyword kw">end</span>
252 </pre>
253 </div>
254 </div>
255 </div>
256
257 <div id="method-M000003" class="method-detail">
258 <a name="M000003"></a>
259
260 <div class="method-heading">
261 <a href="#M000003" class="method-signature">
262 <span class="method-name">porter2_r1</span><span class="method-args">()</span>
263 </a>
264 </div>
265
266 <div class="method-description">
267 <p>
268 R1 is the portion of the word after the first non-vowel after the first
269 vowel (with words beginning &#8216;gener-&#8217;, &#8216;commun-&#8217;,
270 and &#8216;arsen-&#8217; treated as special cases
271 </p>
272 <p><a class="source-toggle" href="#"
273 onclick="toggleCode('M000003-source');return false;">[Source]</a></p>
274 <div class="method-source-code" id="M000003-source">
275 <pre>
276 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 41</span>
277 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_r1</span>
278 <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>
279 <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">last_match</span>(<span class="ruby-identifier">:r1</span>)
280 <span class="ruby-keyword kw">else</span>
281 <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::V}#{Porter2::C}(?&lt;r1&gt;.*)$/</span>
282 <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">last_match</span>(<span class="ruby-identifier">:r1</span>) <span class="ruby-operator">||</span> <span class="ruby-value str">&quot;&quot;</span>
283 <span class="ruby-keyword kw">end</span>
284 <span class="ruby-keyword kw">end</span>
285 </pre>
286 </div>
287 </div>
288 </div>
289
290 <div id="method-M000004" class="method-detail">
291 <a name="M000004"></a>
292
293 <div class="method-heading">
294 <a href="#M000004" class="method-signature">
295 <span class="method-name">porter2_r2</span><span class="method-args">()</span>
296 </a>
297 </div>
298
299 <div class="method-description">
300 <p>
301 R2 is the portion of R1 (<a href="String.html#M000003">porter2_r1</a>)
302 after the first non-vowel after the first vowel
303 </p>
304 <p><a class="source-toggle" href="#"
305 onclick="toggleCode('M000004-source');return false;">[Source]</a></p>
306 <div class="method-source-code" id="M000004-source">
307 <pre>
308 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 52</span>
309 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_r2</span>
310 <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::V}#{Porter2::C}(?&lt;r2&gt;.*)$/</span>
311 <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">last_match</span>(<span class="ruby-identifier">:r2</span>) <span class="ruby-operator">||</span> <span class="ruby-value str">&quot;&quot;</span>
312 <span class="ruby-keyword kw">end</span>
313 </pre>
314 </div>
315 </div>
316 </div>
317
318 <div id="method-M000016" class="method-detail">
319 <a name="M000016"></a>
320
321 <div class="method-heading">
322 <a href="#M000016" class="method-signature">
323 <span class="method-name">porter2_stem</span><span class="method-args">(gb_english = false)</span>
324 </a>
325 </div>
326
327 <div class="method-description">
328 <p>
329 Perform the stemming procedure. If <tt>gb_english</tt> is true, treat
330 &#8217;-ise&#8217; and similar suffixes as &#8217;-ize&#8217; in American
331 English.
332 </p>
333 <p><a class="source-toggle" href="#"
334 onclick="toggleCode('M000016-source');return false;">[Source]</a></p>
335 <div class="method-source-code" id="M000016-source">
336 <pre>
337 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 269</span>
338 <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>)
339 <span class="ruby-identifier">preword</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_tidy</span>
340 <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>
341
342 <span class="ruby-identifier">word</span> = <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">porter2_preprocess</span>
343
344 <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">SPECIAL_CASES</span>.<span class="ruby-identifier">has_key?</span> <span class="ruby-identifier">word</span>
345 <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">SPECIAL_CASES</span>[<span class="ruby-identifier">word</span>]
346 <span class="ruby-keyword kw">else</span>
347 <span class="ruby-identifier">w1a</span> = <span class="ruby-identifier">word</span>.<span class="ruby-identifier">porter2_step0</span>.<span class="ruby-identifier">porter2_step1a</span>
348 <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">STEP_1A_SPECIAL_CASES</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">w1a</span>
349 <span class="ruby-identifier">w1a</span>
350 <span class="ruby-keyword kw">else</span>
351 <span class="ruby-identifier">w1a</span>.<span class="ruby-identifier">porter2_step1b</span>(<span class="ruby-identifier">gb_english</span>).<span class="ruby-identifier">porter2_step1c</span>.<span class="ruby-identifier">porter2_step2</span>(<span class="ruby-identifier">gb_english</span>).<span class="ruby-identifier">porter2_step3</span>(<span class="ruby-identifier">gb_english</span>).<span class="ruby-identifier">porter2_step4</span>(<span class="ruby-identifier">gb_english</span>).<span class="ruby-identifier">porter2_step5</span>.<span class="ruby-identifier">porter2_postprocess</span>
352 <span class="ruby-keyword kw">end</span>
353 <span class="ruby-keyword kw">end</span>
354 <span class="ruby-keyword kw">end</span>
355 </pre>
356 </div>
357 </div>
358 </div>
359
360 <div id="method-M000017" class="method-detail">
361 <a name="M000017"></a>
362
363 <div class="method-heading">
364 <a href="#M000017" class="method-signature">
365 <span class="method-name">porter2_stem_verbose</span><span class="method-args">(gb_english = false)</span>
366 </a>
367 </div>
368
369 <div class="method-description">
370 <p>
371 A verbose version of <a href="String.html#M000016">porter2_stem</a> that
372 prints the output of each stage to STDOUT
373 </p>
374 <p><a class="source-toggle" href="#"
375 onclick="toggleCode('M000017-source');return false;">[Source]</a></p>
376 <div class="method-source-code" id="M000017-source">
377 <pre>
378 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 288</span>
379 <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>)
380 <span class="ruby-identifier">preword</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_tidy</span>
381 <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Preword: #{preword}&quot;</span>
382 <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>
383
384 <span class="ruby-identifier">word</span> = <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">porter2_preprocess</span>
385 <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Preprocessed: #{word}&quot;</span>
386
387 <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">SPECIAL_CASES</span>.<span class="ruby-identifier">has_key?</span> <span class="ruby-identifier">word</span>
388 <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Returning #{word} as special case #{Porter2::SPECIAL_CASES[word]}&quot;</span>
389 <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">SPECIAL_CASES</span>[<span class="ruby-identifier">word</span>]
390 <span class="ruby-keyword kw">else</span>
391 <span class="ruby-identifier">r1</span> = <span class="ruby-identifier">word</span>.<span class="ruby-identifier">porter2_r1</span>
392 <span class="ruby-identifier">r2</span> = <span class="ruby-identifier">word</span>.<span class="ruby-identifier">porter2_r2</span>
393 <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;R1 = #{r1}, R2 = #{r2}&quot;</span>
394
395 <span class="ruby-identifier">w0</span> = <span class="ruby-identifier">word</span>.<span class="ruby-identifier">porter2_step0</span> ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 0: #{w0} (R1 = #{w0.porter2_r1}, R2 = #{w0.porter2_r2})&quot;</span>
396 <span class="ruby-identifier">w1a</span> = <span class="ruby-identifier">w0</span>.<span class="ruby-identifier">porter2_step1a</span> ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 1a: #{w1a} (R1 = #{w1a.porter2_r1}, R2 = #{w1a.porter2_r2})&quot;</span>
397
398 <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">STEP_1A_SPECIAL_CASES</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">w1a</span>
399 <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Returning #{w1a} as 1a special case&quot;</span>
400 <span class="ruby-identifier">w1a</span>
401 <span class="ruby-keyword kw">else</span>
402 <span class="ruby-identifier">w1b</span> = <span class="ruby-identifier">w1a</span>.<span class="ruby-identifier">porter2_step1b</span>(<span class="ruby-identifier">gb_english</span>) ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 1b: #{w1b} (R1 = #{w1b.porter2_r1}, R2 = #{w1b.porter2_r2})&quot;</span>
403 <span class="ruby-identifier">w1c</span> = <span class="ruby-identifier">w1b</span>.<span class="ruby-identifier">porter2_step1c</span> ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 1c: #{w1c} (R1 = #{w1c.porter2_r1}, R2 = #{w1c.porter2_r2})&quot;</span>
404 <span class="ruby-identifier">w2</span> = <span class="ruby-identifier">w1c</span>.<span class="ruby-identifier">porter2_step2</span>(<span class="ruby-identifier">gb_english</span>) ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 2: #{w2} (R1 = #{w2.porter2_r1}, R2 = #{w2.porter2_r2})&quot;</span>
405 <span class="ruby-identifier">w3</span> = <span class="ruby-identifier">w2</span>.<span class="ruby-identifier">porter2_step3</span>(<span class="ruby-identifier">gb_english</span>) ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 3: #{w3} (R1 = #{w3.porter2_r1}, R2 = #{w3.porter2_r2})&quot;</span>
406 <span class="ruby-identifier">w4</span> = <span class="ruby-identifier">w3</span>.<span class="ruby-identifier">porter2_step4</span>(<span class="ruby-identifier">gb_english</span>) ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 4: #{w4} (R1 = #{w4.porter2_r1}, R2 = #{w4.porter2_r2})&quot;</span>
407 <span class="ruby-identifier">w5</span> = <span class="ruby-identifier">w4</span>.<span class="ruby-identifier">porter2_step5</span> ; <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;After step 5: #{w5}&quot;</span>
408 <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>
409 <span class="ruby-identifier">wpost</span>
410 <span class="ruby-keyword kw">end</span>
411 <span class="ruby-keyword kw">end</span>
412 <span class="ruby-keyword kw">end</span>
413 </pre>
414 </div>
415 </div>
416 </div>
417
418 <div id="method-M000007" class="method-detail">
419 <a name="M000007"></a>
420
421 <div class="method-heading">
422 <a href="#M000007" class="method-signature">
423 <span class="method-name">porter2_step0</span><span class="method-args">()</span>
424 </a>
425 </div>
426
427 <div class="method-description">
428 <p>
429 Search for the longest among the suffixes,
430 </p>
431 <ul>
432 <li>&#8216;
433
434 </li>
435 <li>&#8216;s
436
437 </li>
438 <li>&#8216;s&#8216;
439
440 </li>
441 </ul>
442 <p>
443 and remove if found.
444 </p>
445 <p><a class="source-toggle" href="#"
446 onclick="toggleCode('M000007-source');return false;">[Source]</a></p>
447 <div class="method-source-code" id="M000007-source">
448 <pre>
449 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 75</span>
450 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step0</span>
451 <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>
452 <span class="ruby-keyword kw">end</span>
453 </pre>
454 </div>
455 </div>
456 </div>
457
458 <div id="method-M000008" class="method-detail">
459 <a name="M000008"></a>
460
461 <div class="method-heading">
462 <a href="#M000008" class="method-signature">
463 <span class="method-name">porter2_step1a</span><span class="method-args">()</span>
464 </a>
465 </div>
466
467 <div class="method-description">
468 <p>
469 Search for the longest among the following suffixes, and perform the action
470 indicated.
471 </p>
472 <table>
473 <tr><td valign="top">sses:</td><td>replace by ss
474
475 </td></tr>
476 <tr><td valign="top">ied, ies:</td><td>replace by i if preceded by more than one letter, otherwise by ie
477
478 </td></tr>
479 <tr><td valign="top">s:</td><td>delete if the preceding word part contains a vowel not immediately before
480 the s
481
482 </td></tr>
483 <tr><td valign="top">us, ss:</td><td>do nothing
484
485 </td></tr>
486 </table>
487 <p><a class="source-toggle" href="#"
488 onclick="toggleCode('M000008-source');return false;">[Source]</a></p>
489 <div class="method-source-code" id="M000008-source">
490 <pre>
491 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 85</span>
492 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step1a</span>
493 <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>
494 <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>)
495 <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>
496 <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>)
497 <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>
498 <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>)
499 <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>
500 <span class="ruby-keyword kw">self</span>
501 <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>
502 <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/(#{Porter2::V}.+)s$/</span>
503 <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>)
504 <span class="ruby-keyword kw">else</span>
505 <span class="ruby-keyword kw">self</span>
506 <span class="ruby-keyword kw">end</span>
507 <span class="ruby-keyword kw">else</span>
508 <span class="ruby-keyword kw">self</span>
509 <span class="ruby-keyword kw">end</span>
510 <span class="ruby-keyword kw">end</span>
511 </pre>
512 </div>
513 </div>
514 </div>
515
516 <div id="method-M000009" class="method-detail">
517 <a name="M000009"></a>
518
519 <div class="method-heading">
520 <a href="#M000009" class="method-signature">
521 <span class="method-name">porter2_step1b</span><span class="method-args">(gb_english = false)</span>
522 </a>
523 </div>
524
525 <div class="method-description">
526 <p>
527 Search for the longest among the following suffixes, and perform the action
528 indicated.
529 </p>
530 <table>
531 <tr><td valign="top">eed, eedly:</td><td>replace by ee if the suffix is also in R1
532
533 </td></tr>
534 <tr><td valign="top">ed, edly, ing, ingly:</td><td>delete if the preceding word part contains a vowel and, after the deletion:
535
536 <ul>
537 <li>if the word ends at, bl or iz: add e, or
538
539 </li>
540 <li>if the word ends with a double: remove the last letter, or
541
542 </li>
543 <li>if the word is short: add e
544
545 </li>
546 </ul>
547 </td></tr>
548 </table>
549 <p>
550 (If gb_english is <tt>true</tt>, treat the &#8216;is&#8217; suffix as
551 &#8216;iz&#8217; above.)
552 </p>
553 <p><a class="source-toggle" href="#"
554 onclick="toggleCode('M000009-source');return false;">[Source]</a></p>
555 <div class="method-source-code" id="M000009-source">
556 <pre>
557 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 115</span>
558 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step1b</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
559 <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>
560 <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>
561 <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>)
562 <span class="ruby-keyword kw">else</span>
563 <span class="ruby-keyword kw">self</span>
564 <span class="ruby-keyword kw">end</span>
565 <span class="ruby-keyword kw">else</span>
566 <span class="ruby-identifier">w</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">dup</span>
567 <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">w</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::V}.*(ed|edly|ing|ingly)$/</span>
568 <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>)
569 <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>
570 <span class="ruby-identifier">w</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">'e'</span>
571 <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>
572 <span class="ruby-identifier">w</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">'e'</span>
573 <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">w</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::Double}$/</span>
574 <span class="ruby-identifier">w</span>.<span class="ruby-identifier">chop!</span>
575 <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">w</span>.<span class="ruby-identifier">porter2_is_short_word?</span>
576 <span class="ruby-identifier">w</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">'e'</span>
577 <span class="ruby-keyword kw">end</span>
578 <span class="ruby-keyword kw">end</span>
579 <span class="ruby-identifier">w</span>
580 <span class="ruby-keyword kw">end</span>
581 <span class="ruby-keyword kw">end</span>
582 </pre>
583 </div>
584 </div>
585 </div>
586
587 <div id="method-M000010" class="method-detail">
588 <a name="M000010"></a>
589
590 <div class="method-heading">
591 <a href="#M000010" class="method-signature">
592 <span class="method-name">porter2_step1c</span><span class="method-args">()</span>
593 </a>
594 </div>
595
596 <div class="method-description">
597 <p>
598 Replace a suffix of y or Y by i if it is preceded by a non-vowel which is
599 not the first letter of the word.
600 </p>
601 <p><a class="source-toggle" href="#"
602 onclick="toggleCode('M000010-source');return false;">[Source]</a></p>
603 <div class="method-source-code" id="M000010-source">
604 <pre>
605 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 143</span>
606 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step1c</span>
607 <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/.+#{Porter2::C}(y|Y)$/</span>
608 <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>)
609 <span class="ruby-keyword kw">else</span>
610 <span class="ruby-keyword kw">self</span>
611 <span class="ruby-keyword kw">end</span>
612 <span class="ruby-keyword kw">end</span>
613 </pre>
614 </div>
615 </div>
616 </div>
617
618 <div id="method-M000011" class="method-detail">
619 <a name="M000011"></a>
620
621 <div class="method-heading">
622 <a href="#M000011" class="method-signature">
623 <span class="method-name">porter2_step2</span><span class="method-args">(gb_english = false)</span>
624 </a>
625 </div>
626
627 <div class="method-description">
628 <p>
629 Search for the longest among the suffixes listed in the keys of
630 Porter2::STEP_2_MAPS. If one is found and that suffix occurs in R1, replace
631 it with the value found in STEP_2_MAPS.
632 </p>
633 <p>
634 (Suffixes &#8216;ogi&#8217; and &#8216;li&#8217; are treated as special
635 cases in the procedure.)
636 </p>
637 <p>
638 (If gb_english is <tt>true</tt>, replace the &#8216;iser&#8217; and
639 &#8216;isation&#8217; suffixes with &#8216;ise&#8217;, similarly to how
640 &#8216;izer&#8217; and &#8216;ization&#8217; are treated.)
641 </p>
642 <p><a class="source-toggle" href="#"
643 onclick="toggleCode('M000011-source');return false;">[Source]</a></p>
644 <div class="method-source-code" id="M000011-source">
645 <pre>
646 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 160</span>
647 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step2</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
648 <span class="ruby-identifier">r1</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span>
649 <span class="ruby-identifier">s2m</span> = <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">STEP_2_MAPS</span>.<span class="ruby-identifier">dup</span>
650 <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">gb_english</span>
651 <span class="ruby-identifier">s2m</span>[<span class="ruby-value str">&quot;iser&quot;</span>] = <span class="ruby-value str">&quot;ise&quot;</span>
652 <span class="ruby-identifier">s2m</span>[<span class="ruby-value str">&quot;isation&quot;</span>] = <span class="ruby-value str">&quot;ise&quot;</span>
653 <span class="ruby-keyword kw">end</span>
654 <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>)})
655 <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>
656 <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">r1</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{$&amp;}$/</span>
657 <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-identifier">$&amp;</span>])
658 <span class="ruby-keyword kw">else</span>
659 <span class="ruby-keyword kw">self</span>
660 <span class="ruby-keyword kw">end</span>
661 <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">r1</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/li$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/(#{Porter2::Valid_LI})li$/</span>
662 <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>)
663 <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>
664 <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>)
665 <span class="ruby-keyword kw">else</span>
666 <span class="ruby-keyword kw">self</span>
667 <span class="ruby-keyword kw">end</span>
668 <span class="ruby-keyword kw">end</span>
669 </pre>
670 </div>
671 </div>
672 </div>
673
674 <div id="method-M000012" class="method-detail">
675 <a name="M000012"></a>
676
677 <div class="method-heading">
678 <a href="#M000012" class="method-signature">
679 <span class="method-name">porter2_step3</span><span class="method-args">(gb_english = false)</span>
680 </a>
681 </div>
682
683 <div class="method-description">
684 <p>
685 Search for the longest among the suffixes listed in the keys of
686 Porter2::STEP_3_MAPS. If one is found and that suffix occurs in R1, replace
687 it with the value found in STEP_3_MAPS.
688 </p>
689 <p>
690 (Suffix &#8216;ative&#8217; is treated as a special case in the procedure.)
691 </p>
692 <p>
693 (If gb_english is <tt>true</tt>, replace the &#8216;alise&#8217; suffix
694 with &#8216;al&#8217;, similarly to how &#8216;alize&#8217; is treated.)
695 </p>
696 <p><a class="source-toggle" href="#"
697 onclick="toggleCode('M000012-source');return false;">[Source]</a></p>
698 <div class="method-source-code" id="M000012-source">
699 <pre>
700 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 192</span>
701 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step3</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
702 <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>
703 <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>)
704 <span class="ruby-keyword kw">else</span>
705 <span class="ruby-identifier">s3m</span> = <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">STEP_3_MAPS</span>.<span class="ruby-identifier">dup</span>
706 <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">gb_english</span>
707 <span class="ruby-identifier">s3m</span>[<span class="ruby-value str">&quot;alise&quot;</span>] = <span class="ruby-value str">&quot;al&quot;</span>
708 <span class="ruby-keyword kw">end</span>
709 <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>)})
710 <span class="ruby-identifier">r1</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span>
711 <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>
712 <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-identifier">$&amp;</span>])
713 <span class="ruby-keyword kw">else</span>
714 <span class="ruby-keyword kw">self</span>
715 <span class="ruby-keyword kw">end</span>
716 <span class="ruby-keyword kw">end</span>
717 <span class="ruby-keyword kw">end</span>
718 </pre>
719 </div>
720 </div>
721 </div>
722
723 <div id="method-M000013" class="method-detail">
724 <a name="M000013"></a>
725
726 <div class="method-heading">
727 <a href="#M000013" class="method-signature">
728 <span class="method-name">porter2_step4</span><span class="method-args">(gb_english = false)</span>
729 </a>
730 </div>
731
732 <div class="method-description">
733 <p>
734 Search for the longest among the suffixes listed in the keys of
735 Porter2::STEP_4_MAPS. If one is found and that suffix occurs in R2, replace
736 it with the value found in STEP_4_MAPS.
737 </p>
738 <p>
739 (Suffix &#8216;ion&#8217; is treated as a special case in the procedure.)
740 </p>
741 <p>
742 (If gb_english is <tt>true</tt>, delete the &#8216;ise&#8217; suffix if
743 found.)
744 </p>
745 <p><a class="source-toggle" href="#"
746 onclick="toggleCode('M000013-source');return false;">[Source]</a></p>
747 <div class="method-source-code" id="M000013-source">
748 <pre>
749 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 218</span>
750 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step4</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
751 <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>
752 <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>)
753 <span class="ruby-keyword kw">else</span>
754 <span class="ruby-identifier">s4m</span> = <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">STEP_4_MAPS</span>.<span class="ruby-identifier">dup</span>
755 <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">gb_english</span>
756 <span class="ruby-identifier">s4m</span>[<span class="ruby-value str">&quot;ise&quot;</span>] = <span class="ruby-value str">&quot;&quot;</span>
757 <span class="ruby-keyword kw">end</span>
758 <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>)})
759 <span class="ruby-identifier">r2</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r2</span>
760 <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>
761 <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">r2</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{$&amp;}/</span>
762 <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-identifier">$&amp;</span>])
763 <span class="ruby-keyword kw">else</span>
764 <span class="ruby-keyword kw">self</span>
765 <span class="ruby-keyword kw">end</span>
766 <span class="ruby-keyword kw">else</span>
767 <span class="ruby-keyword kw">self</span>
768 <span class="ruby-keyword kw">end</span>
769 <span class="ruby-keyword kw">end</span>
770 <span class="ruby-keyword kw">end</span>
771 </pre>
772 </div>
773 </div>
774 </div>
775
776 <div id="method-M000014" class="method-detail">
777 <a name="M000014"></a>
778
779 <div class="method-heading">
780 <a href="#M000014" class="method-signature">
781 <span class="method-name">porter2_step5</span><span class="method-args">()</span>
782 </a>
783 </div>
784
785 <div class="method-description">
786 <p>
787 Search for the the following suffixes, and, if found, perform the action
788 indicated.
789 </p>
790 <table>
791 <tr><td valign="top">e:</td><td>delete if in R2, or in R1 and not preceded by a short syllable
792
793 </td></tr>
794 <tr><td valign="top">l:</td><td>delete if in R2 and preceded by l
795
796 </td></tr>
797 </table>
798 <p><a class="source-toggle" href="#"
799 onclick="toggleCode('M000014-source');return false;">[Source]</a></p>
800 <div class="method-source-code" id="M000014-source">
801 <pre>
802 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 244</span>
803 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step5</span>
804 <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>
805 <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>)
806 <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>
807 <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>)
808 <span class="ruby-keyword kw">else</span>
809 <span class="ruby-identifier">r1</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span>
810 <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/e$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">r1</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/e$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">not</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::SHORT_SYLLABLE}e$/</span>
811 <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>)
812 <span class="ruby-keyword kw">else</span>
813 <span class="ruby-keyword kw">self</span>
814 <span class="ruby-keyword kw">end</span>
815 <span class="ruby-keyword kw">end</span>
816 <span class="ruby-keyword kw">end</span>
817 </pre>
818 </div>
819 </div>
820 </div>
821
822 <div id="method-M000001" class="method-detail">
823 <a name="M000001"></a>
824
825 <div class="method-heading">
826 <a href="#M000001" class="method-signature">
827 <span class="method-name">porter2_tidy</span><span class="method-args">()</span>
828 </a>
829 </div>
830
831 <div class="method-description">
832 <p>
833 Tidy up the word before we get down to the algorithm
834 </p>
835 <p><a class="source-toggle" href="#"
836 onclick="toggleCode('M000001-source');return false;">[Source]</a></p>
837 <div class="method-source-code" id="M000001-source">
838 <pre>
839 <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 7</span>
840 <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_tidy</span>
841 <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>
842
843 <span class="ruby-comment cmt"># map apostrophe-like characters to apostrophes</span>
844 <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>)
845 <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>)
846
847 <span class="ruby-identifier">preword</span>
848 <span class="ruby-keyword kw">end</span>
849 </pre>
850 </div>
851 </div>
852 </div>
853
854 <div id="method-M000018" class="method-detail">
855 <a name="M000018"></a>
856
857 <div class="method-heading">
858 <span class="method-name">stem</span><span class="method-args">(gb_english = false)</span>
859 </div>
860
861 <div class="method-description">
862 <p>
863 Alias for <a href="String.html#M000016">porter2_stem</a>
864 </p>
865 </div>
866 </div>
867
868
869 </div>
870
871
872 </div>
873
874
875 <div id="validator-badges">
876 <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
877 </div>
878
879 </body>
880 </html>