Индексация текста

IvanShumkov

Новичок
Индексация текста

Перерыл весь форум, но не нашел ничего толкового по теме созадния индекса, для последующего поиска.

Вроде сложностей никаких нет. Парсим текст. Удаляем лишние символы, стоп и короткие слова. И получаем масив с пригодными для индекса словами. Проблема заключается в том, что я не могу придумать, как как ставить количество повторнений слова в тексте.

-~{}~ 03.03.05 23:52:

Может быть вот-так? Но как-то не очень изящно выглядит.

PHP:
// Чистим текст
$text = preg_replace("/<[^>]*>/s", " ", $text);
$text = preg_replace("/<!--.*?-->/s", " ", $text);
$text = preg_replace_callback("/&[a-zA-Z0-9#]*?;/", array("Indexer", "_esc2char"), $text);
$text = preg_replace("/[^a-zA-Zа-яА-Я0-9 ]/", " ", $text);
$text = preg_replace("/\s+/s", " ", $text);
$text = strtolower($text);
		
// Парсим текст
$wordsTemp = array();
$pos = 0;
while (1)
{
	$newPos = strpos($text, " ", $pos);
	if ($newPos === false)
	{
		$word = substr($text, $pos);
		if ((strlen($word) > 3) && !array_key_exists($word, $this->stopWords)) @$words[$word]++;
		break;
	}
	$word = substr($text, $pos, $newPos - $pos);
	if ((strlen($word) > 3) && !array_key_exists($word, $this->stopWords)) @$words[$word]++;
	$pos = $newPos + 1;
}
 

SelenIT

IT-лунатик :)
$text = preg_replace("/<[^>]*>/s", " ", $text);
$text = preg_replace("/<!--.*?-->/s", " ", $text);
[m]strip_tags[/m]?
while (1) ... // и дальше
{
[m]explode[/m] + [m]array_count_values[/m]?

Вот только зачем считать повторения? Имхо, большую ценность имеют как раз позиции слов в исходном тексте...
 

IvanShumkov

Новичок
Автор оригинала: SelenIT
Вот только зачем считать повторения? Имхо, большую ценность имеют как раз позиции слов в исходном тексте...
Верно. А как это делается?
Таблица с индексами (ид страницы, слово, положение в исходном тексте) так? А как организовывается поиск? Разве не правильно "навешивать очки" если слово повторяется или оно в заголовке.

-~{}~ 04.03.05 00:30:

Вот так можно считать позицию, а что делать, если слово два раза повторяется? Последние значение позиции замещает первое.
PHP:
while (1)
{
	$newPos = strpos($text, " ", $pos);
	if ($newPos === false)
	{
		$word = substr($text, $pos);
		if ((strlen($word) > 3) && !array_key_exists($word, $this->stopWords)) @$words[$word] = $pos;
		break;
	}
	$word = substr($text, $pos, $newPos - $pos);
	if ((strlen($word) > 3) && !array_key_exists($word,  $this->stopWords)) @$words[$word] = $pos;
	$pos = $newPos + 1;
}
 

SelenIT

IT-лунатик :)
А разве важно, с какого по счету символа текста начинается слово? По-моему, важен порядковый номер самого слова. Разбиение текста в массив ([m]explode[/m] или [m]preg_split[/m]) решает проблему - позиция слова есть ключ в массиве. И ни к чему громоздкие циклы.

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

P.S. И нужно ли вообще все это, когда есть полнотекстовый поиск?
 

IvanShumkov

Новичок
Автор оригинала: SelenIT
А разве важно, с какого по счету символа текста начинается слово? По-моему, важен порядковый номер самого слова. Разбиение текста в массив ([m]explode[/m] или [m]preg_split[/m]) решает проблему - позиция слова есть ключ в массиве. И ни к чему громоздкие циклы.
[m]explode[/m], потом пробигаемся и удаляем из массива короткие и стопслова.

P.S. И нужно ли вообще все это, когда есть полнотекстовый поиск?
Помойму поиск по индексу более быстрый и правильный. А так надо все тексты в базу забивать.

-~{}~ 04.03.05 01:47:

А они достаточно тяжелые.

-~{}~ 04.03.05 15:29:

А "навесить очки" можно уже при выборке по индексной таблице, причем можно учесть разные факторы релевантности - общую частоту встречаемости искомых слов в тексте, близость первого вхождения слова к началу, а при поиске по нескольким словам - еще и близость их позиций друг к другу...
Где можно подробней запросы эти посмотреть?
 
Сверху