![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 1 Всего: 73 |
Здравствуйте товарищи! Пишу поиск по своему сайту, и, решил немного заморочиться: сделать вывод результатов поиска (по базе идет с использованием индексов full text search) с небольшой частью текста в котором находится наибольшее число вхождений словосочетаний (фраз, слов) в тексте. Пример того что нужно сделать - http://www.yandex.ru. Путем недолгих раздумий, решил использовать разбиение по пробелу текстов и проверки в цикле схожести слова, хотя изначально и хотел использовать strpos и ему подобное (но к сожалению тут морфологии ни какой не будет, только точное совпадение). Так вот, в данной схеме используется similar_text по словам запроса и элементам массива слов найденных текстов. А теперь представим что массив при разбивке получается из, так к примеру, 20-30K элементов... что скажем так, очень сильно кушает память, да еще в добавок, считаем что чем больше слов в запросе (хоть и слова из менее чем трех символов не считаем вообще за слово), тем больше он этот массив крутит (т.е. x*y - 20k*3 = 60k циклов итерации!!!).
Может кто-то делал что-то подобное? Или возможно есть уже какие либо готовые решения на php.net (я правда ничего вразумительного не нашел). У меня сейчас есть такая идея: 1. Берем слово, обрезаем его (к примеру -3 символа), если оно не меньше определенной длинны. 2. Ищем позицию этого слова в тексте (strpos). 3. Смотрим схожесть текста (similar_text). Если она не менее 90%, делаем следующий шаг. Если меньше, ищем далее по тексту. Если не найдем, оставим первую фразу из текста. 4. Ищем перенос строки (или отсчитываем необзходимое количество символов) до вхождения слова, ищем перенос строки или `.` или `!` и т.п. после вхождения слова. Еще есть идея на счет поиска максимально похожего места в тексте, который бы совпадал с большинством слов запроса, но в данном случае из одного действия, вырастают десять. Еще нужно учитывать сам запрос пользователя. Если он хотел найти точное вхождение фразы целиком, то при обрезке текста нужно и это учесть (но это уже мысли вслух). В общем жду идей или еще лучше ссылок на алгоритмы подобной обработки текста. -------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: нет Всего: 454 |
Погоди... чем тебе штатный рейтинг соответствия не угодил?
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 1 Всего: 73 |
Akina, ты меня видимо не понял или я не точно написал. Прочитай еще раз внимательно то место где про вывод обрезанных результатов говорится, как у яндекса.
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 1 Всего: 73 |
И что - все уснули?
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| AntonioBanderaz |
|
|||
![]() Velichko Anton ![]() ![]() Профиль Группа: Участник Сообщений: 851 Регистрация: 28.4.2005 Где: Санкт-Петербург Репутация: 1 Всего: 18 |
Поищи доки по синтаксичему анализу и обработке строк... Я кода-то на перле похожую штуку делал, но там глюки с обрезкой слов происходят, иногда лишнее болдом делает, тебе прежде чем обрезать кусок слова надо отрезать не 3 символа, а нажодить окончание, а потом его резать... Ну а дальше искать вхождения и выделять слова....
-------------------- ГЫ... |
|||
|
||||
| Opik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 1918 Регистрация: 6.10.2004 Где: Рига Репутация: 3 Всего: 55 |
http://ee.php.net/mnogosearch
http://ee.php.net/manual/en/ref.aspell.php http://ee.php.net/manual/en/ref.pspell.php Это сообщение отредактировал(а) Opik - 8.9.2005, 08:56 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Для профи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |