X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=rdoc%2Fclasses%2FString.html;fp=rdoc%2Fclasses%2FString.html;h=cf70bbaee4ff9fe36d75cdabbbaae9db0184ccc2;hb=cfc1c3309c8c78411683697836307ee18f20ea1d;hp=0000000000000000000000000000000000000000;hpb=a10026f6ba04d8887df8d4c1d7f08af4198c6c2e;p=porter2stemmer.git diff --git a/rdoc/classes/String.html b/rdoc/classes/String.html new file mode 100644 index 0000000..cf70bba --- /dev/null +++ b/rdoc/classes/String.html @@ -0,0 +1,880 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title>Class: String</title> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> + <meta http-equiv="Content-Script-Type" content="text/javascript" /> + <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" /> + <script type="text/javascript"> + // <![CDATA[ + + function popupCode( url ) { + window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400") + } + + function toggleCode( id ) { + if ( document.getElementById ) + elem = document.getElementById( id ); + else if ( document.all ) + elem = eval( "document.all." + id ); + else + return false; + + elemStyle = elem.style; + + if ( elemStyle.display != "block" ) { + elemStyle.display = "block" + } else { + elemStyle.display = "none" + } + + return true; + } + + // Make codeblocks hidden by default + document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" ) + + // ]]> + </script> + +</head> +<body> + + + + <div id="classHeader"> + <table class="header-table"> + <tr class="top-aligned-row"> + <td><strong>Class</strong></td> + <td class="class-name-in-header">String</td> + </tr> + <tr class="top-aligned-row"> + <td><strong>In:</strong></td> + <td> + <a href="../files/lib/porter2stemmer/implementation_rb.html"> + lib/porter2stemmer/implementation.rb + </a> + <br /> + </td> + </tr> + + <tr class="top-aligned-row"> + <td><strong>Parent:</strong></td> + <td> + Object + </td> + </tr> + </table> + </div> + <!-- banner header --> + + <div id="bodyContent"> + + + + <div id="contextContent"> + + <div id="description"> + <p> +Implementation of the Porter 2 stemmer. <a +href="String.html#M000016">String#porter2_stem</a> is the main stemming +procedure. +</p> + + </div> + + + </div> + + <div id="method-list"> + <h3 class="section-bar">Methods</h3> + + <div class="name-list"> + <a href="#M000005">porter2_ends_with_short_syllable?</a> + <a href="#M000006">porter2_is_short_word?</a> + <a href="#M000015">porter2_postprocess</a> + <a href="#M000002">porter2_preprocess</a> + <a href="#M000003">porter2_r1</a> + <a href="#M000004">porter2_r2</a> + <a href="#M000016">porter2_stem</a> + <a href="#M000017">porter2_stem_verbose</a> + <a href="#M000007">porter2_step0</a> + <a href="#M000008">porter2_step1a</a> + <a href="#M000009">porter2_step1b</a> + <a href="#M000010">porter2_step1c</a> + <a href="#M000011">porter2_step2</a> + <a href="#M000012">porter2_step3</a> + <a href="#M000013">porter2_step4</a> + <a href="#M000014">porter2_step5</a> + <a href="#M000001">porter2_tidy</a> + <a href="#M000018">stem</a> + </div> + </div> + + </div> + + + <!-- if includes --> + + <div id="section"> + + + + + + + + + <!-- if method_list --> + <div id="methods"> + <h3 class="section-bar">Public Instance methods</h3> + + <div id="method-M000005" class="method-detail"> + <a name="M000005"></a> + + <div class="method-heading"> + <a href="#M000005" class="method-signature"> + <span class="method-name">porter2_ends_with_short_syllable?</span><span class="method-args">()</span> + </a> + </div> + + <div class="method-description"> + <p> +Returns true if the word ends with a short syllable +</p> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000005-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000005-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 59</span> + <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_ends_with_short_syllable?</span> + <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> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000006" class="method-detail"> + <a name="M000006"></a> + + <div class="method-heading"> + <a href="#M000006" class="method-signature"> + <span class="method-name">porter2_is_short_word?</span><span class="method-args">()</span> + </a> + </div> + + <div class="method-description"> + <p> +A word is short if it ends in a short syllable, and R1 is null +</p> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000006-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000006-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 65</span> + <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_is_short_word?</span> + <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> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000015" class="method-detail"> + <a name="M000015"></a> + + <div class="method-heading"> + <a href="#M000015" class="method-signature"> + <span class="method-name">porter2_postprocess</span><span class="method-args">()</span> + </a> + </div> + + <div class="method-description"> + <p> +Turn all Y letters into y +</p> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000015-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000015-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 261</span> + <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_postprocess</span> + <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>) + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000002" class="method-detail"> + <a name="M000002"></a> + + <div class="method-heading"> + <a href="#M000002" class="method-signature"> + <span class="method-name">porter2_preprocess</span><span class="method-args">()</span> + </a> + </div> + + <div class="method-description"> + <p> +Preprocess the word. Remove any initial ’, if present. Then, set +initial y, or y after a vowel, to Y +</p> +<p> +(The comment to ‘establish the regions R1 and R2’ in the +original description is an implementation optimisation that identifies +where the regions start. As no modifications are made to the word that +affect those positions, you may want to cache them now. This implementation +doesn‘t do that.) +</p> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000002-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000002-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 25</span> + <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_preprocess</span> + <span class="ruby-identifier">w</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">dup</span> + + <span class="ruby-comment cmt"># remove any initial apostrophe</span> + <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>) + + <span class="ruby-comment cmt"># set initial y, or y after a vowel, to Y</span> + <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>) + <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>) + + <span class="ruby-identifier">w</span> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000003" class="method-detail"> + <a name="M000003"></a> + + <div class="method-heading"> + <a href="#M000003" class="method-signature"> + <span class="method-name">porter2_r1</span><span class="method-args">()</span> + </a> + </div> + + <div class="method-description"> + <p> +R1 is the portion of the word after the first non-vowel after the first +vowel (with words beginning ‘gener-’, ‘commun-’, +and ‘arsen-’ treated as special cases +</p> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000003-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000003-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 41</span> + <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_r1</span> + <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> + <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">last_match</span>(<span class="ruby-identifier">:r1</span>) + <span class="ruby-keyword kw">else</span> + <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::V}#{Porter2::C}(?<r1>.*)$/</span> + <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">""</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000004" class="method-detail"> + <a name="M000004"></a> + + <div class="method-heading"> + <a href="#M000004" class="method-signature"> + <span class="method-name">porter2_r2</span><span class="method-args">()</span> + </a> + </div> + + <div class="method-description"> + <p> +R2 is the portion of R1 (<a href="String.html#M000003">porter2_r1</a>) +after the first non-vowel after the first vowel +</p> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000004-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000004-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 52</span> + <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_r2</span> + <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}(?<r2>.*)$/</span> + <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">""</span> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000016" class="method-detail"> + <a name="M000016"></a> + + <div class="method-heading"> + <a href="#M000016" class="method-signature"> + <span class="method-name">porter2_stem</span><span class="method-args">(gb_english = false)</span> + </a> + </div> + + <div class="method-description"> + <p> +Perform the stemming procedure. If <tt>gb_english</tt> is true, treat +’-ise’ and similar suffixes as ’-ize’ in American +English. +</p> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000016-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000016-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 269</span> + <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>) + <span class="ruby-identifier">preword</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_tidy</span> + <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> + + <span class="ruby-identifier">word</span> = <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">porter2_preprocess</span> + + <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> + <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">SPECIAL_CASES</span>[<span class="ruby-identifier">word</span>] + <span class="ruby-keyword kw">else</span> + <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> + <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> + <span class="ruby-identifier">w1a</span> + <span class="ruby-keyword kw">else</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">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> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000017" class="method-detail"> + <a name="M000017"></a> + + <div class="method-heading"> + <a href="#M000017" class="method-signature"> + <span class="method-name">porter2_stem_verbose</span><span class="method-args">(gb_english = false)</span> + </a> + </div> + + <div class="method-description"> + <p> +A verbose version of <a href="String.html#M000016">porter2_stem</a> that +prints the output of each stage to STDOUT +</p> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000017-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000017-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 288</span> + <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>) + <span class="ruby-identifier">preword</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_tidy</span> + <span class="ruby-identifier">puts</span> <span class="ruby-node">"Preword: #{preword}"</span> + <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> + + <span class="ruby-identifier">word</span> = <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">porter2_preprocess</span> + <span class="ruby-identifier">puts</span> <span class="ruby-node">"Preprocessed: #{word}"</span> + + <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> + <span class="ruby-identifier">puts</span> <span class="ruby-node">"Returning #{word} as special case #{Porter2::SPECIAL_CASES[word]}"</span> + <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">SPECIAL_CASES</span>[<span class="ruby-identifier">word</span>] + <span class="ruby-keyword kw">else</span> + <span class="ruby-identifier">r1</span> = <span class="ruby-identifier">word</span>.<span class="ruby-identifier">porter2_r1</span> + <span class="ruby-identifier">r2</span> = <span class="ruby-identifier">word</span>.<span class="ruby-identifier">porter2_r2</span> + <span class="ruby-identifier">puts</span> <span class="ruby-node">"R1 = #{r1}, R2 = #{r2}"</span> + + <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">"After step 0: #{w0} (R1 = #{w0.porter2_r1}, R2 = #{w0.porter2_r2})"</span> + <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">"After step 1a: #{w1a} (R1 = #{w1a.porter2_r1}, R2 = #{w1a.porter2_r2})"</span> + + <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> + <span class="ruby-identifier">puts</span> <span class="ruby-node">"Returning #{w1a} as 1a special case"</span> + <span class="ruby-identifier">w1a</span> + <span class="ruby-keyword kw">else</span> + <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">"After step 1b: #{w1b} (R1 = #{w1b.porter2_r1}, R2 = #{w1b.porter2_r2})"</span> + <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">"After step 1c: #{w1c} (R1 = #{w1c.porter2_r1}, R2 = #{w1c.porter2_r2})"</span> + <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">"After step 2: #{w2} (R1 = #{w2.porter2_r1}, R2 = #{w2.porter2_r2})"</span> + <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">"After step 3: #{w3} (R1 = #{w3.porter2_r1}, R2 = #{w3.porter2_r2})"</span> + <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">"After step 4: #{w4} (R1 = #{w4.porter2_r1}, R2 = #{w4.porter2_r2})"</span> + <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">"After step 5: #{w5}"</span> + <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> + <span class="ruby-identifier">wpost</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000007" class="method-detail"> + <a name="M000007"></a> + + <div class="method-heading"> + <a href="#M000007" class="method-signature"> + <span class="method-name">porter2_step0</span><span class="method-args">()</span> + </a> + </div> + + <div class="method-description"> + <p> +Search for the longest among the suffixes, +</p> +<ul> +<li>‘ + +</li> +<li>‘s + +</li> +<li>‘s‘ + +</li> +</ul> +<p> +and remove if found. +</p> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000007-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000007-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 75</span> + <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step0</span> + <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> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000008" class="method-detail"> + <a name="M000008"></a> + + <div class="method-heading"> + <a href="#M000008" class="method-signature"> + <span class="method-name">porter2_step1a</span><span class="method-args">()</span> + </a> + </div> + + <div class="method-description"> + <p> +Search for the longest among the following suffixes, and perform the action +indicated. +</p> +<table> +<tr><td valign="top">sses:</td><td>replace by ss + +</td></tr> +<tr><td valign="top">ied, ies:</td><td>replace by i if preceded by more than one letter, otherwise by ie + +</td></tr> +<tr><td valign="top">s:</td><td>delete if the preceding word part contains a vowel not immediately before +the s + +</td></tr> +<tr><td valign="top">us, ss:</td><td>do nothing + +</td></tr> +</table> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000008-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000008-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 85</span> + <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step1a</span> + <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> + <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>) + <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> + <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>) + <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> + <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>) + <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> + <span class="ruby-keyword kw">self</span> + <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> + <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> + <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>) + <span class="ruby-keyword kw">else</span> + <span class="ruby-keyword kw">self</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">else</span> + <span class="ruby-keyword kw">self</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000009" class="method-detail"> + <a name="M000009"></a> + + <div class="method-heading"> + <a href="#M000009" class="method-signature"> + <span class="method-name">porter2_step1b</span><span class="method-args">(gb_english = false)</span> + </a> + </div> + + <div class="method-description"> + <p> +Search for the longest among the following suffixes, and perform the action +indicated. +</p> +<table> +<tr><td valign="top">eed, eedly:</td><td>replace by ee if the suffix is also in R1 + +</td></tr> +<tr><td valign="top">ed, edly, ing, ingly:</td><td>delete if the preceding word part contains a vowel and, after the deletion: + +<ul> +<li>if the word ends at, bl or iz: add e, or + +</li> +<li>if the word ends with a double: remove the last letter, or + +</li> +<li>if the word is short: add e + +</li> +</ul> +</td></tr> +</table> +<p> +(If gb_english is <tt>true</tt>, treat the ‘is’ suffix as +‘iz’ above.) +</p> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000009-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000009-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 115</span> + <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>) + <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> + <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> + <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>) + <span class="ruby-keyword kw">else</span> + <span class="ruby-keyword kw">self</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">else</span> + <span class="ruby-identifier">w</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">dup</span> + <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> + <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>) + <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> + <span class="ruby-identifier">w</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">'e'</span> + <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> + <span class="ruby-identifier">w</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">'e'</span> + <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> + <span class="ruby-identifier">w</span>.<span class="ruby-identifier">chop!</span> + <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">w</span>.<span class="ruby-identifier">porter2_is_short_word?</span> + <span class="ruby-identifier">w</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">'e'</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-identifier">w</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000010" class="method-detail"> + <a name="M000010"></a> + + <div class="method-heading"> + <a href="#M000010" class="method-signature"> + <span class="method-name">porter2_step1c</span><span class="method-args">()</span> + </a> + </div> + + <div class="method-description"> + <p> +Replace a suffix of y or Y by i if it is preceded by a non-vowel which is +not the first letter of the word. +</p> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000010-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000010-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 143</span> + <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step1c</span> + <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> + <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>) + <span class="ruby-keyword kw">else</span> + <span class="ruby-keyword kw">self</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000011" class="method-detail"> + <a name="M000011"></a> + + <div class="method-heading"> + <a href="#M000011" class="method-signature"> + <span class="method-name">porter2_step2</span><span class="method-args">(gb_english = false)</span> + </a> + </div> + + <div class="method-description"> + <p> +Search for the longest among the suffixes listed in the keys of +Porter2::STEP_2_MAPS. If one is found and that suffix occurs in R1, replace +it with the value found in STEP_2_MAPS. +</p> +<p> +(Suffixes ‘ogi’ and ‘li’ are treated as special +cases in the procedure.) +</p> +<p> +(If gb_english is <tt>true</tt>, replace the ‘iser’ and +‘isation’ suffixes with ‘ise’, similarly to how +‘izer’ and ‘ization’ are treated.) +</p> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000011-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000011-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 160</span> + <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>) + <span class="ruby-identifier">r1</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span> + <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> + <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">gb_english</span> + <span class="ruby-identifier">s2m</span>[<span class="ruby-value str">"iser"</span>] = <span class="ruby-value str">"ise"</span> + <span class="ruby-identifier">s2m</span>[<span class="ruby-value str">"isation"</span>] = <span class="ruby-value str">"ise"</span> + <span class="ruby-keyword kw">end</span> + <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>)}) + <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> + <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">r1</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{$&}$/</span> + <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-identifier">$&</span>]) + <span class="ruby-keyword kw">else</span> + <span class="ruby-keyword kw">self</span> + <span class="ruby-keyword kw">end</span> + <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> + <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>) + <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> + <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>) + <span class="ruby-keyword kw">else</span> + <span class="ruby-keyword kw">self</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000012" class="method-detail"> + <a name="M000012"></a> + + <div class="method-heading"> + <a href="#M000012" class="method-signature"> + <span class="method-name">porter2_step3</span><span class="method-args">(gb_english = false)</span> + </a> + </div> + + <div class="method-description"> + <p> +Search for the longest among the suffixes listed in the keys of +Porter2::STEP_3_MAPS. If one is found and that suffix occurs in R1, replace +it with the value found in STEP_3_MAPS. +</p> +<p> +(Suffix ‘ative’ is treated as a special case in the procedure.) +</p> +<p> +(If gb_english is <tt>true</tt>, replace the ‘alise’ suffix +with ‘al’, similarly to how ‘alize’ is treated.) +</p> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000012-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000012-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 192</span> + <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>) + <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> + <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>) + <span class="ruby-keyword kw">else</span> + <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> + <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">gb_english</span> + <span class="ruby-identifier">s3m</span>[<span class="ruby-value str">"alise"</span>] = <span class="ruby-value str">"al"</span> + <span class="ruby-keyword kw">end</span> + <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>)}) + <span class="ruby-identifier">r1</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span> + <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> + <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-identifier">$&</span>]) + <span class="ruby-keyword kw">else</span> + <span class="ruby-keyword kw">self</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000013" class="method-detail"> + <a name="M000013"></a> + + <div class="method-heading"> + <a href="#M000013" class="method-signature"> + <span class="method-name">porter2_step4</span><span class="method-args">(gb_english = false)</span> + </a> + </div> + + <div class="method-description"> + <p> +Search for the longest among the suffixes listed in the keys of +Porter2::STEP_4_MAPS. If one is found and that suffix occurs in R2, replace +it with the value found in STEP_4_MAPS. +</p> +<p> +(Suffix ‘ion’ is treated as a special case in the procedure.) +</p> +<p> +(If gb_english is <tt>true</tt>, delete the ‘ise’ suffix if +found.) +</p> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000013-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000013-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 218</span> + <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>) + <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> + <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>) + <span class="ruby-keyword kw">else</span> + <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> + <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">gb_english</span> + <span class="ruby-identifier">s4m</span>[<span class="ruby-value str">"ise"</span>] = <span class="ruby-value str">""</span> + <span class="ruby-keyword kw">end</span> + <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>)}) + <span class="ruby-identifier">r2</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r2</span> + <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> + <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">r2</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{$&}/</span> + <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-identifier">$&</span>]) + <span class="ruby-keyword kw">else</span> + <span class="ruby-keyword kw">self</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">else</span> + <span class="ruby-keyword kw">self</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000014" class="method-detail"> + <a name="M000014"></a> + + <div class="method-heading"> + <a href="#M000014" class="method-signature"> + <span class="method-name">porter2_step5</span><span class="method-args">()</span> + </a> + </div> + + <div class="method-description"> + <p> +Search for the the following suffixes, and, if found, perform the action +indicated. +</p> +<table> +<tr><td valign="top">e:</td><td>delete if in R2, or in R1 and not preceded by a short syllable + +</td></tr> +<tr><td valign="top">l:</td><td>delete if in R2 and preceded by l + +</td></tr> +</table> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000014-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000014-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 244</span> + <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step5</span> + <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> + <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>) + <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> + <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>) + <span class="ruby-keyword kw">else</span> + <span class="ruby-identifier">r1</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span> + <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> + <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>) + <span class="ruby-keyword kw">else</span> + <span class="ruby-keyword kw">self</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000001" class="method-detail"> + <a name="M000001"></a> + + <div class="method-heading"> + <a href="#M000001" class="method-signature"> + <span class="method-name">porter2_tidy</span><span class="method-args">()</span> + </a> + </div> + + <div class="method-description"> + <p> +Tidy up the word before we get down to the algorithm +</p> + <p><a class="source-toggle" href="#" + onclick="toggleCode('M000001-source');return false;">[Source]</a></p> + <div class="method-source-code" id="M000001-source"> +<pre> +<span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 7</span> + <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_tidy</span> + <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> + + <span class="ruby-comment cmt"># map apostrophe-like characters to apostrophes</span> + <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/â/</span>, <span class="ruby-value str">"'"</span>) + <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/â/</span>, <span class="ruby-value str">"'"</span>) + + <span class="ruby-identifier">preword</span> + <span class="ruby-keyword kw">end</span> +</pre> + </div> + </div> + </div> + + <div id="method-M000018" class="method-detail"> + <a name="M000018"></a> + + <div class="method-heading"> + <span class="method-name">stem</span><span class="method-args">(gb_english = false)</span> + </div> + + <div class="method-description"> + <p> +Alias for <a href="String.html#M000016">porter2_stem</a> +</p> + </div> + </div> + + + </div> + + + </div> + + +<div id="validator-badges"> + <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p> +</div> + +</body> +</html> \ No newline at end of file