2

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

$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

4 回答 4

2

你可以试试

$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 ;})));
}

观看现场演示

于 2012-10-13T19:38:46.297 回答
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;
}

注意我根据空格字符爆炸,这不考虑标点符号等,例如.or ,。如果你想解决这个问题,你应该使用一些简单的正则表达式模式来根据你的要求获取字符串中的单词。

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

于 2012-10-13T19:37:37.437 回答
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));
于 2012-10-13T20:05:48.510 回答
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"

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

于 2013-11-28T01:34:42.310 回答