我正在使用 PHP。
假设我有 5 个字符串:
"The quick brown fox"
"The sly brown fox"
"The sly brown chicken"
"Totally different text here"
"Not like the others"
我想找到与其他人最“不同”的 2 个。我希望能够将其扩展到 1000 个文本字符串并获得 300 个最“不同”的字符串。
任何想法从哪里开始?
编辑
如何定义“不同”有待商榷!
* 编辑 2 *
我们根据 PHPsimilar_text
函数将“不同”定义为不同。但可能还有其他定义。真正的问题是如何比较所有的文本字符串。Jean 建议计算总数,这是 Phillipe 代码的破解版本:
$strings = array(
"The quick brown fox",
"The sly brown fox",
"The sly brown chicken",
"Totally different text here",
"Not like the others"
);
$n = 3;
$sim = array();
for ($i = 0; $i < count($strings); $i++) {
$total = 0;
for ($j = 0; $j < count($strings); $j++) {
if($strings[$i] != $strings[$j]) {
$sim_val = similar_text($strings[$i], $strings[$j]);
$total += $sim_val;
$sim[$strings[$i]][] = array(
"sim" => $sim_val,
"w1" => $strings[$i],
"w2" => $strings[$j]
);
}
}
$sim[$strings[$i]]['total'] = $total;
}
uasort($sim, function($w1, $w2) {
return $w1["total"] > $w2["total"];
});
$sim = array_keys($sim);
$sim = array_slice($sim,0,$n);
那返回
Array
(
[0] => Not like the others
[1] => Totally different text here
[2] => The quick brown fox
)
这似乎是正确的答案。感谢所有人(除了那些不赞成这个问题的人。向你嘘 ;-)
编辑 3 *
好的,所以我一直在用我的 1000 个字符串进行测试。它们每个都有大约 500 个独特的单词,astrlen
大约有 14000 个。所以......为了快速运行,我们可以立即忘记similar_text
'cos 所指出的那样,它很慢。我写了一个快速的`compare_words'函数:
function same_words($text1,$text2) {
$words_1 = array_unique(explode(" ",$text1));
$words_2 = array_flip(array_unique(explode(" ",$text2)));
foreach($words_1 AS $word) {
if($words_2[$word]) {
$count++;
}
}
return $count;
}
但这也太慢了。