А это интересно.. Это вот не очень хороший показатель. Ты уверен, что оно не съедает лишнего? Проверь на контролируемых объемах, где однозначно видно все. В PHP есть нативная реализация подобных вещей, даже расстояния Левенштейна есть, пробовал всякое использовать, но на огромных объемах данных скорость очень сильно проседала, когда надо сравнить все со всем. Это посимвольные операции по факту. Бить словосочетания на слова и проверять схождение массивов оказалось более быстрым решением для данной ситуации. Там, скорее всего, используются какие-то оптимизации типа подсчета коротких хэшей значений. --- Добавлено --- В принципе, решение @Chushkin уже более, чем достаточное, но меня смущает количество "отбраковки", которое оно выдает.
Что значит "не хороший"? А какой "хороший"? Не уверен, конечно. ТС не предоставил "правильный ответ". Какие проблемы? Функция есть, проверяйте. Потом расскажите, правильно работает или нет. На той тысяче данных, результаты вашей функции и моей совпадают - оставляют 985 штук (если не запамятовал, в общем - одинаковое количество).
Я просто вот из чего исхожу: Хотя, с другой стороны, у автора отсев на долгой дистанции был довольно большим. И да, давно это я стал такой важной персоной, что ты ко мне на "вы" обращаться стал? Брось ты это дело --- Добавлено --- Имеем две фразы. Если в одной из фраз есть все слова, входящие в другую, то эту "другую" выбрасываем. Если обе фразы идентичны, то выбрасываем любую их них. Или просто решаем этот момент через array_unique еще до начала обработки.