Автор Тема: Релеватность и поиск  (Прочитано 19303 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AlieN

  • Абыр!=)
  • Ветеран
  • *****
  • Сообщений: 1315
  • +0/-1
  • 2
    • Просмотр профиля
Релеватность и поиск
« : 01 Марта 2006, 02:39:48 »
Вот собственно задался вопросом, как это реализовывать.
Допустим есть некая база товаров, у каждой записи есть отдельное тестовое поле индекс, куда скинуты в порядке значимости все остальные текстовые поля, всякая пурга удалена и т.д. и т.п..

Вопрос в другом, как реализовать поиск, где релевантность будет оцениваться близостью поисковой фразы к началу строки?

Искал в инете статьи, ничего путного не нашел.
The Chemical Brothers - Hey Boy Hey Girl (User Friendly Mix)
Peter Presta pres - Set Sail(Peter Presta Apple Jaxx Dub) She S.Sunshine Feat Mila - Bring The Beat Back (Club Mix) Jerry Ropero - Home Alone (Dub Mix)

Оффлайн Greg

  • пинёг
  • Ветеран
  • *****
  • Сообщений: 618
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.bsfera.ru
Релеватность и поиск
« Ответ #1 : 01 Марта 2006, 07:20:23 »
я тоже сейчас озадачен этим вопросом. есть такие мысли:
по твоему вопросу
Цитировать
как реализовать поиск, где релевантность будет оцениваться близостью поисковой фразы к началу строки?

1.очевидно, что нужно искать вхождение подстроки в строку (функции зависят от языка). вычислить длину строки и определить относительную величину, которая и покажет, насколько близко искомая строка находится к началу строки, в которой ищем

2. к релевантности нужно наверное еще отнести частоту вхождения слова или фразы в строку, в которой ищем. можно с учетом словоформ, что сложнее организовать

3. в третьих нужно определить насколько важен текст. т.е. если в строке содержаться HTML-теги, то вероятнее всего, что текст в теге

, будет важнее, чем в теге

, в котором могут содержаться только дополнительные сведения

вот пока такие мысли. будем думать вместе? :)

Пространные размышления об ИТ и все что вокруг

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Релеватность и поиск
« Ответ #2 : 01 Марта 2006, 10:46:20 »
AlieN
Вытаскиваешь из базы все записи, где есть вхождение подстроки, потом сортируешь в соответствии со своим алгоритмом релевантности. Сортировать, скорее всего, как и реализовывать алгоритм, придется уже в коде, а не на уровне базы.
LJ: Backslashed life (rss)

Оффлайн AlieN

  • Абыр!=)
  • Ветеран
  • *****
  • Сообщений: 1315
  • +0/-1
  • 2
    • Просмотр профиля
Релеватность и поиск
« Ответ #3 : 01 Марта 2006, 11:57:30 »
Цитировать
Greg:
я тоже сейчас озадачен этим вопросом. есть такие мысли: по твоему вопросу

как реализовать поиск, где релевантность будет оцениваться близостью поисковой фразы к началу строки?

 1.очевидно, что нужно искать вхождение подстроки в строку (функции зависят от языка). вычислить длину строки и определить относительную величину, которая и покажет, насколько близко искомая строка находится к началу строки, в которой ищем

2. к релевантности нужно наверное еще отнести частоту вхождения слова или фразы в строку, в которой ищем. можно с учетом словоформ, что сложнее организовать

3. в третьих нужно определить насколько важен текст. т.е. если в строке содержаться HTML-теги, то вероятнее всего, что текст в теге

, будет важнее, чем в теге

, в котором могут содержаться только дополнительные сведения

вот пока такие мысли. будем думать вместе?


Появилась мысль насчет пункта №1,2 (после изучения структуры базы phpbb)
Итак.
1) Есть база всех слов, которые есть в товарах c двумя полями:
ID, слово
2) Есть таблица пересечений слов и товаров
ID слова, ID товара, первое началие слова относительно начала строки
у таблицы товаров добавляем дополнительное поле - кол-во слов.

Далее поиск.
1) Определеям ID слов и пихаем их в массив.
2)
Тут математика да и только: если найдено слово оцениваться его знаимочть вот так: сумма_всего("колво слов"-"цена входения"/("колво слов"+1))

Примерный вид SQL-запроса.
Цитировать

