Оригинал взят у
kelijah в
Парсинг прилагательных-топонимов на -ский Пофиксил еще один issue для русского парсера.
Кратенько ситуация выглядит так.
С одной стороны, в русском языке очень много прилагательных-топонимов, у которых словарная форма оканчивается на -ский. Это всевозможные названия районов. Внести все эти прилагательные в лексикон не просто трудно, но и невозможно, так как они могут образовываться очень просто по весьма продуктивной модели.
С другой стороны, есть много существительных-топонимов, которые в некоторых падежных формах совпадают с прилагательными на -ский:
Информацию подтвердили и в Ангарском лесничестве.
Если учесть, что существительное Ангарск есть в лексиконе, а прилагательное Ангарский - отсутствует, то парсер оказывается в тупике. Сейчас несловарная морфология работает так: если словоформы нет в лексиконе, то включаются правила-распознаватели. Но если словоформа найдена в лексиконе, то правила даже не запускаются. В итоге, парсер не может выполнить построение синтаксического дерева, так как существительное в творительном падеже и другое существительное справа от него обычно не связываются.
Игнорировать все эти коллизии нельзя, если в задачу парсера входит разбор всевозможных новостей. Количество прилагательных с данной модельню образования просто невероятное, и хочется, чтобы парсер видел несловарный вариант.
Можно переделать морфоанализатор, чтобы он для каждого слова даже при наличии словарного распознавания предлагал также возможные варианты с помощью правил. Естественный недостаток этого подхода - очень большой рост числа вариантов, поэтому пока я всячески удерживаюсь от такого решения, хотя в TODO оно есть.
Второй подход - использовать штатную возможность парсера указывать в правилах регулярное выражение для сопоставляемого терма. Эта штука была сделана как раз для разбора всевозможных несловарных конструкций, начиная от сокращений типа "2 кг.".
Сейчас я добавил для эксперимента второе решение, посмотрим, не будет ли ненужных коллизий. На тестовых предложениях все выглядит замечательно: