Я работаю над проектом, и мне нужны ваши предложения в запросе к базе данных. Я использую PHP и MySQL.
контекст
phrases
содержащий phrases
столбец, в котором хранятся фразы, каждая из которых состоит из одного-трех слов.text
строка, содержащая 500 — 1000 словМне нужно выделить все фразы в text
строка, которая существует в моем phrases
таблица базы данных.
Мое решение
Я просматриваю каждую фразу в списке фраз и сравниваю ее с text
, но количество фраз большое (100 тыс.), поэтому для этого сопоставления требуется около 2 минут или более.
Есть ли более эффективный способ сделать это?
Я сконцентрируюсь на том, как выполнить сравнение со значениями 100K. Это потребует двух шагов.
а) Написать библиотеку C ++ и связать ее с PHP, используя расширение. Google PHP-CPP. Существует структура, которая позволяет вам сделать это.
б) Внутри C / C ++ вам нужно создать структуру данных, которая имеет временную сложность O (n). n длина фраз, которые вы ищете. Обычно это называется структурой данных try. Это обычно используется для слов без пробела [не фраз]. но, конечно, вы можете написать свой собственный.
Вот ссылка, которая содержит слово реализация. иначе словарь.
http://www.geeksforgeeks.org/trie-insert-and-search/
Это занимает совсем немного памяти, так как число составляет 100K. Честно говоря, вам нужна большая система. Но когда вы ищете лучшую производительность, то память имеет тенденцию быть компромиссом.
Альтернативный подход
Только PHP. Здесь, извлеките фразы из вашего ввода текста. Преобразуйте их в хэш. Данные таблицы, которые вы содержите, также должны храниться в хэше. Нуждается в огромной памяти. Производительность здесь будет очень высокой, согласно поиску, также известному как O (1). Итак, для предложения из k слов. сложность вашего времени будет O (K-факториал).
Других решений пока нет …