+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+
+ <title>Class: String</title>
+
+ <link rel="stylesheet" href="./rdoc.css" type="text/css" media="screen" />
+
+ <script src="./js/jquery.js" type="text/javascript"
+ charset="utf-8"></script>
+ <script src="./js/thickbox-compressed.js" type="text/javascript"
+ charset="utf-8"></script>
+ <script src="./js/quicksearch.js" type="text/javascript"
+ charset="utf-8"></script>
+ <script src="./js/darkfish.js" type="text/javascript"
+ charset="utf-8"></script>
+
+</head>
+<body class="class">
+
+ <div id="metadata">
+ <div id="home-metadata">
+ <div id="home-section" class="section">
+ <h3 class="section-header">
+ <a href="./index.html">Home</a>
+ <a href="./index.html#classes">Classes</a>
+ <a href="./index.html#methods">Methods</a>
+ </h3>
+ </div>
+ </div>
+
+ <div id="file-metadata">
+ <div id="file-list-section" class="section">
+ <h3 class="section-header">In Files</h3>
+ <div class="section-body">
+ <ul>
+
+ <li><a href="./lib/porter2stemmer/implementation_rb.html?TB_iframe=true&height=550&width=785"
+ class="thickbox" title="lib/porter2stemmer/implementation.rb">lib/porter2stemmer/implementation.rb</a></li>
+
+ </ul>
+ </div>
+ </div>
+
+
+ </div>
+
+ <div id="class-metadata">
+
+ <!-- Parent Class -->
+
+ <div id="parent-class-section" class="section">
+ <h3 class="section-header">Parent</h3>
+
+ <p class="link">Object</p>
+
+ </div>
+
+
+ <!-- Namespace Contents -->
+
+
+ <!-- Method Quickref -->
+
+ <div id="method-list-section" class="section">
+ <h3 class="section-header">Methods</h3>
+ <ul class="link-list">
+
+ <li><a href="#method-i-porter2_ends_with_short_syllable%3F">#porter2_ends_with_short_syllable?</a></li>
+
+ <li><a href="#method-i-porter2_is_short_word%3F">#porter2_is_short_word?</a></li>
+
+ <li><a href="#method-i-porter2_postprocess">#porter2_postprocess</a></li>
+
+ <li><a href="#method-i-porter2_preprocess">#porter2_preprocess</a></li>
+
+ <li><a href="#method-i-porter2_r1">#porter2_r1</a></li>
+
+ <li><a href="#method-i-porter2_r2">#porter2_r2</a></li>
+
+ <li><a href="#method-i-porter2_stem">#porter2_stem</a></li>
+
+ <li><a href="#method-i-porter2_stem_verbose">#porter2_stem_verbose</a></li>
+
+ <li><a href="#method-i-porter2_step0">#porter2_step0</a></li>
+
+ <li><a href="#method-i-porter2_step1a">#porter2_step1a</a></li>
+
+ <li><a href="#method-i-porter2_step1b">#porter2_step1b</a></li>
+
+ <li><a href="#method-i-porter2_step1c">#porter2_step1c</a></li>
+
+ <li><a href="#method-i-porter2_step2">#porter2_step2</a></li>
+
+ <li><a href="#method-i-porter2_step3">#porter2_step3</a></li>
+
+ <li><a href="#method-i-porter2_step4">#porter2_step4</a></li>
+
+ <li><a href="#method-i-porter2_step5">#porter2_step5</a></li>
+
+ <li><a href="#method-i-porter2_tidy">#porter2_tidy</a></li>
+
+ <li><a href="#method-i-stem">#stem</a></li>
+
+ </ul>
+ </div>
+
+
+ <!-- Included Modules -->
+
+ </div>
+
+ <div id="project-metadata">
+
+
+ <div id="fileindex-section" class="section project-section">
+ <h3 class="section-header">Files</h3>
+ <ul>
+
+ <li class="file"><a href="./README_rdoc.html">README.rdoc</a></li>
+
+ </ul>
+ </div>
+
+
+ <div id="classindex-section" class="section project-section">
+ <h3 class="section-header">Class Index
+ <span class="search-toggle"><img src="./images/find.png"
+ height="16" width="16" alt="[+]"
+ title="show/hide quicksearch" /></span></h3>
+ <form action="#" method="get" accept-charset="utf-8" class="initially-hidden">
+ <fieldset>
+ <legend>Quicksearch</legend>
+ <input type="text" name="quicksearch" value=""
+ class="quicksearch-field" />
+ </fieldset>
+ </form>
+
+ <ul class="link-list">
+
+ <li><a href="./Porter2.html">Porter2</a></li>
+
+ <li><a href="./String.html">String</a></li>
+
+ </ul>
+ <div id="no-class-search-results" style="display: none;">No matching classes.</div>
+ </div>
+
+
+ </div>
+ </div>
+
+ <div id="documentation">
+ <h1 class="class">String</h1>
+
+ <div id="description">
+ <p>
+Implementation of the Porter 2 stemmer. <a
+href="String.html#method-i-porter2_stem">String#porter2_stem</a> is the
+main stemming procedure.
+</p>
+
+ </div>
+
+ <!-- Constants -->
+
+
+ <!-- Attributes -->
+
+
+ <!-- Methods -->
+
+ <div id="public-instance-method-details" class="method-section section">
+ <h3 class="section-header">Public Instance Methods</h3>
+
+
+ <div id="porter-ends-with-short-syllable--method" class="method-detail ">
+ <a name="method-i-porter2_ends_with_short_syllable%3F"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_ends_with_short_syllable?</span><span
+ class="method-args">()</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </div>
+
+ <div class="method-description">
+
+ <p>
+Returns true if the word ends with a short syllable
+</p>
+
+
+
+ <div class="method-source-code"
+ id="porter-ends-with-short-syllable--source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 59</span>
+59: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_ends_with_short_syllable?</span>
+60: <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::SHORT_SYLLABLE}$/</span> <span class="ruby-operator">?</span> <span class="ruby-keyword kw">true</span> <span class="ruby-operator">:</span> <span class="ruby-keyword kw">false</span>
+61: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="porter-is-short-word--method" class="method-detail ">
+ <a name="method-i-porter2_is_short_word%3F"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_is_short_word?</span><span
+ class="method-args">()</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </div>
+
+ <div class="method-description">
+
+ <p>
+A word is short if it ends in a short syllable, and R1 is null
+</p>
+
+
+
+ <div class="method-source-code"
+ id="porter-is-short-word--source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 65</span>
+65: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_is_short_word?</span>
+66: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_ends_with_short_syllable?</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span>.<span class="ruby-identifier">empty?</span>
+67: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="porter-postprocess-method" class="method-detail ">
+ <a name="method-i-porter2_postprocess"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_postprocess</span><span
+ class="method-args">()</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </div>
+
+ <div class="method-description">
+
+ <p>
+Turn all Y letters into y
+</p>
+
+
+
+ <div class="method-source-code"
+ id="porter-postprocess-source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 261</span>
+261: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_postprocess</span>
+262: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-regexp re">/Y/</span>, <span class="ruby-value str">'y'</span>)
+263: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="porter-preprocess-method" class="method-detail ">
+ <a name="method-i-porter2_preprocess"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_preprocess</span><span
+ class="method-args">()</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </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>
+
+
+
+ <div class="method-source-code"
+ id="porter-preprocess-source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 25</span>
+25: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_preprocess</span>
+26: <span class="ruby-identifier">w</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">dup</span>
+27:
+28: <span class="ruby-comment cmt"># remove any initial apostrophe</span>
+29: <span class="ruby-identifier">w</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/^'*(.)/</span>, <span class="ruby-value str">'\1'</span>)
+30:
+31: <span class="ruby-comment cmt"># set initial y, or y after a vowel, to Y</span>
+32: <span class="ruby-identifier">w</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/^y/</span>, <span class="ruby-value str">"Y"</span>)
+33: <span class="ruby-identifier">w</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-node">/(#{Porter2::V})y/</span>, <span class="ruby-value str">'\1Y'</span>)
+34:
+35: <span class="ruby-identifier">w</span>
+36: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="porter-r--method" class="method-detail ">
+ <a name="method-i-porter2_r1"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_r1</span><span
+ class="method-args">()</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </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>
+
+
+
+ <div class="method-source-code"
+ id="porter-r--source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 41</span>
+41: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_r1</span>
+42: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^(gener|commun|arsen)(?<r1>.*)/</span>
+43: <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">last_match</span>(<span class="ruby-value">:r1</span>)
+44: <span class="ruby-keyword kw">else</span>
+45: <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::V}#{Porter2::C}(?<r1>.*)$/</span>
+46: <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">last_match</span>(<span class="ruby-value">:r1</span>) <span class="ruby-operator">||</span> <span class="ruby-value str">""</span>
+47: <span class="ruby-keyword kw">end</span>
+48: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="porter-r--method" class="method-detail ">
+ <a name="method-i-porter2_r2"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_r2</span><span
+ class="method-args">()</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </div>
+
+ <div class="method-description">
+
+ <p>
+R2 is the portion of R1 (<a
+href="String.html#method-i-porter2_r1">porter2_r1</a>) after the first
+non-vowel after the first vowel
+</p>
+
+
+
+ <div class="method-source-code"
+ id="porter-r--source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 52</span>
+52: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_r2</span>
+53: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::V}#{Porter2::C}(?<r2>.*)$/</span>
+54: <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">last_match</span>(<span class="ruby-value">:r2</span>) <span class="ruby-operator">||</span> <span class="ruby-value str">""</span>
+55: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="porter-stem-method" class="method-detail ">
+ <a name="method-i-porter2_stem"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_stem</span><span
+ class="method-args">(gb_english = false)</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </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>
+
+
+
+ <div class="method-source-code"
+ id="porter-stem-source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 269</span>
+269: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_stem</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
+270: <span class="ruby-identifier">preword</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_tidy</span>
+271: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">preword</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator"><=</span> <span class="ruby-value">2</span>
+272:
+273: <span class="ruby-identifier">word</span> = <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">porter2_preprocess</span>
+274:
+275: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">SPECIAL_CASES</span>.<span class="ruby-identifier">has_key?</span> <span class="ruby-identifier">word</span>
+276: <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">SPECIAL_CASES</span>[<span class="ruby-identifier">word</span>]
+277: <span class="ruby-keyword kw">else</span>
+278: <span class="ruby-identifier">w1a</span> = <span class="ruby-identifier">word</span>.<span class="ruby-identifier">porter2_step0</span>.<span class="ruby-identifier">porter2_step1a</span>
+279: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">STEP_1A_SPECIAL_CASES</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">w1a</span>
+280: <span class="ruby-identifier">w1a</span>
+281: <span class="ruby-keyword kw">else</span>
+282: <span class="ruby-identifier">w1a</span>.<span class="ruby-identifier">porter2_step1b</span>(<span class="ruby-identifier">gb_english</span>).<span class="ruby-identifier">porter2_step1c</span>.<span class="ruby-identifier">porter2_step2</span>(<span class="ruby-identifier">gb_english</span>).<span class="ruby-identifier">porter2_step3</span>(<span class="ruby-identifier">gb_english</span>).<span class="ruby-identifier">porter2_step4</span>(<span class="ruby-identifier">gb_english</span>).<span class="ruby-identifier">porter2_step5</span>.<span class="ruby-identifier">porter2_postprocess</span>
+283: <span class="ruby-keyword kw">end</span>
+284: <span class="ruby-keyword kw">end</span>
+285: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+ <div class="aliases">
+ Also aliased as: <a href="String.html#method-i-stem">stem</a>
+ </div>
+
+
+
+ </div>
+
+
+ <div id="porter-stem-verbose-method" class="method-detail ">
+ <a name="method-i-porter2_stem_verbose"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_stem_verbose</span><span
+ class="method-args">(gb_english = false)</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </div>
+
+ <div class="method-description">
+
+ <p>
+A verbose version of <a
+href="String.html#method-i-porter2_stem">porter2_stem</a> that prints the
+output of each stage to STDOUT
+</p>
+
+
+
+ <div class="method-source-code"
+ id="porter-stem-verbose-source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 288</span>
+288: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_stem_verbose</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
+289: <span class="ruby-identifier">preword</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_tidy</span>
+290: <span class="ruby-identifier">puts</span> <span class="ruby-node">"Preword: #{preword}"</span>
+291: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">preword</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator"><=</span> <span class="ruby-value">2</span>
+292:
+293: <span class="ruby-identifier">word</span> = <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">porter2_preprocess</span>
+294: <span class="ruby-identifier">puts</span> <span class="ruby-node">"Preprocessed: #{word}"</span>
+295:
+296: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">SPECIAL_CASES</span>.<span class="ruby-identifier">has_key?</span> <span class="ruby-identifier">word</span>
+297: <span class="ruby-identifier">puts</span> <span class="ruby-node">"Returning #{word} as special case #{Porter2::SPECIAL_CASES[word]}"</span>
+298: <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">SPECIAL_CASES</span>[<span class="ruby-identifier">word</span>]
+299: <span class="ruby-keyword kw">else</span>
+300: <span class="ruby-identifier">r1</span> = <span class="ruby-identifier">word</span>.<span class="ruby-identifier">porter2_r1</span>
+301: <span class="ruby-identifier">r2</span> = <span class="ruby-identifier">word</span>.<span class="ruby-identifier">porter2_r2</span>
+302: <span class="ruby-identifier">puts</span> <span class="ruby-node">"R1 = #{r1}, R2 = #{r2}"</span>
+303:
+304: <span class="ruby-identifier">w0</span> = <span class="ruby-identifier">word</span>.<span class="ruby-identifier">porter2_step0</span> ; <span class="ruby-identifier">puts</span> <span class="ruby-node">"After step 0: #{w0} (R1 = #{w0.porter2_r1}, R2 = #{w0.porter2_r2})"</span>
+305: <span class="ruby-identifier">w1a</span> = <span class="ruby-identifier">w0</span>.<span class="ruby-identifier">porter2_step1a</span> ; <span class="ruby-identifier">puts</span> <span class="ruby-node">"After step 1a: #{w1a} (R1 = #{w1a.porter2_r1}, R2 = #{w1a.porter2_r2})"</span>
+306:
+307: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">STEP_1A_SPECIAL_CASES</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">w1a</span>
+308: <span class="ruby-identifier">puts</span> <span class="ruby-node">"Returning #{w1a} as 1a special case"</span>
+309: <span class="ruby-identifier">w1a</span>
+310: <span class="ruby-keyword kw">else</span>
+311: <span class="ruby-identifier">w1b</span> = <span class="ruby-identifier">w1a</span>.<span class="ruby-identifier">porter2_step1b</span>(<span class="ruby-identifier">gb_english</span>) ; <span class="ruby-identifier">puts</span> <span class="ruby-node">"After step 1b: #{w1b} (R1 = #{w1b.porter2_r1}, R2 = #{w1b.porter2_r2})"</span>
+312: <span class="ruby-identifier">w1c</span> = <span class="ruby-identifier">w1b</span>.<span class="ruby-identifier">porter2_step1c</span> ; <span class="ruby-identifier">puts</span> <span class="ruby-node">"After step 1c: #{w1c} (R1 = #{w1c.porter2_r1}, R2 = #{w1c.porter2_r2})"</span>
+313: <span class="ruby-identifier">w2</span> = <span class="ruby-identifier">w1c</span>.<span class="ruby-identifier">porter2_step2</span>(<span class="ruby-identifier">gb_english</span>) ; <span class="ruby-identifier">puts</span> <span class="ruby-node">"After step 2: #{w2} (R1 = #{w2.porter2_r1}, R2 = #{w2.porter2_r2})"</span>
+314: <span class="ruby-identifier">w3</span> = <span class="ruby-identifier">w2</span>.<span class="ruby-identifier">porter2_step3</span>(<span class="ruby-identifier">gb_english</span>) ; <span class="ruby-identifier">puts</span> <span class="ruby-node">"After step 3: #{w3} (R1 = #{w3.porter2_r1}, R2 = #{w3.porter2_r2})"</span>
+315: <span class="ruby-identifier">w4</span> = <span class="ruby-identifier">w3</span>.<span class="ruby-identifier">porter2_step4</span>(<span class="ruby-identifier">gb_english</span>) ; <span class="ruby-identifier">puts</span> <span class="ruby-node">"After step 4: #{w4} (R1 = #{w4.porter2_r1}, R2 = #{w4.porter2_r2})"</span>
+316: <span class="ruby-identifier">w5</span> = <span class="ruby-identifier">w4</span>.<span class="ruby-identifier">porter2_step5</span> ; <span class="ruby-identifier">puts</span> <span class="ruby-node">"After step 5: #{w5}"</span>
+317: <span class="ruby-identifier">wpost</span> = <span class="ruby-identifier">w5</span>.<span class="ruby-identifier">porter2_postprocess</span> ; <span class="ruby-identifier">puts</span> <span class="ruby-node">"After postprocess: #{wpost}"</span>
+318: <span class="ruby-identifier">wpost</span>
+319: <span class="ruby-keyword kw">end</span>
+320: <span class="ruby-keyword kw">end</span>
+321: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="porter-step--method" class="method-detail ">
+ <a name="method-i-porter2_step0"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_step0</span><span
+ class="method-args">()</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </div>
+
+ <div class="method-description">
+
+ <p>
+Search for the longest among the suffixes,
+</p>
+<ul>
+<li><p>
+‘
+</p>
+</li>
+<li><p>
+’s
+</p>
+</li>
+<li><p>
+’s’
+</p>
+</li>
+</ul>
+<p>
+and remove if found.
+</p>
+
+
+
+ <div class="method-source-code"
+ id="porter-step--source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 75</span>
+75: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step0</span>
+76: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub!</span>(<span class="ruby-regexp re">/(.)('s'|'s|')$/</span>, <span class="ruby-value str">'\1'</span>) <span class="ruby-operator">||</span> <span class="ruby-keyword kw">self</span>
+77: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="porter-step-a-method" class="method-detail ">
+ <a name="method-i-porter2_step1a"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_step1a</span><span
+ class="method-args">()</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </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><p>
+replace by ss
+</p>
+</td></tr>
+<tr><td valign="top">ied, ies</td><td><p>
+replace by i if preceded by more than one letter, otherwise by ie
+</p>
+</td></tr>
+<tr><td valign="top">s</td><td><p>
+delete if the preceding word part contains a vowel not immediately before
+the s
+</p>
+</td></tr>
+<tr><td valign="top">us, ss</td><td><p>
+do nothing
+</p>
+</td></tr>
+</table>
+
+
+
+ <div class="method-source-code"
+ id="porter-step-a-source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 85</span>
+ 85: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step1a</span>
+ 86: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/sses$/</span>
+ 87: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/sses$/</span>, <span class="ruby-value str">'ss'</span>)
+ 88: <span class="ruby-keyword kw">elsif</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/..(ied|ies)$/</span>
+ 89: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/(ied|ies)$/</span>, <span class="ruby-value str">'i'</span>)
+ 90: <span class="ruby-keyword kw">elsif</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/(ied|ies)$/</span>
+ 91: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/(ied|ies)$/</span>, <span class="ruby-value str">'ie'</span>)
+ 92: <span class="ruby-keyword kw">elsif</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/(us|ss)$/</span>
+ 93: <span class="ruby-keyword kw">self</span>
+ 94: <span class="ruby-keyword kw">elsif</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/s$/</span>
+ 95: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/(#{Porter2::V}.+)s$/</span>
+ 96: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/s$/</span>, <span class="ruby-value str">''</span>)
+ 97: <span class="ruby-keyword kw">else</span>
+ 98: <span class="ruby-keyword kw">self</span>
+ 99: <span class="ruby-keyword kw">end</span>
+100: <span class="ruby-keyword kw">else</span>
+101: <span class="ruby-keyword kw">self</span>
+102: <span class="ruby-keyword kw">end</span>
+103: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="porter-step-b-method" class="method-detail ">
+ <a name="method-i-porter2_step1b"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_step1b</span><span
+ class="method-args">(gb_english = false)</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </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><p>
+replace by ee if the suffix is also in R1
+</p>
+</td></tr>
+<tr><td valign="top">ed, edly, ing, ingly</td><td><p>
+delete if the preceding word part contains a vowel and, after the
+deletion:
+</p>
+<ul>
+<li><p>
+if the word ends at, bl or iz: add e, or
+</p>
+</li>
+</ul>
+<ul>
+<li><p>
+if the word ends with a double: remove the last letter, or
+</p>
+</li>
+</ul>
+<ul>
+<li><p>
+if the word is short: add e
+</p>
+</li>
+</ul>
+</td></tr>
+</table>
+<p>
+(If gb_english is <tt>true</tt>, treat the ‘is’ suffix as
+‘iz’ above.)
+</p>
+
+
+
+ <div class="method-source-code"
+ id="porter-step-b-source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 115</span>
+115: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step1b</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
+116: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/(eed|eedly)$/</span>
+117: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/(eed|eedly)$/</span>
+118: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/(eed|eedly)$/</span>, <span class="ruby-value str">'ee'</span>)
+119: <span class="ruby-keyword kw">else</span>
+120: <span class="ruby-keyword kw">self</span>
+121: <span class="ruby-keyword kw">end</span>
+122: <span class="ruby-keyword kw">else</span>
+123: <span class="ruby-identifier">w</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">dup</span>
+124: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">w</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::V}.*(ed|edly|ing|ingly)$/</span>
+125: <span class="ruby-identifier">w</span>.<span class="ruby-identifier">sub!</span>(<span class="ruby-regexp re">/(ed|edly|ing|ingly)$/</span>, <span class="ruby-value str">''</span>)
+126: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">w</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/(at|lb|iz)$/</span>
+127: <span class="ruby-identifier">w</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">'e'</span>
+128: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">w</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/is$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">gb_english</span>
+129: <span class="ruby-identifier">w</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">'e'</span>
+130: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">w</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::Double}$/</span>
+131: <span class="ruby-identifier">w</span>.<span class="ruby-identifier">chop!</span>
+132: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">w</span>.<span class="ruby-identifier">porter2_is_short_word?</span>
+133: <span class="ruby-identifier">w</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">'e'</span>
+134: <span class="ruby-keyword kw">end</span>
+135: <span class="ruby-keyword kw">end</span>
+136: <span class="ruby-identifier">w</span>
+137: <span class="ruby-keyword kw">end</span>
+138: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="porter-step-c-method" class="method-detail ">
+ <a name="method-i-porter2_step1c"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_step1c</span><span
+ class="method-args">()</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </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>
+
+
+
+ <div class="method-source-code"
+ id="porter-step-c-source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 143</span>
+143: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step1c</span>
+144: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/.+#{Porter2::C}(y|Y)$/</span>
+145: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/(y|Y)$/</span>, <span class="ruby-value str">'i'</span>)
+146: <span class="ruby-keyword kw">else</span>
+147: <span class="ruby-keyword kw">self</span>
+148: <span class="ruby-keyword kw">end</span>
+149: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="porter-step--method" class="method-detail ">
+ <a name="method-i-porter2_step2"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_step2</span><span
+ class="method-args">(gb_english = false)</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </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>
+
+
+
+ <div class="method-source-code"
+ id="porter-step--source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 160</span>
+160: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step2</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
+161: <span class="ruby-identifier">r1</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span>
+162: <span class="ruby-identifier">s2m</span> = <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">STEP_2_MAPS</span>.<span class="ruby-identifier">dup</span>
+163: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">gb_english</span>
+164: <span class="ruby-identifier">s2m</span>[<span class="ruby-value str">"iser"</span>] = <span class="ruby-value str">"ise"</span>
+165: <span class="ruby-identifier">s2m</span>[<span class="ruby-value str">"isation"</span>] = <span class="ruby-value str">"ise"</span>
+166: <span class="ruby-keyword kw">end</span>
+167: <span class="ruby-identifier">step_2_re</span> = <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">union</span>(<span class="ruby-identifier">s2m</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">map</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">r</span> <span class="ruby-operator">+</span> <span class="ruby-value str">"$"</span>)})
+168: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-identifier">step_2_re</span>
+169: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">r1</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{$&}$/</span>
+170: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-node">/#{$&}$/</span>, <span class="ruby-identifier">s2m</span>[<span class="ruby-node">$&</span>])
+171: <span class="ruby-keyword kw">else</span>
+172: <span class="ruby-keyword kw">self</span>
+173: <span class="ruby-keyword kw">end</span>
+174: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">r1</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/li$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/(#{Porter2::Valid_LI})li$/</span>
+175: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/li$/</span>, <span class="ruby-value str">''</span>)
+176: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">r1</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/ogi$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/logi$/</span>
+177: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/ogi$/</span>, <span class="ruby-value str">'og'</span>)
+178: <span class="ruby-keyword kw">else</span>
+179: <span class="ruby-keyword kw">self</span>
+180: <span class="ruby-keyword kw">end</span>
+181: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="porter-step--method" class="method-detail ">
+ <a name="method-i-porter2_step3"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_step3</span><span
+ class="method-args">(gb_english = false)</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </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>
+
+
+
+ <div class="method-source-code"
+ id="porter-step--source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 192</span>
+192: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step3</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
+193: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/ative$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r2</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/ative$/</span>
+194: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/ative$/</span>, <span class="ruby-value str">''</span>)
+195: <span class="ruby-keyword kw">else</span>
+196: <span class="ruby-identifier">s3m</span> = <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">STEP_3_MAPS</span>.<span class="ruby-identifier">dup</span>
+197: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">gb_english</span>
+198: <span class="ruby-identifier">s3m</span>[<span class="ruby-value str">"alise"</span>] = <span class="ruby-value str">"al"</span>
+199: <span class="ruby-keyword kw">end</span>
+200: <span class="ruby-identifier">step_3_re</span> = <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">union</span>(<span class="ruby-identifier">s3m</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">map</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">r</span> <span class="ruby-operator">+</span> <span class="ruby-value str">"$"</span>)})
+201: <span class="ruby-identifier">r1</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span>
+202: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-identifier">step_3_re</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">r1</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{$&}$/</span>
+203: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-node">/#{$&}$/</span>, <span class="ruby-identifier">s3m</span>[<span class="ruby-node">$&</span>])
+204: <span class="ruby-keyword kw">else</span>
+205: <span class="ruby-keyword kw">self</span>
+206: <span class="ruby-keyword kw">end</span>
+207: <span class="ruby-keyword kw">end</span>
+208: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="porter-step--method" class="method-detail ">
+ <a name="method-i-porter2_step4"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_step4</span><span
+ class="method-args">(gb_english = false)</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </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>
+
+
+
+ <div class="method-source-code"
+ id="porter-step--source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 218</span>
+218: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step4</span>(<span class="ruby-identifier">gb_english</span> = <span class="ruby-keyword kw">false</span>)
+219: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r2</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/ion$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/(s|t)ion$/</span>
+220: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/ion$/</span>, <span class="ruby-value str">''</span>)
+221: <span class="ruby-keyword kw">else</span>
+222: <span class="ruby-identifier">s4m</span> = <span class="ruby-constant">Porter2</span><span class="ruby-operator">::</span><span class="ruby-constant">STEP_4_MAPS</span>.<span class="ruby-identifier">dup</span>
+223: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">gb_english</span>
+224: <span class="ruby-identifier">s4m</span>[<span class="ruby-value str">"ise"</span>] = <span class="ruby-value str">""</span>
+225: <span class="ruby-keyword kw">end</span>
+226: <span class="ruby-identifier">step_4_re</span> = <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">union</span>(<span class="ruby-identifier">s4m</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">map</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">r</span> <span class="ruby-operator">+</span> <span class="ruby-value str">"$"</span>)})
+227: <span class="ruby-identifier">r2</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r2</span>
+228: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-identifier">step_4_re</span>
+229: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">r2</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{$&}/</span>
+230: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-node">/#{$&}$/</span>, <span class="ruby-identifier">s4m</span>[<span class="ruby-node">$&</span>])
+231: <span class="ruby-keyword kw">else</span>
+232: <span class="ruby-keyword kw">self</span>
+233: <span class="ruby-keyword kw">end</span>
+234: <span class="ruby-keyword kw">else</span>
+235: <span class="ruby-keyword kw">self</span>
+236: <span class="ruby-keyword kw">end</span>
+237: <span class="ruby-keyword kw">end</span>
+238: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="porter-step--method" class="method-detail ">
+ <a name="method-i-porter2_step5"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_step5</span><span
+ class="method-args">()</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </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><p>
+delete if in R2, or in R1 and not preceded by a short syllable
+</p>
+</td></tr>
+<tr><td valign="top">l</td><td><p>
+delete if in R2 and preceded by l
+</p>
+</td></tr>
+</table>
+
+
+
+ <div class="method-source-code"
+ id="porter-step--source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 244</span>
+244: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_step5</span>
+245: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/ll$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r2</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/l$/</span>
+246: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/ll$/</span>, <span class="ruby-value str">'l'</span>)
+247: <span class="ruby-keyword kw">elsif</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/e$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r2</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/e$/</span>
+248: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/e$/</span>, <span class="ruby-value str">''</span>)
+249: <span class="ruby-keyword kw">else</span>
+250: <span class="ruby-identifier">r1</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">porter2_r1</span>
+251: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/e$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">r1</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/e$/</span> <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">not</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{Porter2::SHORT_SYLLABLE}e$/</span>
+252: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/e$/</span>, <span class="ruby-value str">''</span>)
+253: <span class="ruby-keyword kw">else</span>
+254: <span class="ruby-keyword kw">self</span>
+255: <span class="ruby-keyword kw">end</span>
+256: <span class="ruby-keyword kw">end</span>
+257: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="porter-tidy-method" class="method-detail ">
+ <a name="method-i-porter2_tidy"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">porter2_tidy</span><span
+ class="method-args">()</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </div>
+
+ <div class="method-description">
+
+ <p>
+Tidy up the word before we get down to the algorithm
+</p>
+
+
+
+ <div class="method-source-code"
+ id="porter-tidy-source">
+<pre>
+ <span class="ruby-comment cmt"># File lib/porter2stemmer/implementation.rb, line 7</span>
+ 7: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">porter2_tidy</span>
+ 8: <span class="ruby-identifier">preword</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">strip</span>.<span class="ruby-identifier">downcase</span>
+ 9:
+10: <span class="ruby-comment cmt"># map apostrophe-like characters to apostrophes</span>
+11: <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/‘/</span>, <span class="ruby-value str">"'"</span>)
+12: <span class="ruby-identifier">preword</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/’/</span>, <span class="ruby-value str">"'"</span>)
+13:
+14: <span class="ruby-identifier">preword</span>
+15: <span class="ruby-keyword kw">end</span></pre>
+ </div>
+
+ </div>
+
+
+
+
+ </div>
+
+
+ <div id="stem-method" class="method-detail method-alias">
+ <a name="method-i-stem"></a>
+
+ <div class="method-heading">
+
+ <span class="method-name">stem</span><span
+ class="method-args">(gb_english = false)</span>
+ <span class="method-click-advice">click to toggle source</span>
+
+ </div>
+
+ <div class="method-description">
+
+
+
+
+
+ </div>
+
+
+
+
+ <div class="aliases">
+ Alias for: <a href="String.html#method-i-porter2_stem">porter2_stem</a>
+ </div>
+
+ </div>
+
+
+ </div>
+
+
+ </div>
+
+
+ <div id="rdoc-debugging-section-dump" class="debugging-section">
+
+ <p>Disabled; run with --debug to generate this.</p>
+
+ </div>
+
+ <div id="validator-badges">
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
+ <p><small>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish
+ Rdoc Generator</a> 1.1.6</small>.</p>
+ </div>
+
+</body>
+</html>
+