Как вы индексируете файлы для быстрого поиска? - PullRequest
7 голосов
/ 10 мая 2009

В настоящее время Microsoft и Google будут индексировать файлы на вашем жестком диске, чтобы вы могли быстро искать их содержимое.

Что я хочу знать, как они это делают? Можете ли вы описать алгоритм?

Ответы [ 3 ]

12 голосов
/ 10 мая 2009

Простой случай - инвертированный индекс.

Самый простой алгоритм это просто:

  • проверять файл на наличие слов, создавая список уникальных слов
  • нормализуйте и отфильтруйте слова
  • поместите запись, связывающую это слово с файлом в вашем индексе

В деталях все становится сложнее, но основные принципы те же.

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

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

Существуют оптимизации для уменьшения объема хранения, методы проверки локальности слов (например, "это" рядом с "этим" в документе).

Но это фундаментальный способ, которым это делается.

10 голосов
/ 10 мая 2009

Вот действительно базовое описание; для более подробной информации, вы можете прочитать этот учебник (бесплатно онлайн): http://informationretrieval.org/¹

1). Для всех файлов создайте индекс. Индекс состоит из всех уникальных слов, которые встречаются в вашем наборе данных (так называемый «корпус»). С каждым словом связан список идентификаторов документов; каждый идентификатор документа относится к документу, который содержит слово.

Вариации: иногда, когда вы генерируете индекс, вы хотите игнорировать стоп-слова ("a", "the" и т. Д.). Однако вы должны быть осторожны («быть или не быть» - это реальный запрос, состоящий из стоп-слов).

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

2) Когда пользователь вводит запрос, ищите соответствующие списки и объединяйте их. Если это строгий логический запрос, процесс довольно прост - для AND, docid должен присутствовать во всех списках слов, для OR, хотя бы в одном списке слов и т. Д.

3) Если вы хотите оценить свои результаты, есть несколько способов сделать это, но основная идея состоит в том, чтобы использовать частоту, с которой слово встречается в документе, по сравнению с частотой, на которую вы ожидаете встречаются в любом документе в корпусе, как сигнал о том, что документ более или менее актуален. Смотри учебник.

4) Вы также можете сохранять позиции слов для выведения фраз и т. Д.

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


¹ ранее на http://www -csli.stanford.edu / ~ hinrich / information-retrieval-book.html , доступный через устройство обратной связи

2 голосов
/ 10 мая 2009

Вы всегда можете посмотреть что-то вроде Apache Lucene .

Apache Lucene - это высокопроизводительная, полнофункциональная библиотека для поиска текста, полностью написанная на Java. Это технология, подходящая практически для любого приложения, требующего полнотекстового поиска, особенно кросс-платформенного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...