[PHP] たくさんのキーワードからn個(n行)をランダムに選択する(抽出する)

Posted September 7th, 2010 in General. Tagged: .

いくつかのアイテムから n個をランダムに選択したいときがある。たとえば、人気のキーワードは日に数千あるけれど、上位10個を表示するだけだとランキング上位のキーワードが確固たる地位を築いてしまうだけで、おもしろくなかったりするので、そんなときは上位1000個から10個のキーワードをランダムに選択して表示するようにするといいじゃないかな。

たとえば、キーワードとその検索頻度を1行に並べた tsv形式のファイルが入力があるとする。例えば、

ほげほげ,123
ふがふが,110
....
かんぱり,32
なんとか,24

PHPで作るなら

<?
// number of output lines
$max=intval($argv[1]);

// open standard input
$h=fopen('php://stdin','r');
if (!$h) { die('stdin open error'); }

// put all lines into an array
$items=array();
while(!feof($h)) {
  $line=trim(fgets($h));
  if (!$line) { continue; }
  $items[]=explode(',',$line);
}

fclose($h);

// shuffle the array of lines
shuffle($items);

// output selected lines
for($i=0;$i<$max;$i++) {
  echo $items[$i][0]."\n";
}
?>

のようなコードで、標準入力から読み込んだキーワードから、指定した n個をランダムに選択(抽出)できる。たとえば、これを extract_n_randomly.php として保存し、

 
% php extract_n_randomly.php 10 < keywords.tsv

とすれば、実行するたびに異なる 10個 のキーワードを得る。

ポイントは shuffle() ( cf. PHP: shuffle – Manual ) で、配列をランダムに並べ替えてくれる。

Posted September 7th, 2010 in General. Tagged: .

Comments are closed.


track feed