多个字符串中的新字符串,包含最常用的单词

时间:2012-10-13 19:32:55

标签: php string

我正在尝试使用这些字符串之间最常见的单词从多个字符串创建一个新字符串。例如:

$string[0] = 'Apple iPhone 4S 16GB Locked to Orange';
$string[1] = 'iPhone 4S 16GB boxed new';
$string[2] = 'iPhone 4S 16GB unlocked brand new';
$string[3] = 'Apple iPhone 16GB 4S Special Offer';
$string[4] = 'Apple iPhone 4S Sim Free';

## The new string should be:

$new_string = 'Apple iPhone 4S 16GB';

可能有数百个原始字符串,或者只有2个......

我不知道从哪里开始,任何帮助都会非常感激。

4 个答案:

答案 0 :(得分:1)

以下内容应该让您入门:

function getWordCount($someArray)
{
    $wordList = array();
    foreach($someArray as $item) {
        $wordList = array_merge($wordList, explode(' ', $item));
    }

    $result = array_count_values($wordList);
    arsort($result);

    return $result;
}

注意我会根据空格字符进行爆炸,但这不会考虑标点符号等.,。如果你想要考虑到这一点,你应该使用一些简单的正则表达式模式来根据你的要求获得字符串中的单词。

演示:http://codepad.viper-7.com/IuAc2s

答案 1 :(得分:1)

你可以尝试

$string = array();
$string[0] = 'Apple iPhone 4S 16GB Locked to Orange';
$string[1] = 'iPhone 4S 16GB boxed new';
$string[2] = 'iPhone 4S 16GB unlocked brand new';
$string[3] = 'Apple iPhone 16GB 4S Special Offer';
$string[4] = 'Apple iPhone 4S Sim Free';

print(getCommon($string));

输出

Apple iPhone 4S 16GB

使用的功能

function getCommon($array,$occurance = 3)
{
    $array = array_reduce($array, function($a,$b) { $a = array_merge($a,explode(" ", $b)); return $a; },array());
    return implode(" ",array_keys(array_filter(array_count_values($array),function($var)use($occurance) {return $var > $occurance ;})));
}

See Live DEMO

答案 2 :(得分:1)

另一种方法

$min_times_present = 3;
$words  = array();
foreach ($string as $str) {
  $words_string = preg_split('/\s+/', $str, 0, PREG_SPLIT_NO_EMPTY);
  foreach ($words_string as $word) {
    $words[$word] = (isset($words[$word])) ? $words[$word]+1 : 1;
  }
}
$result_arr = array_filter($words, function($value) use ($min_times_present) {
  return ($value >= $min_times_present);
});
arsort($result_arr, SORT_NUMERIC);
$result_str = implode(' ', array_keys($result_arr));

答案 3 :(得分:0)

我有一个类似的问题,我的解决方案是将所有短语合并在一个单词数组中,然后得到出现次数最多的单词:

$string = array();
$string[0] = 'Apple iPhone 4S 16GB Locked to Orange';
$string[1] = 'iPhone 4S 16GB boxed new';
$string[2] = 'iPhone 4S 16GB unlocked brand new';
$string[3] = 'Apple iPhone 16GB 4S Special Offer';
$string[4] = 'Apple iPhone 4S Sim Free';
$words=array();
for($i=0;$i<count($string);$i++){
    $words = array_merge($words,str_word_count($string[$i],1));
}

$instances = array_count_values($words);
arsort($instances);
$instances = array_slice($instances,0,5);
foreach($instances as $word=>$count){
    echo $word.' ';
}
    // Outputs "iPhone S GB Apple new"

这种方法的问题在于,如果一个单词在同一个字符串中多次出现,则会增加出现的次数。