Давайте создадим Unigram и позиционные проводки в Python с нуля на реальном наборе данных.
Это второй пост из серии «Поиск информации».
Нажмите здесь, чтобы проверить репозиторий git
Информационно-поисковая серия:
- «1. Введение"
- 2. Индексирование Unigram и позиционное индексирование
- 3. TF-IDF
- Еще не все…
Оглавление:
- Создание инвертированного индекса Unigram и выполнение сложных логических запросов
- Создание позиционных индексов и поиск фраз.
Введение
Вышеупомянутые два метода являются основными методами поиска документов (текстовых файлов), в которых мы пытаемся извлечь документы, задавая какой-либо запрос.
Чтобы правильно извлечь данные, сначала нам нужно проиндексировать данные.
Матрица инцидентности документа с термином:
В этом методе мы собираем все уникальные слова и формируем матрицу уникальных слов и документов. Отметьте 1 в ячейке, в которой есть слово в соответствующем документе.
Проблема:
- Чрезвычайно разреженная матрица
- Матрица очень большого размера при сохранении на диск
Используемые инструменты:
- НЛТК
- Панды
- NumPy
- Соленый огурец
Используемая предварительная обработка:
- Удаление стоп-слов
- Удаление знаков препинания
- Преобразовать в нижний регистр
- Стемминг
- Преобразование чисел в эквивалентные им слова
- Удаление заголовка
Инвертированный индекс Unigram:
Чтобы преодолеть проблемы документирования терминов, мы используем метод, называемый перевернутым индексом униграммы.
в этой технике мы храним весь список документов, содержащих слово. Набор этих списков для каждого слова называется списком постов.
Слова, которые мы здесь используем, называются словарными. И каждый из списка документов для слова называется проводками.
Шаги:
- Используйте идентификатор документа для всех документов (обычно индекс во время итерации).
- Предварительно обработайте текст
- Генерация токенов
- Для каждого токена в документе добавьте идентификатор документа.
- Повторите это для каждого документа.
- Если обнаруженный токен является новым токеном, которого нет в словаре, добавьте токен в словарь.
- Идентификаторы документов должны быть отсортированы для облегчения извлечения (но зависит от реализации).
- Также следите за количеством документов, из которых состоит каждое слово (будет использоваться для интеллектуального извлечения логических запросов).
- Обрабатывать неправильные/несуществующие токены
Извлечение сложного запроса:
- Разделите команды и токены
- Предварительно обработайте токены
- Сначала примените команду not к соответствующим словам и замените список токенов списком постов этого конкретного слова.
- Затем слева направо применяем команды «и» «или»
- Вернуть окончательные слияния
Позиционное индексирование:
Позиционное индексирование почти похоже на инвертированное индексирование Unigram, при позиционном индексировании мы дополнительно сохраняем позицию всех вхождений токена, связанных с идентификатором документа.
Это помогает лучше искать запросы без логического поиска.
Одно важное отличие состоит в том, что в этом мы не будем удалять стоп-слова.
Шаги:
- Используйте идентификатор документа для каждого документа (обычно индексируется во время итерации)
- Предварительно обработайте текст
- Генерация токенов
- Для каждого токена в документе добавьте пару (documentID, positionID).
- Повторите это для каждого документа.
- Если обнаруженный токен является новым токеном, которого нет в словаре, добавьте токен в словарь.
- Идентификаторы документов должны быть отсортированы для облегчения извлечения (но зависит от реализации).
- Также следите за количеством документов, из которых состоит каждое слово (будет использоваться для интеллектуального извлечения логических запросов).
- Обрабатывать неправильные/несуществующие токены
Извлечение запроса:
- Возьмите строку запроса
- Предварительно обработать весь запрос
- Конвертировать в токены
- Возьмите пару (документ, позиция) для первого токена
- для каждой пары:
- для всех следующих токенов
- соответствует, если следующий токен существует в (документ в позиции ++)
- если следующего токена не существует, просто разорвите цикл
Наблюдения:
- Инвертированный индекс Unigram строится быстрее, но не очень полезен из-за необходимости логических запросов.
- Позиционное индексирование полезно для поиска по фразе, но его создание занимает мало времени.
- Память: Unigram ‹ Позиционная
- Скорость сборки: Unigram › Позиционное
- Скорость запроса: Unigram › Позиционное
Предположения:
- Заголовок не содержит ничего важного
- И футер не надо убирать
Статистика:
Нажмите здесь, чтобы проверить репозиторий git
Информационно-поисковая серия:
- «1. Введение"
- 2. Индексирование Unigram и позиционное индексирование
- 3. TF-IDF
- Еще не все…