Как найти все варианты сочетания элементов массива?
Задача: нужно сделать функцию которая получает строку, например "Решетка для вентиляции", а возвращает различные формы и склонения этой строки, например "Решетки для вентиляции", при этом нужно еще получать варианты с разным порядком, например "для вентиляцию решетку"
Использую phpmorphy для получения всех форм слова, в итоге у меня 2-x мерный массив. Проблема что не могу понять каким алгоритмом получить все вариации элементов этого массива.
Проблема что размерность массива величина переменная. В какую сторону копать?
А вы уверены, что вы вообще копаете в ту сторону? Для поиска обычно делают наоборот - приводят все, что можно, к базовой форме.
А так - комбинаторика, осложненная семантикой, может вынести не только мозг, но и процессор. Вам же нужно не просто комбинацию, а согласованную, "Решеткой для вентиляциям" вряд ли кому-то пригодится.
Adamos: наверняка есть бесплатные или платные продукты, которые уже умеют отсеивать такие словосочетания. Гугл, к примеру, иногда возвращает поле "возможно вы имели ввиду"
x67: да-да, и гугль наверняка жаждет бесплатно поделиться тем, на что сам потратил человеко-тысячелетия...
Когда у ТС будет такая же база запросов, как у Гугля, он тоже будет хорошо понимать, что, скорее всего, имел в виду кот, пройдя по клавиатуре.
Adamos: я был как-то на конференции MS, они презентовали тогда какое-то b2b облачное решение для распознавания текста, голоса и еще каких-то фич (не помню, ибо года три назад было). И условия там были вполне приемлемые - до какого-то количества запросов пользование бесплатное, а дальше - платите денежки. Сейчас многие так делают - подсаживают на крючок студентов или молодые компании, имея профит с тех, кто вырос.
Решение в лоб:
- разбить фразу по словам (получится массив из N строк),
- для каждого слова построить его все словоморфы (в итоге массив из N массивов),
- рекурсивно N раз брать следующее слово из N-ного элемента массив
- для перемешивания слов либо отдельный метод по полученному массиву, либо N-квадрат рекурсий предыдущего пункта
Итог: уже на 5 словах даже мощный сервер сдохнет
Умное решение: скормить исходную фразу Sphinx/Lucene - они нами найдут нужное среди вашего контента