Я использую PHP.Скажем, у меня есть 5 строк текста. Как найти 2, которые являются самыми «отличными» от остальных?
Скажем, у меня есть 5 строк:
"The quick brown fox"
"The sly brown fox"
"The sly brown chicken"
"Totally different text here"
"Not like the others"
и я хочу, чтобы найти 2, которые наиболее «отличается» от остальных. Я хотел бы расширить его до 1000 текстовых строк и получить, скажем, 300 самых «разных».
Любые идеи, с чего начать?
EDIT
Как определить "разные" вверх для обсуждения!
* EDIT 2 *
Мы определили "разные" отличаться в зависимости от функции PHP similar_text
. Но могут быть и другие определения. Реальные проблемы - это сравнение всех текстовых строк. Жан предложил считать итоги, и это взломанный вариант кода Филиппом, что делает так:
$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
)
, который, похоже, как правильный ответ. Спасибо всем (за исключением тех, кто downvoted вопрос. Booo вам ;-)
EDIT 3 *
ОК, так что я тестировал это с моим 1000 строк. Каждый из них имеет около 500 уникальных слов и strlen
около 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;
}
, но это слишком медленно.
Что на земле вы подразумеваете под «разными»? –
Определите «разные». Количество символов? Словесные звуки? Смыслы? – Jodes
Я думаю, что он имеет в виду разные слова – MIIB