これは、まだある程度のクリーンアップを使用できる機能的なソリューションです。私の一般的なアルゴリズムは次のとおりです。
- すべての単語をリストwに分解し、余分な空白と句読点を取り除きます
- オフセット0から始まるwのすべてのn長のチャンクの配列を見つけます
- オフセット1から始まる
wのすべてのn長のチャンクの配列を見つけます
- ...オフセットn -1で始まるn個の長さのチャンクの配列が見つかるまで続行します
- 注:wの最後のチャンクがnの長さでない場合は、チャンク配列の一部として含めないでください
- すべてのチャンク配列をcとして連結します
- cのすべての値の頻度を見つける
$sample = 'Lorem *ipsum* dolor sit amet, consectetur adipiscing elit. Nunc auctor urna sed urna mattis nec interdum magna ullamcorper. Donec ut lorem eros, id rhoncus nisl. Praesent sodales lorem vitae sapien volutpat et accumsan lorem viverra. Proin lectus elit, cursus ut feugiat ut, porta sit amet leo. Cras est nisl, aliquet quis lobortis sit amet, viverra non erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer euismod scelerisque quam, et aliquet nibh dignissim at. Pellentesque ut elit neque. Etiam facilisis nisl eu mauris luctus in consequat libero volutpat. Pellentesque auctor, justo in suscipit mollis, erat justo sollicitudin ipsum, in cursus erat ipsum id turpis. In tincidunt hendrerit scelerisque.';
function buildPhrases($string, $length) {
$onlyWords = preg_replace('/\p{P}/', '', $string);
$wordArray = preg_split('/\s+/s', $onlyWords);
function buildPhraseChunks($wordArray, $length, $offset = 0)
{
if ($offset >= $length) {
return array();
} else {
$offsetWordArray = array_slice($wordArray, $offset);
return array_merge(
array_chunk($offsetWordArray, $length),
buildPhraseChunks(
$wordArray, $length, $offset + 1
)
);
}
}
$onlyLengthN = function ($n) {
return function($a) use ($n) {
return count($a) == $n;
};
};
$concatWords = function ($a, $b) {
return $a . ' ' . $b;
};
$reduce = function ($a) use ($concatWords) {
return array_reduce($a, $concatWords);
};
$format = function ($a) {
return strtolower(trim($a));
};
$chunks = array_filter(
buildPhraseChunks($wordArray, $length),
$onlyLengthN($length)
);
$phrases = array_map($reduce, $chunks);
$formattedPhrases = array_map($format, $phrases);
return $formattedPhrases;
}
$phrases = buildPhrases($sample, 1);
$dropOnes = function($a) {
return $a != 1;
};
$freqCount = array_filter(
array_count_values($phrases),
$dropOnes
);
arsort($freqCount);
print_r($freqCount);