eshum

Рейтинг
17
Регистрация
12.01.2004
Должность
Programmer

А зачем хранить дерево?

Если предполагается искать только по именам файлов (или по полному пути) то можно представить файл как документ состоящий из слов которые содержатся в имени файла. И строить индекс по этим словам.

Как писал Rusl


...либо хранить все шинглы и при поиске брать только кратные искомому. Но это только для документов разных рангов! Для документов же одних рангов, будем брать все шинглы имеющие кратность соответствующую данному рангу. Например...

Кажется понял. Т.е. Вы предпологаете что документы разной длины всегда различны если они не находятся в пределах одного ранга.

Да, надо еще напомнить начальству что поиск с учетом морфологии потребует в 3-4 раза больше серверов, чем поиск без оной :)

Как писал Rusl


Сравнить 3-й с 1-м рангом при кратности шинглов 10 нельзя по принципиальным причинам (иначе Вам необходимо хранить для 3-го ранга шинглы кратные 10, что самом по себе убивает весь смысл в разделении на ранги).

3-й ранг сравнивается с 1-м точно так же как и 1-й с 3-м. Какая разница? Просто для сравнения из шинглов 1го ранга кратных 10 берутся только шинглы кратные 40-ка.

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

А так, при поиске документа 3-го ранга среди ранее сохраненных шинглах документов 1-х рангов прийдется либо пересчитывать шинглы "на лету" для всех документов 1-го ранга, либо хранить все шинглы и при поиске брать только кратные искомому.

Я имею ввиду ситуацию, когда документы добавляются в коллекцию в произвольном порядке (не в порядке возрастания/убывания их длины), что характерно для большинства поисковых машин.

Как писал Rusl


Просто сравнивая 1-ый ранг (шинглы кратны 10) с 3-им (шинглы кратны 40), из первого для сравнения выбираем только кратные 40-ка. Понимаете?

А если прийдется сравнивать наоборот, 3-й ранг (шинглы кратны 40) с 1-м рангом (шинглы кратны 10), ведь 40 не кратно 10?

Как писал Rusl


Каждый десятый имел ввиду конечно кратный 10. Не имеет никакого значения какую кратность выбрать (естественно при этом нужно исходить из удовлетворительного соотношения "качество"-"количество шинглов (быстрота обработки)").

Думаю будут погрешности на "границах рангов", поясню на примере:

Имеем ранги:

1-й ранг от 0 до 99 слов, отбираются шинглы с кратные (по значению) 10

2-й ранг от 100 до 150 слов, отбираются шинглы кратные 15

Имеем два документа с отличием в одно слово:

1-й документ содержит 99 слов (1-й ранг)

2-й документ содержит 100 слов (2-й ранг)

В результате для 1-го документа отберутся шинглы кратные 10, для 2-го кратные 15. Получается шинглы не совпадут.


2. Короткие документы размножать нет смысла. Лучше либо зациклить получение шинглов (то есть текст-кольцо)...

Действительно так проще.

...либо уменьшать кратность выбираемых шинглов, так, чтобы они были "совместимы" с шинглами больших документов (например для текста, где количество слов от 0 до 99 выбираем каждый 10 шингл, 100-999, каждый 20-й, больше 1000 каждый 40-й. Таким образом шинглы из коротких документов буду сравними с шинглами из длинных и можно определить степень включенности меньшего в большее, хотя и с большей погрешность чем документы одних рангов).

Мне кажется так работать не будет, смысл выбирать не каждый 10 шингл, а каждый шингл хеш значение которого кратно 10. Т.е. для двух документов одинаковой длины количество отобраных шинглов может быть различным.

Как писал InSAn

Хотя, для себя я уже вроде решил...
При индексировании страниц берется сугубо контент (удаляются все теги) и вычисляется его контрольная сумма.
При индексации следующей страницы - сверяется контрольная сумма текущей страницы и производится проверка наличия такой суммы среди проиндексированных страниц.
Страницы с одинаковой контрольной суммой проверяются методом шинглов на похожесть.
Критика будет? ;)

Мне это представляется примерно так:

1) Берется контент страницы освобожденный от тегов

2) Если размер страницы меньше некого значения, контент страницы циклически размножается до достижения нужного размера

3) Для страницы вычисляются набор шинглов

4) Из набора шинглов отбираются только кратные некому числу, т.е. их будет не больше чем это число

5) Для каждого полученого шингла ищем дубликат среди хранилища шинглов уже ВСЕХ ранее добавленных страниц

6) Ищем документы у которых совпадает один или несколько шинглов с искомым (необходимое количество совпадений шинглов можно выяснить эксперементально на реальных данных).

7) Для надежности сравниваем полученный список документов с искомым при помощи методов нечеткого сравнения.

8) Если решили что дубликатов документа ранее несуществовало - ДОБАВЛЯЕМ его шинглы в некое хранилище по которому мы ищем в п. 5.

п. 3 - какую хеш функцию подобрать?

п. 4 - неясно какое это должно быть число?

п. 5 - мне кажется что такой поиск не займет много времени, на небольших объемах подойдет даже sql база.

п. 6 - сколько должно быть совпадений шинглов чтобы документы считать идентичными?

Если я правильно понимаю, то метод шинглов позволяет получить одно или несколько хеш значений для каждого документа характеризующих часть документа.

Тогда при добавлении нового документа в индекс, для него вычисляются эти хеш значения, которые ищутся среди хеш значений уже существующих в индексе документов. В результате поиска получается ограниченный набор документов "вероятно похожих" на искомый. Наверно это не сильно ресурсоемкий способ.

На последнем этапе, для каждого документа из полученного списка "вероятно похожих" можно вычислить редакционное расстояние, например методом Левенштейна.

Наверное кроме как полным перебором никак не получится.

Т.е. по шаблону (поиск* запрос*) находятся все слова из словаря, затем для каждого слова извлекается постлист из индекса, после чего полученные постлисты объединяются по OR.

123 4
Всего: 37