2011-03-04 17 views
4

文字列の入力を与えられた場合、文字列の終わりを指定の長さに切り捨てることによって、非常に単純な形式の要約を生成する必要があります。文字列から要約を自動的に生成

// Take an array of strings and generate a summary within a given length 
function stringSummaryFromMetadata($inArray,$len=80,$sep='§'){ 

    // Filter out 'false' values 
    $inputs=array_filter($inArray); 

    // First try just imploding array 
    $res=implode($sep,$inputs); 

    // Check for length 
    if(mb_strlen($res, 'utf8')>$len){ 

     // Calculate 'z' the fixed width constant 
     $x=count($inputs); 
     $z=round(($len-$x)/$x); 

     // Snip all strings to 'z' 
     $t1=array(); 
     foreach($inputs as $i) $t1[]=mb_substr($i,0,$z); 

     // Final answer 
     $res=implode($sep,$t1); 
    } 

    return $res; 
} 

テスト:

$test=array(
    'Ligula diam risus tempus lorem sit', 
    'Cursus metus commodo enim odio orci', 
    'Metus sapien porta sapien fusce sodales', 
    'king queen' 
); 
$out=stringSummaryFromMetadata($test); 
print $out; 

います:

Ligula DIAMのrisusのt§Cursusのmetus commod§MetusSAPIENポルタここ

は、最初のバージョンの機能です§クイーン

それは十分に良いですが、はるかに最適にすることができます。私はそれを確信しています。たとえば、テスト出力は80文字未満です。トリミング後の文字列の最後に空白があり、単語が切り刻まれています。

私が接線を離れて自分自身をロールする前に、コミュニティに聞きたいと思います以前に尋ねられた場合、またはアルゴリズムが既に存在する場合

+0

'str_word_count'がうまく動作します。特に、HTMLエンティティを分割したくありません。 – ajreal

+0

@ajreal abot HTMLエンティティに不安がありません。 str_word_countを使用すると、最も頻繁に表示される単語を表示する方が、要約を表示するより良い方法だと言いますか? – zaf

+0

いいえ、目的は、単語の数を配列を取得する場合は、結合単語の長さの合計がいくつかの長さを超えないように、いくつかの合計を確認するループを行うことができます超えて位置/単語から除外 – ajreal

答えて

2

wordwrapを使用して、結果の文字列に含まれる行数を数えます。複数の場合、テキストが必要以上に長くなっているため、セパレータを最初の行の末尾に追加し、他の行は破棄します。 1行しかない場合、テキストは短くなり、トリミングは行われませんでした。

wordwrapはありませんUTF8認識しているようだが、utf8_wordwrap作業機能を示しcommentあります。

+0

開始時に文字列だけでなくすべての入力文字列の一部を含むように要約します。 – zaf

+0

いいえ、あなたは私を理解できませんでした。各入力文字列に対して、 'wordwrap'は一行あたり一定の最大幅にフォーマットされた文字列を返します。入力文字列が長すぎると、複数行の文字列で返されます。あなたは最初の行を取得し、セパレータを追加して残りの行を破棄します。そして、他のすべての入力文字列に対して同じ処理を行います。 –

+0

私は今あなたを得る。そのチップをありがとう。 – zaf

関連する問題