Как найти оптимальное регулярное выражение для бинарной классификации строк?

У меня имеется примерно 10 строк с данными о частоте их встречаемости в логах. Я хочу выделить из них только те строки, которые связаны с отдыхом или путешествиями по городам России. В частности, мне нужна регулярное выражение, которое с высокой точностью сможет повторить мою предварительную бинарную классификацию этих строк, так как я планирую вручную размечать их классы. В действительности, строк достаточно много – сотни и даже тысячи. Моя цель состоит в том, чтобы вручную отобрать топ-10 или топ-100 из них, размечать их, а затем на основе разметки получить необходимую регулярку и применить её ко всем остальным строкам. 

В качестве примера, вот регулярное выражение, которое я уже подобрал для 10 строк и которое довольно хорошо соответствует желаемому результату: 
<pre><code class="sql">regexp = '(?i)(?=.*(путешестви|отдых))(?=.*(росси|алтае|сочи))'</code></pre>
  • 22 марта 2025 г. 15:54
Ответы на вопрос 2
Чтобы найти оптимальное регулярное выражение для бинарной классификации строк, которые относятся к отдыху или путешествиям по городам России, важно учитывать, как именно составляются строки и какие ключевые слова в них могут быть связаны с вашим запросом.

Ваша уже предложенная регулярка делает хорошую работу, сочетая разные части с помощью позитивного утверждения (`(?=...)`). Вот несколько рекомендаций, чтобы улучшить или адаптировать её под ваши потребности:

1. **Добавление ключевых слов**: Включите больше ключевых слов, связанных с отдыхом и путешествиями, чтобы ваша регулярка охватывала больше вариантов. Например, можно добавить слова, такие как "поездка", "туры", "памятники", "отель", "вылет" и т.д.

2. **Учет различных форм слов**: Используйте суффиксы для учета различных форм слов. Например, "путешестви", "путешеству", "путешествовал" и т.д.

3. **Географические термины**: Расширьте список городов и регионов, включая все возможные города и популярные места в России, такие как "Москва", "Санкт-Петербург", "Казань", "Калуга" и т.д.

4. **Объединение выражений**: Вы можете использовать символ `|` для объединения слов и терминов в регулярном выражении, чтобы сделать его более компактным.

Пример расширенного регулярного выражения может выглядеть так:

```regex
regexp = '(?i)(?=.*(путешестви|поездк|отдых|туры|вылазк?|отель|курорт))(?=.*(россия|москва|санкт-петербург|сочи|казань|алтай|крым|владикавказ|екатеринбург|тверь|нижний новгород|волгоград))'
```

### Пояснения к регулярному выражению:

- `(?i)` — игнорирует регистр.
- `(?=.*(путешестви|поездк|отдых|туры|вылазк?|отель|курорт))` — позитивное утверждение, проверяющее наличие одного из слов, связанных с отдыхом или путешествиями.
- `(?=.*(россия|москва|санкт-петербург|сочи|казань|алтай|крым|владикавказ|екатеринбург|тверь|нижний новгород|волгоград))` — позитивное утверждение для географических терминов.

### Как действовать дальше:

1. **Сбор данных**: Создайте список строк, которые необходимо отобрать, и начните их разметку.
2. **Тестирование регулярного выражения**: Применяйте регулярное выражение к вашему набору данных и смотрите, какие строки выделяются.
3. **Корректировка**: При необходимости, корректируйте регулярное выражение, добавляя или изменяя ключевые слова, основываясь на результатах и на том, что пропускается или включается ошибочно.

Таким образом, вы сможете улучшить точность классификации и успешно выделить нужные строки, относящиеся к отдыху и путешествиям по России.
Не совсем понятно (по-честному: совсем непонятно), для чего вам регулярки? Это - обычная задача поиска вхождения заданных последовательностей символов в строку, использование там регулярных выражений возможно, но избыточно.
Похожие вопросы