Наиболее часто используемые слова в тексте с php - PullRequest
3 голосов
/ 04 июля 2010

Я нашел код ниже на stackoverflow, и он хорошо работает при поиске наиболее распространенных слов в строке. Но могу ли я исключить возможность подсчета общих слов, таких как «а, если у вас есть и т. Д.»? Или мне придется удалить элементы после подсчета? Как бы я это сделал? Заранее спасибо.

<code><?php

$text = "A very nice to tot to text. Something nice to think about if you're into text.";


$words = str_word_count($text, 1); 

$frequency = array_count_values($words);

arsort($frequency);

echo '<pre>';
print_r($frequency);
echo '
'; ?>

Ответы [ 4 ]

9 голосов
/ 30 октября 2011

Это функция, которая извлекает общие слова из строки. требуется три параметра; строка, массив стоп-слов и количество ключевых слов. Вы должны получить stop_words из txt-файла, используя функцию php, которая переводит txt-файл в массив

$ stop_words = file ('stop_words.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

$ this-> extract_common_words ($ text, $ stop_words)

Вы можете использовать этот файл stop_words.txt в качестве основного файла стоп-слов или создать свой собственный файл.

function extract_common_words($string, $stop_words, $max_count = 5) {
      $string = preg_replace('/ss+/i', '', $string);
      $string = trim($string); // trim the string
      $string = preg_replace('/[^a-zA-Z -]/', '', $string); // only take alphabet characters, but keep the spaces and dashes too…
      $string = strtolower($string); // make it lowercase

      preg_match_all('/\b.*?\b/i', $string, $match_words);
      $match_words = $match_words[0];

      foreach ( $match_words as $key => $item ) {
          if ( $item == '' || in_array(strtolower($item), $stop_words) || strlen($item) <= 3 ) {
              unset($match_words[$key]);
          }
      }  

      $word_count = str_word_count( implode(" ", $match_words) , 1); 
      $frequency = array_count_values($word_count);
      arsort($frequency);

      //arsort($word_count_arr);
      $keywords = array_slice($frequency, 0, $max_count);
      return $keywords;
}
2 голосов
/ 04 июля 2010

Вы можете легко сделать это, используя array_diff():

$words = array("if", "you", "do", "this", 'I', 'do', 'that');
$stopwords = array("a", "you", "if");

print_r(array_diff($words, $stopwords));

дает

 Array
(
    [2] => do
    [3] => this
    [4] => I
    [5] => do
    [6] => that
)

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

2 голосов
/ 04 июля 2010

Там нет дополнительных параметров или встроенной функции PHP, которые вы можете передать словами, чтобы исключить.Поэтому я просто использовал бы то, что у вас есть, и игнорировал бы пользовательский набор слов, возвращаемый str_word_count.

1 голос
/ 22 октября 2017

Вот мое решение с использованием встроенных функций PHP:

most_frequent_words - Найти наиболее часто встречающиеся слова в строке

function most_frequent_words($string, $stop_words = [], $limit = 5) {
    $string = strtolower($string); // Make string lowercase

    $words = str_word_count($string, 1); // Returns an array containing all the words found inside the string
    $words = array_diff($words, $stop_words); // Remove black-list words from the array
    $words = array_count_values($words); // Count the number of occurrence

    arsort($words); // Sort based on count

    return array_slice($words, 0, $limit); // Limit the number of words and returns the word array
}

Возвращаемый массив содержит слова, которые чаще всего встречаются в строке.

Параметры:

строка $ строка - строка ввода.

массив $ stop_words (необязательно) - список слов, отфильтрованных из массива, пустой массив по умолчанию.

строка $ limit (необязательно) - ограничение количества возвращаемых слов, по умолчанию 5 .

...