PHP - вернуть слова, которые отображаются больше всего внутри строки - PullRequest
1 голос
/ 09 января 2010
$string = 'I like banana, banana souffle, chocobanana and marshmellows.";
$arr = some_function($string); 
// $arr = ('banana'=>3,'I'=>1,'like'=>1....);

У вас есть идея, как сделать это наиболее эффективно?

Ответы [ 4 ]

4 голосов
/ 09 января 2010
$str = 'I like banana, banana souffle, chocobanana and marshmellows.';
$words = str_word_count($str, 1);
$freq = array();
foreach ($words as $w) {
  if (preg_match_all('/' . preg_quote($w, '/') . '/', $str, $m)) {
    $freq[$w] = count($m[0]);
  }
}
print_r($freq);
2 голосов
/ 09 января 2010

вы можете использовать array_count_values ​​

например

$string = 'I like banana, banana souffle, chocobanana and marshmellows';
$s = preg_split("/[, ]+/",$string);
print_r(array_count_values($s));

примечание: это только считать целые слова. то есть "банан" будет 2, а не 3, потому что chocobanana не то же самое, что банан. Если вы хотите искать и считать слова в словах, необходимо дополнительное кодирование

0 голосов
/ 09 января 2010

Поскольку вы хотите считать частичные слова, вам понадобится список слов с возможными словами. Затем вы сначала разбиваете текст на слова на основе разделения пробелов, просматриваете все слова и пытаетесь найти максимально длинное совпадение подстроки со списком слов . Конечно, это будет очень, очень медленно, если список слов большой, но, возможно, вы можете ускорить сопоставление, используя массив суффиксов слова, которое вы просматриваете.

Если вы не нашли подходящей подстроки, просто посчитайте все слово как одно.

Надеюсь, вы понимаете мою идею. Это не так здорово, но это решение, которое я могу предложить для ваших требований.

0 голосов
/ 09 января 2010
preg_match_all('!\b\w+\b!', $string, $matches);
$arr = array_count_values($matches[0]);
print_r($arr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...