Здравствуйте. Пишу приложение для работы с Яндекс.директ и мне нужно как-то обрабатывать минус слова. Как работают минус слова: есть поисковые запросы, к примеру "купить автомобиль москва" и если у нас есть минус слово "автомобиль" реклама не будет показывается в поисковой выдачи по этому запросу.
Суть моей проблемы в том, что есть много типов минус слов/фраз которые выражаются с помощью спецсимволов:
- "автомобиль" - обычное минус слово, фраза минусуется тогда, когда это слово есть в поисковом запросе
- "купить автомобиль" - обычная минус фраза, фраза минусуется тогда, когда все слова из минус фразы присутствют в поисковом запросе, независимо от порядка
- "!автомобиль" - минус слово с фиксированной словоформофой, то есть оно отминусует запрос только если в фразе есть именно слово "автомобиль", а запросы
со словом "автомобили" не отминусует как бы было с обычным минус словом
- "[купить автомобиль]" - минус фраза с фиксированным порядком слов, она отминусует запрос если в нем будут эти слова в таком же порядке, в отличии от обычной минус фразы
- и остальные спецсимволы
Проблема в том, что одна минус фраза может содержать множество спецсимволов, к примеру так "-купить !автомобили [недорого москва] [новые или !бу]" и мне нужно как-то их обрабатывать.
Я пришел к идеи, что нужно создать классы для всех типов минус фраз, с общим интерфейсом для проверки поискового запроса, у меня получился вот такой список классов:
- Минус слово, пример: "автомобиль"
- Минус слово с фиксированной словоформой, пример: "!автомобили"
- Минус фраза, пример: "купить автомобиль"
- Минус фраза со словами с фиксированной словоформой, пример: "купить !автомобили"
- Минус фраза с фиксированным порядком слов, пример: "[купить автомобиль]"
- Минус фраза с фиксированной словоформой и фиксированным порядком слов, пример: "[купить !автомобили москва]"
- Комплексная минус фраза, которая включает все типы, она парсит фразу и создает соответствующие классы, пример: "купить !автомобили [недорого москва] [новые или !бу]"
- Класс который определяет тип минус фразы, и создает необходимый класс
Этот вариант работает, но он мне кажется избыточным, из-за многого количество классов. Подскажите пожалуйста может вам приходит на ум более изящная структура