SELECT `produсts`.*, SUM((`products`.`words_in`-`products_words_in`.`rate`)/`products`.`words_in`-1) AS `page_rating`
FROM `products`,`products_words_in`
WHERE `products_words_in`.`product_id`=`products`.`id`
AND `products_words_in`.`word_id` IN (1,2,4,5)
GROUP BY `produсts`.`id
ORDER BY `page_rating` DESC




Только у данного метода релавантности я уже обнаружил один минус:
Допустим поисковая строка чашка кофе.
Поиск идем по этим строчкам:
Кофе я не пью, где моя чашка чая.
7/7+1/7=1.142
Официант, я давно сделал заказ, где моя чашка кофе.
2/8+1/8=0.25


Естественно пока ничего не проверял, даже немного сомневаюсь в работоспособности запроса. Но всё же.
« Последнее редактирование: 01 Марта 2006, 12:03:27 от AlieN »
The Chemical Brothers - Hey Boy Hey Girl (User Friendly Mix)
Peter Presta pres - Set Sail(Peter Presta Apple Jaxx Dub) She S.Sunshine Feat Mila - Bring The Beat Back (Club Mix) Jerry Ropero - Home Alone (Dub Mix)

Оффлайн Greg

  • пинёг
  • Ветеран
  • *****
  • Сообщений: 618
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.bsfera.ru
Релеватность и поиск
« Ответ #4 : 01 Марта 2006, 12:23:15 »
AlieN
мне кажется, что тогда нужно искать сначала полное совпадение фразы + позиция в строке, а затем уже слова по отдельности или фраза минус одно слово, минус два слова и т.д. - т.е. сделать переборку
Пространные размышления об ИТ и все что вокруг

Оффлайн AlieN

  • Абыр!=)
  • Ветеран
  • *****
  • Сообщений: 1315
  • +0/-1
  • 2
    • Просмотр профиля
Релеватность и поиск
« Ответ #5 : 01 Марта 2006, 12:30:26 »
Цитировать
Greg:
AlieN мне кажется, что тогда нужно искать сначала полное совпадение фразы + позиция в строке, а затем уже слова по отдельности или фраза минус одно слово, минус два слова и т.д. - т.е. сделать переборку

На коде покажи, непонимаю тя.
The Chemical Brothers - Hey Boy Hey Girl (User Friendly Mix)
Peter Presta pres - Set Sail(Peter Presta Apple Jaxx Dub) She S.Sunshine Feat Mila - Bring The Beat Back (Club Mix) Jerry Ropero - Home Alone (Dub Mix)

Оффлайн Greg

  • пинёг
  • Ветеран
  • *****
  • Сообщений: 618
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.bsfera.ru
Релеватность и поиск
« Ответ #6 : 01 Марта 2006, 12:58:39 »
AlieN
как я тебе могу написать когда я ещё сам ниче не понимаю))) сначала нужно логику алгоритма выдумать, а потом уж код, а то телегу поперед лошади получается :)
Пространные размышления об ИТ и все что вокруг

Оффлайн AlieN

  • Абыр!=)
  • Ветеран
  • *****
  • Сообщений: 1315
  • +0/-1
  • 2
    • Просмотр профиля
Релеватность и поиск
« Ответ #7 : 01 Марта 2006, 14:12:02 »
Близость между словами можно искать опять же на позиции слов.
допустим
... FROM `products_words_in` AS `t1`,``products_words_in` AS `t2`
MIN(`t1`.`rate`-`t2`.`rate`) AS `nearing`
.....
ORDER BY `neadring` ASC
The Chemical Brothers - Hey Boy Hey Girl (User Friendly Mix)
Peter Presta pres - Set Sail(Peter Presta Apple Jaxx Dub) She S.Sunshine Feat Mila - Bring The Beat Back (Club Mix) Jerry Ropero - Home Alone (Dub Mix)

Оффлайн Greg

  • пинёг
  • Ветеран
  • *****
  • Сообщений: 618
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.bsfera.ru
Релеватность и поиск
« Ответ #8 : 01 Марта 2006, 14:33:23 »
AlieN
мне кажется, что CGVictor прав - лучше вытаскивать строки и работать с ними каким-нить языком (я делаю на пхп)

примерно так
1. достаем строку
2. обрабатываем её, создаем для неё показатель релевантности по отношению к строке запроса
3. заносим этот показатель вместе с ид документа (записи в таблице базы) в массив
(после обработки всех строк)
4. сортируем по показателю
5. выводим

