Вопрос или проблема
Для проекта, который ищет текстовые файлы (в основном неструктурированные), я хотел бы использовать библиотеку, которая может выполнить следующие критерии:
- Быстрый поиск тысяч до сотен тысяч ключевых слов с возвратом их начальной и конечной позиции
- Ограниченный поиск по регулярным выражениям (потенциально тысячи параллельно) (Трудно описать ограничение здесь, я в основном использую повторы, подстановочные знаки, необязательные символы)
- Поддержка поиска слов
Результаты поиска затем обрабатываются снова:
- Произвольные логические операции (AND, OR, NOT, комбинации)
- Проверка расстояний (например, два ключевых слова AND’ed, но должны встречаться в основном на N символов друг от друга)
Опционально, но было бы действительно здорово:
- Фонетический поиск
- Устойчивость к опечаткам
Также я хочу иметь возможность связывать определенные действия с совпадениями поиска.
C++ или Java мне подойдут. Open-source обязательно.
Библиотеки Python re и regex очень мощные для таких задач и могут быть объединены с multiprocessing для параллелизации работы.
Могу я также предложить взглянуть на Natural Language Toolkit Python nltk.
Не C++/Java, но определенно Open Source.
Ответ или решение
Для реализации проекта, связанного с поиском текстовых файлов, в основном неструктурированных, необходимо выбрать библиотеку, соответствующую следующим критериям:
Основные требования
-
Быстрый поиск по ключевым словам:
Вам потребуется библиотека, способная осуществлять эффективный поиск по большому количеству ключевых слов (от тысячи до сотни тысяч) и возвращать их начальные и конечные позиции в тексте. -
Поддержка регулярных выражений:
Возможность осуществлять ограниченный поиск по регулярным выражениям, включая тысячи шаблонов для поиска. В данном контексте важно наличие типичных конструкций, таких как квантификаторы, подстановочные знаки и опциональные символы. -
Поиск слов:
Необходимо поддерживать возможность поиска слов в тексте, что может включать границы слов и различные формы слов.
Дополнительные требования к обработке результатов
-
Логические операции:
Вам потребуется возможность выполнять сложные логические операции (AND, OR, NOT) с найденными результатами. Это позволит более гибко интерпретировать и обрабатывать искомые данные. -
Проверка расстояний:
Возможность задать условия, когда два ключевых слова должны появляться в пределах определённого количества символов друг от друга.
Опциональные функции
-
Фонетический поиск:
Возможно, вам будет полезен поиск, который учитывает фонетику, что особенно актуально при работе с текстами, где могут быть разнообразные варианты написания слов. -
Устойчивость к опечаткам:
Поддержка функций, позволяющих эффективно находить слова с опечатками. -
Связывание действий с результатами поиска:
Наличие возможности ассоциировать определённые действия с найденными результатами увеличивает гибкость и функциональность системы.
Рекомендованные библиотеки
Для разработки вашей системы на C++ или Java подойдут следующие решения:
-
Apache Lucene (Java):
Lucene – это мощная библиотека для полнотекстового поиска с открытым исходным кодом. Она поддерживает многие из вышеперечисленных функций, включая быстрый поиск по индексу, логические операции и регулярные выражения. Она также позволяет связывать действия с результатами поиска. -
Xapian (C++):
Xapian – это библиотека для создания систем полнотекстового поиска. Она предлагает гибкость в использовании логических операторов, продвинутые функции поиска и возможность анализа текстов на разных языках. -
Sphinx (C++):
Sphinx может быть отличным выбором для быстрого поиска по большим объемам текста. Она поддерживает как полное слово, так и регулярные выражения, что делает ее универсальным инструментом.
Заключение
Выбор подходящей библиотеки для поиска текста зависит от ваших конкретных требований и условий работы. Apache Lucene и Xapian предлагают мощные возможности для выполнения поставленных задач, поддерживая высокую скорость обработки и продвинутые функции поиска. Учитывая все критерии, вы сможете создать эффективную систему для поиска и анализа текстовых файлов.