Предполагая, что большая часть текста представляет собой статический текст на английском языке, и вам необходимо сопоставлять целые слова, вы можете попробовать следующее (вам действительно нужно уточнить, что именно является «соответствием», какой текст вы просматриваете и т. Д. В вашемвопрос).
Сначала предварительно обработать весь документ в Trie или DAWG .
Trie / Dawg имеет следующее свойство:
При заданном trie / dawg и поисковом слове длины K вы можете в O (K) время искать данные, связанные со словом (илискажите, если нет совпадений).
Использование DAWG может сэкономить больше места по сравнению с деревом.В попытках используется тот факт, что у многих слов будет общий префикс, а в DAWG используется общий префикс, а также свойство общего суффикса.
В этом списке также поддерживается точно список позиций слова.Например, если текст
That is that and so it is.
Узел для последнего t в that
будет иметь список {1,3}, а узел для s в is
будет иметь список {2,7 }вязанный.
Теперь, когда вы получаете слово для поиска по одному слову, вы можете легко выполнить поиск и найти список совпадений для этого слова.
Если вы получаете слово для поиска по нескольким словам, вы можете сделать следующее.
Пройдите по дереву с первым словом в поисковом запросе.Получите список совпадений и вставьте в хеш-таблицу H1.
Теперь пройдитесь по дереву со вторым словом в поисковом запросе.Получить список матчей.Для каждой позиции совпадения x проверьте, существует ли x-1 в HashTable H1.Если это так, добавьте x к новой хеш-таблице H2.
Пройдите по дереву с третьим словом, получите список совпадений.Для каждой позиции совпадения y проверьте, существует ли y-1 в H3, если это так, добавьте в новую хеш-таблицу H3.
Продолжите и т. Д.
В конце вы получите список совпадений дляпоисковая фраза, в которой указываются позиции последнего слова фразы.
Вы можете оптимизировать этап сопоставления фразы, поддерживая отсортированный список позиций в списке и выполняя двоичный поиск: например, для.для каждого ключа k в H2 вы выполняете двоичный поиск k + 1 в отсортированном списке для поискового запроса 3 и добавляете k + 1 в H3, если найдете его и т. д.