Forum Webscript.Ru

Программирование => Теория, алгоритмы и стандарты => Тема начата: AlieN от 01 Марта 2006, 02:39:48

Название: Релеватность и поиск
Отправлено: AlieN от 01 Марта 2006, 02:39:48
Вот собственно задался вопросом, как это реализовывать.
Допустим есть некая база товаров, у каждой записи есть отдельное тестовое поле индекс, куда скинуты в порядке значимости все остальные текстовые поля, всякая пурга удалена и т.д. и т.п..

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

Искал в инете статьи, ничего путного не нашел.
Название: Релеватность и поиск
Отправлено: Greg от 01 Марта 2006, 07:20:23
я тоже сейчас озадачен этим вопросом. есть такие мысли:
по твоему вопросу
Цитировать
как реализовать поиск, где релевантность будет оцениваться близостью поисковой фразы к началу строки?

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

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

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

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

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

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

Название: Релеватность и поиск
Отправлено: CGVictor от 01 Марта 2006, 10:46:20
AlieN
Вытаскиваешь из базы все записи, где есть вхождение подстроки, потом сортируешь в соответствии со своим алгоритмом релевантности. Сортировать, скорее всего, как и реализовывать алгоритм, придется уже в коде, а не на уровне базы.
Название: Релеватность и поиск
Отправлено: AlieN от 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


Естественно пока ничего не проверял, даже немного сомневаюсь в работоспособности запроса. Но всё же.
Название: Релеватность и поиск
Отправлено: Greg от 01 Марта 2006, 12:23:15
AlieN
мне кажется, что тогда нужно искать сначала полное совпадение фразы + позиция в строке, а затем уже слова по отдельности или фраза минус одно слово, минус два слова и т.д. - т.е. сделать переборку
Название: Релеватность и поиск
Отправлено: AlieN от 01 Марта 2006, 12:30:26
Цитировать
Greg:
AlieN мне кажется, что тогда нужно искать сначала полное совпадение фразы + позиция в строке, а затем уже слова по отдельности или фраза минус одно слово, минус два слова и т.д. - т.е. сделать переборку

На коде покажи, непонимаю тя.
Название: Релеватность и поиск
Отправлено: Greg от 01 Марта 2006, 12:58:39
AlieN
как я тебе могу написать когда я ещё сам ниче не понимаю))) сначала нужно логику алгоритма выдумать, а потом уж код, а то телегу поперед лошади получается :)
Название: Релеватность и поиск
Отправлено: AlieN от 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
Название: Релеватность и поиск
Отправлено: Greg от 01 Марта 2006, 14:33:23
AlieN
мне кажется, что CGVictor прав - лучше вытаскивать строки и работать с ними каким-нить языком (я делаю на пхп)

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

единственное, что тут сложное - алгоритм определения релевантности
Название: Релеватность и поиск
Отправлено: CGVictor от 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

И не напрягайте базу - это не ее задача.
Название: Релеватность и поиск
Отправлено: AlieN от 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
Название: Релеватность и поиск
Отправлено: ThE0ReTiC от 01 Марта 2006, 21:39:38
Цитировать
Greg:
мне кажется, что тогда нужно искать сначала полное совпадение фразы

имхо искать по отдельным словам, если не задано искать точное совпадение, например кавычками, учитывая близость слов дур к другу (например в пределах одного предложения или в разных предложениях)
А с морфологией что?
как насчет
"я хотел бы заказатьчашку кофе"
?
Название: Релеватность и поиск
Отправлено: Greg от 01 Марта 2006, 21:43:42
ThE0ReTiC
морфология - это это уже я думаю (по крайней мере для себя) следующий этап, пока хочется начать с более простого
Название: Релеватность и поиск
Отправлено: AlieN от 02 Марта 2006, 00:41:25
Про морфологию я думаю сделать как на bankreferatov.com: вместо окончаний звезды ставить.
Название: Релеватность и поиск
Отправлено: CGVictor от 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)."
";
?>

Вывод сортировать по убыванию.
Название: Релеватность и поиск
Отправлено: CGVictor от 02 Марта 2006, 10:31:45
AlieN Greg
В ту же копилку
http://www.google.com/search?ie=windows-1251&oe=UTF-8&domains=xpoint.ru&sitesearch=xpoint.ru&q=%EF%EE%E8%F1%EA&btnG=%C8%F1%EA%E0%F2%FC%21
Название: Релеватность и поиск
Отправлено: Yukko от 02 Марта 2006, 12:20:32
http://forum.searchengines.ru/showthread.php?t=37822
http://forum.searchengines.ru/showthread.php?t=37298
Название: Релеватность и поиск
Отправлено: CGVictor от 02 Марта 2006, 13:17:13
Yukko
Да, кстати.
Название: Релеватность и поиск
Отправлено: Greg от 10 Марта 2006, 11:32:18
с морфологией пока погожу. вот такой вопрос: где лучше хранить индекс: в базе или файле, как описано здесь - http://spectator.ru/technology/php/php_search ?

где быстрее будет работать как со стороны индексатора, так и со стороны поиска?
Название: Релеватность и поиск
Отправлено: Yukko от 11 Марта 2006, 21:45:20
Greg, если на все свои проекты делать правильный поиск с обратными индексами и другой фигней, то можно стать стареньким дедушкой дотачивая свой поисковый движок для одного своего проекта ;) ;) ;)
Название: Релеватность и поиск
Отправлено: Greg от 13 Марта 2006, 07:07:54
Yukko
просто поиск пишу впервые и хотел бы с ним разобраться досконально и поэтапно

кстати индексатор сейчасработает так: проходит по всем ссылкам страниц, собирает уникальные адреса внутри сервера в массив, а затем открывает страницы по этим адресам и индексирует их.

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

штука такая, что около весь процесс занимает 7 минут (1200 страниц): бОльшая часть времени уходит на поиск ссылок, а потом на индексацию страниц. Весь индекс хранится в тхт-файле (с 1200 страниц - 2,11 Мб)
Название: Re: Релеватность и поиск
Отправлено: memas от 01 Октября 2018, 13:45:32
это, наверное, самый лучший алгоритм.
скажите, а сколько вы лет в этой сфере??