В настоящее время я просматриваю HTML-страницу и подсчитываю единственные слова на странице, используя:
$page_content = file_get_html($url)->plaintext; $word_array = array_count_values(str_word_count(strip_tags(strtolower($page_content));
Это отлично подходит для подсчета отдельных слов.
Но я пытаюсь подсчитать фразы длиной до 3 слов.
Например:
$string = 'the best stack post';
Счет вернется:
the = 1 best = 1 stack = 1 post = 1
Мне нужны фразы, чтобы вырваться из строки, поэтому фраза из трех слов из этой строки может быть:
the best stack = 1 best stack post = 1
Надеюсь это имеет смысл!
Я искал, но не могу найти способ сделать это на PHP.
Есть идеи?
Итак, для этого решения есть два шага.
.
). Вот код:
function threeWords($string) { $words = array_values(array_filter(preg_split("!\W!",$string))); //Split on non-word characters. Not ideal probably since it will count "non-hyphenated" as 2 words. if (count($words) < 3) { return []; } $phrases = []; for ($i = 2;$i < count($words);$i++) { $phrases[] = $words[$i-2]." ".$words[$i-1]." ".$words[$i]; } return $phrases; } $page_content = file_get_html($url)->plaintext; $text = strip_tags(strtolower($page_content)); $sentences = explode(".",$text); $phrases = []; foreach ($sentences as $sentence) { $phrases = array_merge($phrases,threeWords(trim($sentence))); } $count = array_count_values($phrases); print_r($count);
Что бы я сделал, это получить содержимое страницы и удалить теги html. Затем взорвите текст типичным разделителем фразы, который является точкой (.). Теперь у вас есть массив отдельных фраз, для которых вы можете считать одиночные слова:
$page_content = file_get_html($url)->plaintext; $text = strip_tags(strtolower($page_content)); $phrases = explode(".", $text); $count = 0; foreach ($phrases as $phrase) { if (str_word_count($phrase) >= 3) { $count++; } }
// Split the string into sentences on the appropriate punctuation marks // and loop over the sentences foreach (preg_split('/[?.!]/', $string) as $sentence) { // split the sentences into words (remove any empty strings with array_filter) $words = array_filter(explode(' ', $sentence)); // take the first set of three words from the sentence, then remove the first word, // until the sentence is gone. while ($words) { $phrase = array_slice($words, 0, 3); // check that the phrase is the correct length if (count($phrase) == 3) { // convert it back to a string $phrase = implode(' ', $phrase); // increment the count for that phrase in your result if (!isset($phrases[$phrase])) $phrases[$phrase] = 0; $phrases[$phrase]++; } array_shift($words); } }