Давайте создадим Unigram и позиционные проводки в Python с нуля на реальном наборе данных.

Это второй пост из серии «Поиск информации».

Нажмите здесь, чтобы проверить репозиторий git

Информационно-поисковая серия:

Оглавление:

  • Создание инвертированного индекса Unigram и выполнение сложных логических запросов
  • Создание позиционных индексов и поиск фраз.

Введение

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

Чтобы правильно извлечь данные, сначала нам нужно проиндексировать данные.

Матрица инцидентности документа с термином:

В этом методе мы собираем все уникальные слова и формируем матрицу уникальных слов и документов. Отметьте 1 в ячейке, в которой есть слово в соответствующем документе.

Проблема:

  • Чрезвычайно разреженная матрица
  • Матрица очень большого размера при сохранении на диск

Используемые инструменты:

  • НЛТК
  • Панды
  • NumPy
  • Соленый огурец

Используемая предварительная обработка:

  • Удаление стоп-слов
  • Удаление знаков препинания
  • Преобразовать в нижний регистр
  • Стемминг
  • Преобразование чисел в эквивалентные им слова
  • Удаление заголовка

Инвертированный индекс Unigram:

Чтобы преодолеть проблемы документирования терминов, мы используем метод, называемый перевернутым индексом униграммы.

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

Слова, которые мы здесь используем, называются словарными. И каждый из списка документов для слова называется проводками.

Шаги:

  • Используйте идентификатор документа для всех документов (обычно индекс во время итерации).
  • Предварительно обработайте текст
  • Генерация токенов
  • Для каждого токена в документе добавьте идентификатор документа.
  • Повторите это для каждого документа.
  • Если обнаруженный токен является новым токеном, которого нет в словаре, добавьте токен в словарь.
  • Идентификаторы документов должны быть отсортированы для облегчения извлечения (но зависит от реализации).
  • Также следите за количеством документов, из которых состоит каждое слово (будет использоваться для интеллектуального извлечения логических запросов).
  • Обрабатывать неправильные/несуществующие токены

Извлечение сложного запроса:

  • Разделите команды и токены
  • Предварительно обработайте токены
  • Сначала примените команду not к соответствующим словам и замените список токенов списком постов этого конкретного слова.
  • Затем слева направо применяем команды «и» «или»
  • Вернуть окончательные слияния

Позиционное индексирование:

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

Это помогает лучше искать запросы без логического поиска.

Одно важное отличие состоит в том, что в этом мы не будем удалять стоп-слова.

Шаги:

  • Используйте идентификатор документа для каждого документа (обычно индексируется во время итерации)
  • Предварительно обработайте текст
  • Генерация токенов
  • Для каждого токена в документе добавьте пару (documentID, positionID).
  • Повторите это для каждого документа.
  • Если обнаруженный токен является новым токеном, которого нет в словаре, добавьте токен в словарь.
  • Идентификаторы документов должны быть отсортированы для облегчения извлечения (но зависит от реализации).
  • Также следите за количеством документов, из которых состоит каждое слово (будет использоваться для интеллектуального извлечения логических запросов).
  • Обрабатывать неправильные/несуществующие токены

Извлечение запроса:

  • Возьмите строку запроса
  • Предварительно обработать весь запрос
  • Конвертировать в токены
  • Возьмите пару (документ, позиция) для первого токена
  • для каждой пары:
  • для всех следующих токенов
  • соответствует, если следующий токен существует в (документ в позиции ++)
  • если следующего токена не существует, просто разорвите цикл

Наблюдения:

  • Инвертированный индекс Unigram строится быстрее, но не очень полезен из-за необходимости логических запросов.
  • Позиционное индексирование полезно для поиска по фразе, но его создание занимает мало времени.
  • Память: Unigram ‹ Позиционная
  • Скорость сборки: Unigram › Позиционное
  • Скорость запроса: Unigram › Позиционное

Предположения:

  • Заголовок не содержит ничего важного
  • И футер не надо убирать

Статистика:

Нажмите здесь, чтобы проверить репозиторий git

Информационно-поисковая серия: