Поиск по корпусу регулярными выражениями
Регулярные выражения ищут конструкции, а не отдельные слова. Ошибка в выражении даёт неверные числа, которые выглядят правдоподобно. Ниже — синтаксис, проверка и сохранение запросов.
Зачем регулярные выражения
Они позволяют найти конструкции, а не отдельные слова: сочетания, варианты, расстояния между словами. Для корпусного поиска это основной инструмент. Ошибка в выражении даёт неверные числа, которые выглядят правдоподобно.
Начало работы
Сначала сформулируйте, что именно ищете, на естественном языке. Затем переведите в выражение. Проверьте на десяти известных примерах. Только после этого запускайте по корпусу.
Жадность и ленивость
Жадные операторы захватывают больше, чем нужно. Ленивые останавливаются на первом совпадении. Для поиска фрагментов между словами чаще нужны ленивые версии. Ошибка здесь даёт огромные совпадения.
Границы слова
Без границ выражение найдёт часть слова. Для словоформ используйте границы, для морфем — нет. Разница влияет на частоты и на выводы.
Регистр
Корпусный поиск часто чувствителен к регистру. Для начала предложения и заголовков это важно. Если регистр не нужен, отключите его осознанно, а не по умолчанию.
Пробелы и пунктуация
Между словами может быть разное число пробелов, дефис вместо пробела. Учитывайте это в выражении. Иначе часть вхождений не найдётся.
Юникод
Буквы с диакритикой могут быть представлены по-разному. Приведение к одной форме до поиска избавляет от пропусков. Это особенно важно для многоязычных корпусов.
Проверка выражения
Проверьте на фрагменте, где ответ известен вручную. Сравните число совпадений. Если расходится, ищите причину в выражении, а не в корпусе.
Сохранение запросов
Запросы хранятся в текстовом файле с комментариями: что искали и зачем. Через месяц вы не вспомните синтаксис. Сохранённые запросы — часть воспроизводимости.
Повторяемость
Один и тот же запрос на одной и той же версии корпуса даёт один и тот же результат. Если результат меняется, проверьте настройки поиска и версию данных.
Типичные ошибки
Жадные операторы, отсутствие границ, игнорирование регистра, разные формы юникода, запросы без сохранения.
Итог
Поиск по корпусу надёжен, когда запрос проверен на известном фрагменте и сохранён вместе с описанием.
Контекст совпадения
Перед тем как считать найденное, посмотрите на контекст нескольких совпадений. Выражение может находить нужные конструкции, но захватывать и лишние. Контекст показывает, какие правила стоит добавить, а какие убрать, чтобы результат соответствовал исследовательскому вопросу, а не только синтаксису выражения.
Сложные конструкции
Для конструкций с переменным числом элементов выражение становится длинным и хрупким. Разбейте задачу на несколько простых запросов и объедините результаты. Так проще проверить каждый шаг и понять, где именно возникает ошибка. Длинное выражение почти невозможно отладить, если результат не совпадает с ожиданием.
Производительность
Сложные выражения на большом корпусе работают медленно. Сначала проверьте на подкорпусе, затем запускайте на полном. Если время недопустимо велико, упростите выражение или предварительно отфильтруйте документы. Скорость не должна влиять на корректность: лучше два простых запроса, чем один непроверяемый.
Сравнение запросов
Если вы сравниваете две конструкции, используйте одинаковые настройки и одинаковые границы. Разные настройки дают несопоставимые числа, и вывод о различии может оказаться артефактом. Зафиксируйте параметры в отчёте и повторите оба запроса на одной версии корпуса.
Итог по практике
Регулярные выражения — инструмент точного поиска. Их ценность в проверяемости: сохранённый запрос можно повторить и получить тот же результат на той же версии данных.
Работа с отрицанием
Поиск конструкций с отрицанием требует явного указания частицы. Иначе в выборку попадут утвердительные контексты, и вывод окажется обратным. Проверьте запрос на примерах с отрицанием и без него, чтобы убедиться, что он различает эти случаи.
Ошибки кодировки в запросе
Если запрос набран в другой раскладке или кодировке, он не найдёт ничего. Пустой результат стоит проверять на простом запросе из одного частого слова. Это быстрый способ отличить ошибку в выражении от ошибки в данных или настройках инструмента.
Сложные случаи с пунктуацией
Знаки препинания могут отсутствовать или стоять иначе, особенно в старых текстах. Запрос, требующий точной пунктуации, пропустит часть вхождений. Ослабьте требования и проверьте, не выросло ли число ложных совпадений. Баланс между полнотой и точностью выбирается осознанно.
Итог по воспроизводимости
Запрос, версия корпуса, настройки поиска и дата выполнения сохраняются вместе с результатом. Такой набор позволяет повторить анализ через год и сравнить результаты, если корпус изменился.
Итог по проверке
Любой запрос проверяется на фрагменте с известным ответом. Это правило экономит больше времени, чем любая оптимизация синтаксиса.
Чек-лист
- Запрос сформулирован до написания выражения.
- Выражение проверено на известных примерах.
- Границы слова и регистр заданы осознанно.
- Учтены разные формы юникода.
- Запросы сохранены с комментариями.
- Версия корпуса и настройки зафиксированы.
- Результат пересчитывается без изменений.
Частые вопросы
С чего начинать?
С формулировки на естественном языке и проверки на примерах.
Почему важны границы слова?
Без них выражение находит часть слова.
Зачем сохранять запросы?
Это часть воспроизводимости результата.
Пример
Запрос без границ слова дал вдвое больше совпадений, чем было на самом деле. После проверки на фрагменте с известным ответом число совпало с ручным подсчётом.
Итог
Поиск надёжен, когда запрос проверен на известном фрагменте и сохранён с описанием.