единственное, что тут сложное - алгоритм определения релевантности
Пространные размышления об ИТ и все что вокруг

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Релеватность и поиск
« Ответ #9 : 01 Марта 2006, 15:20:37 »
Greg AlieN
Вот вам короткий алгоритм:
$query = "какая-то фигня";
$text1 = "какая-то фигня очень часто попадается в незначащих темах на этом форуме";
$text2 = "спам - ненужная информация, какая-то фигня, чаще всего в почтовых системах";
function get_relevance($query,$text) {
  $tmp = substr($text,0,(strpos($text,$query)+strlen($query)));
  if($tmp!==false) {
      return similar_text($query,$tmp);
    } else {
      return 0;
    }
}

http://php.rinet.ru/manual/ru/function.similar-text.php
http://php.rinet.ru/manual/ru/function.levenshtein.php

И не напрягайте базу - это не ее задача.
LJ: Backslashed life (rss)

Оффлайн AlieN

  • Абыр!=)
  • Ветеран
  • *****
  • Сообщений: 1315
  • +0/-1
  • 2
    • Просмотр профиля
Релеватность и поиск
« Ответ #10 : 01 Марта 2006, 20:59:56 »
<?
$query "какая-то фигня";
$text1 "какая-то фигня очень часто попадается в незначащих темах на этом форуме";
$text2 "спам - ненужная информация, какая-то фигня, чаще всего в почтовых системах";
function 
get_relevance($query,$text) {
  
$tmp =  substr($text,0,(strpos($text,$query)+strlen($query
)));
  if(
$tmp!==false) {
      return 
similar_text($query,$tmp);
    } else {
      return 
0;
    }
}
echo 
"Text1 - ".get_relevance($query,$text1)."
"
;
echo 
"Text2 - ".get_relevance($query,$text2)."
"
;
?>

Результат исполнения
Цитировать
Text1 - 14
Text2 - 14
The Chemical Brothers - Hey Boy Hey Girl (User Friendly Mix)
Peter Presta pres - Set Sail(Peter Presta Apple Jaxx Dub) She S.Sunshine Feat Mila - Bring The Beat Back (Club Mix) Jerry Ropero - Home Alone (Dub Mix)

Оффлайн ThE0ReTiC

  • Главный по тарелочкам
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 4041
  • +2/-0
  • 2
    • Просмотр профиля
    • http://
Релеватность и поиск
« Ответ #11 : 01 Марта 2006, 21:39:38 »
Цитировать
Greg:
мне кажется, что тогда нужно искать сначала полное совпадение фразы

имхо искать по отдельным словам, если не задано искать точное совпадение, например кавычками, учитывая близость слов дур к другу (например в пределах одного предложения или в разных предложениях)
А с морфологией что?
как насчет
"я хотел бы заказатьчашку кофе"
?
AS IS...

Оффлайн Greg

  • пинёг
  • Ветеран
  • *****
  • Сообщений: 618
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.bsfera.ru
Релеватность и поиск
« Ответ #12 : 01 Марта 2006, 21:43:42 »
ThE0ReTiC
морфология - это это уже я думаю (по крайней мере для себя) следующий этап, пока хочется начать с более простого
Пространные размышления об ИТ и все что вокруг

Оффлайн AlieN

  • Абыр!=)
  • Ветеран
  • *****
  • Сообщений: 1315
  • +0/-1
  • 2
    • Просмотр профиля
Релеватность и поиск
« Ответ #13 : 02 Марта 2006, 00:41:25 »
Про морфологию я думаю сделать как на bankreferatov.com: вместо окончаний звезды ставить.
The Chemical Brothers - Hey Boy Hey Girl (User Friendly Mix)
Peter Presta pres - Set Sail(Peter Presta Apple Jaxx Dub) She S.Sunshine Feat Mila - Bring The Beat Back (Club Mix) Jerry Ropero - Home Alone (Dub Mix)

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Релеватность и поиск
« Ответ #14 : 02 Марта 2006, 10:28:37 »
AlieN
Да, так лучше ;)
$query = "какая-то фигня";
$text1 = "какая-то фигня очень часто попадается в незначащих темах на этом форуме";
$text2 = "спам - ненужная информация, какая-то фигня, чаще всего в почтовых системах";
function get_relevance($query,$text) {
  $tmp =   substr($text,0,(strpos($text,$query)+strlen($query)));
  if($tmp!==false) {
      return levenshtein($query,$tmp);
    } else {
      return 0;
    }
}
echo "Text1 - ".get_relevance($query,$text1)."
";
echo "Text2 - ".get_relevance($query,$text2)."
";
?>

Вывод сортировать по убыванию.
LJ: Backslashed life (rss)

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28