I18N_Arabic
[ class tree: I18N_Arabic ] [ index: I18N_Arabic ] [ all elements ]

Source for file AutoSummarize.php

Documentation is available at AutoSummarize.php

  1. <?php
  2. /**
  3.  * ----------------------------------------------------------------------
  4.  *  
  5.  * Copyright (c) 2006-2016 Khaled Al-Sham'aa.
  6.  *  
  7.  * http://www.ar-php.org
  8.  *  
  9.  * PHP Version 5
  10.  *  
  11.  * ----------------------------------------------------------------------
  12.  *  
  13.  * LICENSE
  14.  *
  15.  * This program is open source product; you can redistribute it and/or
  16.  * modify it under the terms of the GNU Lesser General Public License (LGPL)
  17.  * as published by the Free Software Foundation; either version 3
  18.  * of the License, or (at your option) any later version.
  19.  *  
  20.  * This program is distributed in the hope that it will be useful,
  21.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23.  * GNU Lesser General Public License for more details.
  24.  *  
  25.  * You should have received a copy of the GNU Lesser General Public License
  26.  * along with this program.  If not, see <http://www.gnu.org/licenses/lgpl.txt>.
  27.  *  
  28.  * ----------------------------------------------------------------------
  29.  *  
  30.  * Class Name: Arabic Auto Summarize Class
  31.  *  
  32.  * Filename: AutoSummarize.php
  33.  *  
  34.  * Original Author(s): Khaled Al-Sham'aa <khaled@ar-php.org>
  35.  *  
  36.  * Purpose: Automatic keyphrase extraction to provide a quick mini-summary
  37.  *          for a long Arabic document.
  38.  *           
  39.  * ----------------------------------------------------------------------
  40.  *  
  41.  * Arabic Auto Summarize
  42.  *
  43.  * This class identifies the key points in an Arabic document for you to share with
  44.  * others or quickly scan. The class determines key points by analyzing an Arabic
  45.  * document and assigning a score to each sentence. Sentences that contain words
  46.  * used frequently in the document are given a higher score. You can then choose a
  47.  * percentage of the highest-scoring sentences to display in the summary.
  48.  * "ArAutoSummarize" class works best on well-structured documents such as reports,
  49.  * articles, and scientific papers.
  50.  * 
  51.  * "ArAutoSummarize" class cuts wordy copy to the bone by counting words and ranking
  52.  * sentences. First, "ArAutoSummarize" class identifies the most common words in the
  53.  * document and assigns a "score" to each word--the more frequently a word is used,
  54.  * the higher the score.
  55.  * 
  56.  * Then, it "averages" each sentence by adding the scores of its words and dividing
  57.  * the sum by the number of words in the sentence--the higher the average, the
  58.  * higher the rank of the sentence. "ArAutoSummarize" class can summarize texts to
  59.  * specific number of sentences or percentage of the original copy.
  60.  * 
  61.  * We use statistical approach, with some attention apparently paid to:
  62.  * 
  63.  * - Location: leading sentences of paragraph, title, introduction, and conclusion.
  64.  * - Fixed phrases: in-text summaries.
  65.  * - Frequencies of words, phrases, proper names
  66.  * - Contextual material: query, title, headline, initial paragraph
  67.  * 
  68.  * The motivation for this class is the range of applications for key phrases:
  69.  * 
  70.  * - Mini-summary: Automatic key phrase extraction can provide a quick mini-summary
  71.  *   for a long document. For example, it could be a feature in a web sites; just
  72.  *   click the summarize button when browsing a long web page.
  73.  * 
  74.  * - Highlights: It can highlight key phrases in a long document, to facilitate
  75.  *   skimming the document.
  76.  * 
  77.  * - Author Assistance: Automatic key phrase extraction can help an author or editor
  78.  *   who wants to supply a list of key phrases for a document. For example, the
  79.  *   administrator of a web site might want to have a key phrase list at the top of
  80.  *   each web page. The automatically extracted phrases can be a starting point for
  81.  *   further manual refinement by the author or editor.
  82.  * 
  83.  * - Text Compression: On a device with limited display capacity or limited
  84.  *   bandwidth, key phrases can be a substitute for the full text. For example, an
  85.  *   email message could be reduced to a set of key phrases for display on a pager;
  86.  *   a web page could be reduced for display on a portable wireless web browser.
  87.  * 
  88.  * This list is not intended to be exhaustive, and there may be some overlap in
  89.  * the items.
  90.  *
  91.  * Example:
  92.  * <code>
  93.  * include('./I18N/Arabic.php');
  94.  * $obj = new I18N_Arabic('AutoSummarize');
  95.  * 
  96.  * $file = 'Examples/Articles/Ajax.txt';
  97.  * $r = 20;
  98.  * 
  99.  * // get contents of a file into a string
  100.  * $fhandle = fopen($file, "r");
  101.  * $c = fread($fhandle, filesize($file));
  102.  * fclose($fhandle);
  103.  * 
  104.  * $k = $obj->getMetaKeywords($c, $r);
  105.  * echo '<b><font color=#FFFF00>';
  106.  * echo 'Keywords:</font></b>';
  107.  * echo '<p dir="rtl" align="justify">';
  108.  * echo $k . '</p>';
  109.  * 
  110.  * $s = $obj->doRateSummarize($c, $r);
  111.  * echo '<b><font color=#FFFF00>';
  112.  * echo 'Summary:</font></b>';
  113.  * echo '<p dir="rtl" align="justify">';
  114.  * echo $s . '</p>';
  115.  * 
  116.  * echo '<b><font color=#FFFF00>';
  117.  * echo 'Full Text:</font></b>';
  118.  * echo '<p><a class=ar_link target=_blank ';
  119.  * echo 'href='.$file.'>Source File</a></p>';
  120.  * </code>
  121.  *             
  122.  * @category  I18N
  123.  * @package   I18N_Arabic
  124.  * @author    Khaled Al-Sham'aa <khaled@ar-php.org>
  125.  * @copyright 2006-2016 Khaled Al-Sham'aa
  126.  *    
  127.  * @license   LGPL <http://www.gnu.org/licenses/lgpl.txt>
  128.  * @link      http://www.ar-php.org
  129.  */
  130.  
  131. /**
  132.  * This PHP class do automatic keyphrase extraction to provide a quick
  133.  * mini-summary for a long Arabic document
  134.  *  
  135.  * @category  I18N
  136.  * @package   I18N_Arabic
  137.  * @author    Khaled Al-Sham'aa <khaled@ar-php.org>
  138.  * @copyright 2006-2016 Khaled Al-Sham'aa
  139.  *    
  140.  * @license   LGPL <http://www.gnu.org/licenses/lgpl.txt>
  141.  * @link      http://www.ar-php.org
  142.  */ 
  143. {
  144.     private $_normalizeAlef       array('أ','إ','آ');
  145.     private $_normalizeDiacritics array('َ','ً','ُ','ٌ','ِ','ٍ','ْ','ّ');
  146.  
  147.     private $_commonChars array('ة','ه','ي','ن','و','ت','ل','ا','س','م',
  148.                                    'e''t''a''o''i''n''s');
  149.  
  150.     private $_separators array('.',"\n",'،','؛','(','[','{',')',']','}',',',';');
  151.  
  152.     private $_commonWords    array();
  153.     private $_importantWords array();
  154.  
  155.     /**
  156.      * Loads initialize values
  157.      *
  158.      * @ignore
  159.      */         
  160.     public function __construct()
  161.     {
  162.         // This common words used in cleanCommon method
  163.         $words    file(dirname(__FILE__).'/data/ar-stopwords.txt');
  164.         $en_words file(dirname(__FILE__).'/data/en-stopwords.txt');
  165.  
  166.         $words array_merge($words$en_words);
  167.         $words array_map('trim'$words);
  168.         
  169.         $this->_commonWords $words;
  170.         
  171.         // This important words used in rankSentences method
  172.         $words file(dirname(__FILE__).'/data/important-words.txt');
  173.         $words array_map('trim'$words);
  174.  
  175.         $this->_importantWords $words;
  176.     }
  177.     
  178.     /**
  179.      * Load enhanced Arabic stop words list
  180.      * 
  181.      * @return void 
  182.      */         
  183.     public function loadExtra()
  184.     {
  185.         $extra_words file(dirname(__FILE__).'/data/ar-extra-stopwords.txt');
  186.         $extra_words array_map('trim'$extra_words);
  187.  
  188.         $this->_commonWords array_merge($this->_commonWords$extra_words);
  189.     }
  190.  
  191.     /**
  192.      * Core summarize function that implement required steps in the algorithm
  193.      *                        
  194.      * @param string  $str      Input Arabic document as a string
  195.      * @param string  $keywords List of keywords higlited by search process
  196.      * @param integer $int      Sentences value (see $mode effect also)
  197.      * @param string  $mode     Mode of sentences count [number|rate]
  198.      * @param string  $output   Output mode [summary|highlight]
  199.      * @param string  $style    Name of the CSS class you would like to apply
  200.      *                    
  201.      * @return string Output summary requested
  202.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  203.      */
  204.     protected function summarize($str$keywords$int$mode$output$style=null)
  205.     {
  206.         preg_match_all(
  207.             "/[^\.\n\،\؛\,\;](.+?)[\.\n\،\؛\,\;]/u"
  208.             $str
  209.             $sentences
  210.         );
  211.         $_sentences $sentences[0];
  212.  
  213.         if ($mode == 'rate'{
  214.             $str            preg_replace("/\s{2,}/u"' '$str);
  215.             $totalChars     mb_strlen($str);
  216.             $totalSentences count($_sentences);
  217.  
  218.             $maxChars round($int $totalChars 100);
  219.             $int      round($int $totalSentences 100);
  220.         else {
  221.             $maxChars 99999;
  222.         }
  223.         
  224.         $summary '';
  225.  
  226.         $str           strip_tags($str);
  227.         $normalizedStr $this->doNormalize($str);
  228.         $cleanedStr    $this->cleanCommon($normalizedStr);
  229.         $stemStr       $this->draftStem($cleanedStr);
  230.         
  231.         preg_match_all(
  232.             "/[^\.\n\،\؛\,\;](.+?)[\.\n\،\؛\,\;]/u"
  233.             $stemStr
  234.             $sentences
  235.         );
  236.         $_stemmedSentences $sentences[0];
  237.  
  238.         $wordRanks $this->rankWords($stemStr);
  239.         
  240.         if ($keywords{
  241.             $keywords $this->doNormalize($keywords);
  242.             $keywords $this->draftStem($keywords);
  243.             $words    explode(' '$keywords);
  244.             
  245.             foreach ($words as $word{
  246.                 $wordRanks[$word1000;
  247.             }
  248.         }
  249.         
  250.         $sentencesRanks $this->rankSentences(
  251.             $_sentences
  252.             $_stemmedSentences
  253.             $wordRanks
  254.         );
  255.         
  256.         list($sentences$ranks$sentencesRanks;
  257.  
  258.         $minRank $this->minAcceptedRank($sentences$ranks$int$maxChars);
  259.  
  260.         $totalSentences count($ranks);
  261.         
  262.         for ($i 0$i $totalSentences$i++{
  263.             if ($sentencesRanks[1][$i>= $minRank{
  264.                 if ($output == 'summary'{
  265.                     $summary .= ' '.$sentencesRanks[0][$i];
  266.                 else {
  267.                     $summary .= '<span class="' $style .'">' 
  268.                                 $sentencesRanks[0][$i'</span>';
  269.                 }
  270.             else {
  271.                 if ($output == 'highlight'{
  272.                     $summary .= $sentencesRanks[0][$i];
  273.                 }
  274.             }
  275.         }
  276.         
  277.         if ($output == 'highlight'{
  278.             $summary str_replace("\n"'<br />'$summary);
  279.         }
  280.         
  281.         return $summary;
  282.     }
  283.           
  284.     /**
  285.      * Summarize input Arabic string (document content) into specific number of
  286.      * sentences in the output
  287.      *                        
  288.      * @param string  $str      Input Arabic document as a string
  289.      * @param integer $int      Number of sentences required in output summary
  290.      * @param string  $keywords List of keywords higlited by search process
  291.      *                    
  292.      * @return string Output summary requested
  293.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  294.      */
  295.     public function doSummarize($str$int$keywords)
  296.     {
  297.         $summary $this->summarize(
  298.             $str$keywords$int'number''summary'$style
  299.         );
  300.         
  301.         return $summary;
  302.     }
  303.     
  304.     /**
  305.      * Summarize percentage of the input Arabic string (document content) into output
  306.      *      
  307.      * @param string  $str      Input Arabic document as a string
  308.      * @param integer $rate     Rate of output summary sentence number as
  309.      *                           percentage of the input Arabic string
  310.      *                           (document content)
  311.      * @param string  $keywords List of keywords higlited by search process
  312.      *                    
  313.      * @return string Output summary requested
  314.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  315.      */
  316.     public function doRateSummarize($str$rate$keywords)
  317.     {
  318.         $summary $this->summarize(
  319.             $str$keywords$rate'rate''summary'$style
  320.         );
  321.         
  322.         return $summary;
  323.     }
  324.     
  325.     /**
  326.      * Highlight key sentences (summary) of the input string (document content)
  327.      * using CSS and send the result back as an output
  328.      *                             
  329.      * @param string  $str      Input Arabic document as a string
  330.      * @param integer $int      Number of key sentences required to be
  331.      *                           highlighted in the input string
  332.      *                           (document content)
  333.      * @param string  $keywords List of keywords higlited by search process
  334.      * @param string  $style    Name of the CSS class you would like to apply
  335.      *                    
  336.      * @return string Output highlighted key sentences summary (using CSS)
  337.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  338.      */
  339.     public function highlightSummary($str$int$keywords$style)
  340.     {
  341.         $summary $this->summarize(
  342.             $str$keywords$int'number''highlight'$style
  343.         );
  344.         
  345.         return $summary;
  346.     }
  347.     
  348.     /**
  349.      * Highlight key sentences (summary) as percentage of the input string
  350.      * (document content) using CSS and send the result back as an output.
  351.      *                    
  352.      * @param string  $str      Input Arabic document as a string
  353.      * @param integer $rate     Rate of highlighted key sentences summary
  354.      *                           number as percentage of the input Arabic
  355.      *                           string (document content)
  356.      * @param string  $keywords List of keywords higlited by search process
  357.      * @param string  $style    Name of the CSS class you would like to apply
  358.      *                    
  359.      * @return string Output highlighted key sentences summary (using CSS)
  360.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  361.      */
  362.     public function highlightRateSummary($str$rate$keywords$style)
  363.     {
  364.         $summary $this->summarize(
  365.             $str$keywords$rate'rate''highlight'$style
  366.         );
  367.         
  368.         return $summary;
  369.     }
  370.     
  371.     /**
  372.      * Extract keywords from a given Arabic string (document content)
  373.      *      
  374.      * @param string  $str Input Arabic document as a string
  375.      * @param integer $int Number of keywords required to be extracting
  376.      *                      from input string (document content)
  377.      *                    
  378.      * @return string List of the keywords extracting from input Arabic string
  379.      *                (document content)
  380.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  381.      */
  382.     public function getMetaKeywords($str$int)
  383.     {
  384.         $patterns     array();
  385.         $replacements array();
  386.         $metaKeywords '';
  387.         
  388.         array_push($patterns'/\.|\n|\،|\؛|\(|\[|\{|\)|\]|\}|\,|\;/u');
  389.         array_push($replacements' ');
  390.         $str preg_replace($patterns$replacements$str);
  391.         
  392.         $normalizedStr $this->doNormalize($str);
  393.         $cleanedStr    $this->cleanCommon($normalizedStr);
  394.         
  395.         $str preg_replace('/(\W)ال(\w{3,})/u''\\1\\2'$cleanedStr);
  396.         $str preg_replace('/(\W)وال(\w{3,})/u''\\1\\2'$str);
  397.         $str preg_replace('/(\w{3,})هما(\W)/u''\\1\\2'$str);
  398.         $str preg_replace('/(\w{3,})كما(\W)/u''\\1\\2'$str);
  399.         $str preg_replace('/(\w{3,})تين(\W)/u''\\1\\2'$str);
  400.         $str preg_replace('/(\w{3,})هم(\W)/u''\\1\\2'$str);
  401.         $str preg_replace('/(\w{3,})هن(\W)/u''\\1\\2'$str);
  402.         $str preg_replace('/(\w{3,})ها(\W)/u''\\1\\2'$str);
  403.         $str preg_replace('/(\w{3,})نا(\W)/u''\\1\\2'$str);
  404.         $str preg_replace('/(\w{3,})ني(\W)/u''\\1\\2'$str);
  405.         $str preg_replace('/(\w{3,})كم(\W)/u''\\1\\2'$str);
  406.         $str preg_replace('/(\w{3,})تم(\W)/u''\\1\\2'$str);
  407.         $str preg_replace('/(\w{3,})كن(\W)/u''\\1\\2'$str);
  408.         $str preg_replace('/(\w{3,})ات(\W)/u''\\1\\2'$str);
  409.         $str preg_replace('/(\w{3,})ين(\W)/u''\\1\\2'$str);
  410.         $str preg_replace('/(\w{3,})تن(\W)/u''\\1\\2'$str);
  411.         $str preg_replace('/(\w{3,})ون(\W)/u''\\1\\2'$str);
  412.         $str preg_replace('/(\w{3,})ان(\W)/u''\\1\\2'$str);
  413.         $str preg_replace('/(\w{3,})تا(\W)/u''\\1\\2'$str);
  414.         $str preg_replace('/(\w{3,})وا(\W)/u''\\1\\2'$str);
  415.         $str preg_replace('/(\w{3,})ة(\W)/u''\\1\\2'$str);
  416.  
  417.         $stemStr preg_replace('/(\W)\w{1,3}(\W)/u''\\2'$str);
  418.         
  419.         $wordRanks $this->rankWords($stemStr);
  420.         
  421.         arsort($wordRanksSORT_NUMERIC);
  422.         
  423.         $i 1;
  424.         foreach ($wordRanks as $key => $value{
  425.             if ($this->acceptedWord($key)) {
  426.                 $metaKeywords .= $key '، ';
  427.                 $i++;
  428.             }
  429.             if ($i $int{
  430.                 break;
  431.             }
  432.         }
  433.         
  434.         $metaKeywords mb_substr($metaKeywords0-2);
  435.         
  436.         return $metaKeywords;
  437.     }
  438.     
  439.     /**
  440.      * Normalized Arabic document
  441.      *      
  442.      * @param string $str Input Arabic document as a string
  443.      *      
  444.      * @return string Normalized Arabic document
  445.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  446.      */
  447.     protected function doNormalize($str)
  448.     {
  449.         $str str_replace($this->_normalizeAlef'ا'$str);
  450.         $str str_replace($this->_normalizeDiacritics''$str);
  451.         $str strtr(
  452.             $str
  453.             'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  454.             'abcdefghijklmnopqrstuvwxyz'
  455.         );
  456.  
  457.         return $str;
  458.     }
  459.     
  460.     /**
  461.      * Extracting common Arabic words (roughly)
  462.      * from input Arabic string (document content)
  463.      *                        
  464.      * @param string $str Input normalized Arabic document as a string
  465.      *      
  466.      * @return string Arabic document as a string free of common words (roughly)
  467.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  468.      */
  469.     public function cleanCommon($str)
  470.     {
  471.         $str str_replace($this->_commonWords' '$str);
  472.         
  473.         return $str;
  474.     }
  475.     
  476.     /**
  477.      * Remove less significant Arabic letter from given string (document content).
  478.      * Please note that output will not be human readable.
  479.      *                      
  480.      * @param string $str Input Arabic document as a string
  481.      *      
  482.      * @return string Output string after removing less significant Arabic letter
  483.      *                 (not human readable output)
  484.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  485.      */
  486.     protected function draftStem($str)
  487.     {
  488.         $str str_replace($this->_commonChars''$str);
  489.         return $str;
  490.     }
  491.     
  492.     /**
  493.      * Ranks words in a given Arabic string (document content). That rank refers
  494.      * to the frequency of that word appears in that given document.
  495.      *                      
  496.      * @param string $str Input Arabic document as a string
  497.      *      
  498.      * @return hash Associated array where document words referred by index and
  499.      *               those words ranks referred by values of those array items.
  500.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  501.      */
  502.     protected function rankWords($str)
  503.     {
  504.         $wordsRanks array();
  505.         
  506.         $str   str_replace($this->_separators' '$str);
  507.         $words preg_split("/[\s,]+/u"$str);
  508.         
  509.         foreach ($words as $word{
  510.             if (isset($wordsRanks[$word])) {
  511.                 $wordsRanks[$word]++;
  512.             else {
  513.                 $wordsRanks[$word1;
  514.             }
  515.         }
  516.  
  517.         foreach ($wordsRanks as $wordRank => $total{
  518.             if (mb_substr($wordRank01== 'و'{
  519.                 $subWordRank mb_substr($wordRank1mb_strlen($wordRank1);
  520.                 if (isset($wordsRanks[$subWordRank])) {
  521.                     unset($wordsRanks[$wordRank]);
  522.                     $wordsRanks[$subWordRank+= $total;
  523.                 }
  524.             }
  525.         }
  526.  
  527.         return $wordsRanks;
  528.     }
  529.     
  530.     /**
  531.      * Ranks sentences in a given Arabic string (document content).
  532.      *      
  533.      * @param array $sentences        Sentences of the input Arabic document
  534.      *                                 as an array
  535.      * @param array $stemmedSentences Stemmed sentences of the input Arabic
  536.      *                                 document as an array
  537.      * @param array $arr              Words ranks array (word as an index and
  538.      *                                 value refer to the word frequency)
  539.      *                         
  540.      * @return array Two dimension array, first item is an array of document
  541.      *                sentences, second item is an array of ranks of document
  542.      *                sentences.
  543.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  544.      */
  545.     protected function rankSentences($sentences$stemmedSentences$arr)
  546.     {
  547.         $sentenceArr array();
  548.         $rankArr     array();
  549.         
  550.         $max count($sentences);
  551.         
  552.         for ($i 0$i $max$i++{
  553.             $sentence $sentences[$i];
  554.  
  555.             $w     0;
  556.             $first mb_substr($sentence01);
  557.             $last  mb_substr($sentence-11);
  558.                     
  559.             if ($first == "\n"{
  560.                 $w += 3;
  561.             elseif (in_array($first$this->_separators)) {
  562.                 $w += 2;
  563.             else {
  564.                 $w += 1;
  565.             }
  566.                     
  567.             if ($last == "\n"{
  568.                 $w += 3;
  569.             elseif (in_array($last$this->_separators)) {
  570.                 $w += 2;
  571.             else {
  572.                 $w += 1;
  573.             }
  574.  
  575.             foreach ($this->_importantWords as $word{
  576.                 if ($word != ''{
  577.                     $w += mb_substr_count($sentence$word);
  578.                 }
  579.             }
  580.             
  581.             $sentence mb_substr(mb_substr($sentence0-1)1);
  582.             if (!in_array($first$this->_separators)) {
  583.                 $sentence $first $sentence;
  584.             }
  585.             
  586.             $stemStr $stemmedSentences[$i];
  587.             $stemStr mb_substr($stemStr0-1);
  588.             
  589.             $words preg_split("/[\s,]+/u"$stemStr);
  590.             
  591.             $totalWords count($words);
  592.             if ($totalWords 4{
  593.                 $totalWordsRank 0;
  594.                 
  595.                 foreach ($words as $word{
  596.                     if (isset($arr[$word])) {
  597.                         $totalWordsRank += $arr[$word];
  598.                     }
  599.                 }
  600.                 
  601.                 $wordsRank     $totalWordsRank $totalWords;
  602.                 $sentenceRanks $w $wordsRank;
  603.                 
  604.                 array_push($sentenceArr$sentence $last);
  605.                 array_push($rankArr$sentenceRanks);
  606.             }
  607.         }
  608.         
  609.         $sentencesRanks array($sentenceArr$rankArr);
  610.         
  611.         return $sentencesRanks;
  612.     }
  613.     
  614.     /**
  615.      * Calculate minimum rank for sentences which will be including in the summary
  616.      *      
  617.      * @param array   $str Document sentences
  618.      * @param array   $arr Sentences ranks
  619.      * @param integer $int Number of sentences you need to include in your summary
  620.      * @param integer $max Maximum number of characters accepted in your summary
  621.      *      
  622.      * @return integer Minimum accepted sentence rank (sentences with rank more
  623.      *                  than this will be listed in the document summary)
  624.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  625.      */
  626.     protected function minAcceptedRank($str$arr$int$max)
  627.     {
  628.         $len array();
  629.         
  630.         foreach ($str as $line{
  631.             $len[mb_strlen($line);
  632.         }
  633.  
  634.         rsort($arrSORT_NUMERIC);
  635.  
  636.         $totalChars 0;
  637.         
  638.         for ($i=0$i<=$int$i++{
  639.  
  640.             if (!isset($arr[$i])) {
  641.                 $minRank 0;
  642.                 break;
  643.             }
  644.  
  645.             $totalChars += $len[$i];
  646.  
  647.             if ($totalChars >= $max{
  648.                 $minRank $arr[$i];
  649.                 break;
  650.             }
  651.  
  652.             $minRank $arr[$i];
  653.         }
  654.  
  655.         return $minRank;
  656.     }
  657.     
  658.     /**
  659.      * Check some conditions to know if a given string is a formal valid word or not
  660.      *      
  661.      * @param string $word String to be checked if it is a valid word or not
  662.      *      
  663.      * @return boolean True if passed string is accepted as a valid word else
  664.      *                  it will return False
  665.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  666.      */
  667.     protected function acceptedWord($word)
  668.     {
  669.         $accept true;
  670.         
  671.         if (mb_strlen($word3{
  672.             $accept false;
  673.         }
  674.         
  675.         return $accept;
  676.     }
  677. }

Documentation generated on Fri, 01 Jan 2016 10:25:52 +0200 by phpDocumentor 1.4.0