计算给定字符串中单词的实例数,然后返回与另一个数组匹配的前5个单词


php: count instances of words in a given string then return top 5 which match in another array

php:对给定字符串中的单词进行排序和计数

在本文中,我已经知道了如何计算给定字符串中单词的实例数并按频率排序。现在我想做进一步的工作,将结果词匹配到另一个数组($keywords),然后只得到前5个词。但我不知道该怎么做,打开一个问题。谢谢。
$txt = <<<EOT
The 2013 Monaco Grand Prix (formally known as the Grand Prix de Monaco 2013) was a Formula One motor race that took place on 26 May 2013 at the Circuit de Monaco, a street circuit that runs through the principality of Monaco. The race was won by Nico Rosberg for Mercedes AMG Petronas, repeating the feat of his father Keke Rosberg in the 1983 race. The race was the sixth round of the 2013 season, and marked the seventy-second time the Monaco Grand Prix has been held. Rosberg had started the race from pole.
Background
Mercedes protest
Just before the race, Red Bull and Ferrari filed an official protest against Mercedes, having learned on the night before the race of a three-day tyre test undertaken by Pirelli at the venue of the last grand prix using Mercedes' car driven by both Hamilton and Rosberg. They claimed this violated the rule against in-season testing and gave Mercedes a competitive advantage in both the Monaco race and the next race, which would both be using the tyre that was tested (with Pirelli having been criticised following some tyre failures earlier in the season, the tests had been conducted on an improved design planned to be introduced two races after Monaco). Mercedes stated the FIA had approved the test. Pirelli cited their contract with the FIA which allows limited testing, but Red Bull and Ferrari argued this must only be with a car at least two years old. It was the second test conducted by Pirelli in the season, the first having been between race 4 and 5, but using a 2011 Ferrari car.[4]
Tyres
Tyre supplier Pirelli brought its yellow-banded soft compound tyre as the harder "prime" tyre and the red-banded super-soft compound tyre as the softer "option" tyre, just as they did the previous two years. It was the second time in the season that the super-soft compound was used at a race weekend, as was the case with the soft tyre compound.
EOT;
$words = array_count_values(str_word_count($txt, 1));
arsort($words);
var_dump($words);
$keywords = array("Monaco","Prix","2013","season","Formula","race","motor","street","Ferrari","Mercedes","Hamilton","Rosberg","Tyre"); 
//var_dump($words) which should match in $keywords array, then get top 5 words.

您已经将$words作为关联数组,以单词为索引并以计数为值,因此我们使用array_flip()使您的$keywords数组也成为以单词为索引的关联数组。然后,可以使用array_intersect_key()只返回$words中与翻转后的$keywords数组中有匹配索引项的项。

给出一个结果$matchWords数组,仍然以单词为关键字,但只包含原始$words数组中与$keywords匹配的条目;还是按频率排序的

然后简单地使用array_slice()从该数组中提取前5个条目。

$matchWords = array_intersect_key(
    $words,
    array_flip($keywords)
);
$matchWords = array_slice($matchWords, 0, 5);
var_dump($matchWords);

array(5) {
  'race' =>
  int(11)
  'Monaco' =>
  int(7)
  'Mercedes' =>
  int(5)
  'Rosberg' =>
  int(4)
  'season' =>
  int(4)
}

警告:您可能会遇到区分大小写的问题。"Race" !== "Race",因此$words = array_count_values(str_word_count($txt, 1));行将把它们视为两个不同的单词