Вчера больше половины рабочего дня я чинил маленький баг в английском. И прямо захотелось описать процесс. Получился лонгрид в шести актах.
1. Нужно сделать, чтобы слово population могло согласовываться с глаголами во множественном числе: The population enjoy apple-picking. Так можно, даже
в словаре написано singular or plural verb.
Это решается довольно просто: добавлением population в специальный список слов, которые вроде сами в единственном числе, но умеют согласовываться и со множественным:
committee, police, и много других. Дальше прогоняются юнит-тесты. Находится тест, ожидающий ошибку в The bulk of the population live in suburbs. Теперь наша суперпрограмма будет считать это предложение корректным, так что я правлю тест.
Проверяю, как изменились результаты проверки грамматики на корпусе текстов с ошибками и без. Почти миллион предложений анализируются за 45 секунд (на ноутбуке; на десктопе 22). В результатах много исчезнувших ошибок согласования вроде population are. Часть вроде по делу, в другой части хотелось бы всё же подчёркивать, но там в основном и наши ML-проверки справляются. Так что вроде всё хорошо.
Но есть и пара неприятных изменений: в each population prefer to eat something special исчезла ошибка, а в Sweden's population begun to grow rapidly предлагалось has begun, а теперь перестало.
1.1. Пишу тест на each population prefer. Чиню методом того, что не разрешаю population согласовываться со множественным числом, если есть determiner: each,
every, a, и ещё разные. А вот с the по-прежнему разрешаю.
Теперь ошибка начинает подчёркиваться, но предлагается не только each population prefers, но и each populations prefer. Ого, вот это неожиданность! У нас уже есть правило Quantifier-noun compatibility, ругающееся на единственное число со словами вроде each. Выношу список таких слов оттуда в более общее место и запрещаю приводить предложение к множественному числу, если есть такой determiner. Смотрю изменения на большом корпусе, а там ушло много неправильных исправлений, классно!
1.2. Теперь к Sweden's population begun. Это совсем другое правило: Missing verb. Но оно тоже пытается согласовывать свои исправления. Смотрю в код правила. Ага, теперь у population число не единственное и не множественное, а "неоднозначное". Правило не может выбрать, какую форму have предложить, поэтому не предлагает никакую.
О, я же недавно писал код, который даже для неоднозначного числа подлежащего всё равно пытается предложить какую-нибудь наиболее вероятную форму глагола. Просто именно до этого правила я его пока не донёс. Прекрасный повод! Доношу код, тест про Швецию чинится. Зато начинают падать другие тесты. Например, предлагают Roslyn analyzers исправить на Roslyn analyzes.
Как же так? Ага, это наш локальный парсер. Он работает локально на вашем компьютере, не посылает ваши ценные тексты ни в какие интернеты, зато результаты выдаёт похуже облачного. И он решил, что Roslyn - подлежащее у сказуемого analyzers. А наше умное правило совершенно логично не нашло глагола в таком странном предложении, зато нашло похожий глагол analyzes и предложило исправить эту вроде как опечатку. Раньше тут не подчёркивалось только потому, что у Roslyn было невесть какое число, а теперь мы и в таких случаях начали что-то предлагать. Вот оно и вылезло.
Окееей, в правиле есть уже проверка misparsedCompound как раз для таких случаев. Поддерживаю в ней и такие деревья, работает, ура.
Аналогично в Facebook posses the biggest audience теперь опечатка в глаголе начала находиться. Но исправляется на poses, ибо
Левенштейн. Ну не страшно, у нас там спецсписок слов есть, которые надо исправлять особым образом. Добавляю туда, что существительное posse (а posses - это как раз оно, не узнали, что ли?) должно меняться на глагол possess.
Запускаю опять на большом корпусе. Замечаю, что с новым кодом заодно починилось согласование с I: раньше I drunk исправлялось на I has drunk, теперь I have. Приятно, можно добавить в тесты.
Но заодно замечаю, что предложения этого самого Missing rule периодически не особо разумны. Например, он мог бы предлагать ещё и I drank, но не предлагает. Зато иногда предлагает пассив не в тему: I am drunk Guinness.
1.2.1. Добавляю Past Simple для I drunk. На большом корпусе уже накопилось мноого изменений, и я понимаю, что я уже не смогу это всё держать в голове, а уж ревьюеры и тем более. Надо разбивать на части. Делаю Shelve Changes, потом по частям начинаю доставать и обрабатывать изменения по одному.
2. Проще всего оказалось отделить часть про непредлагание each populations. Делаю коммит: en SVA: don't pluralize nouns with singular-only determiners like "each|every|...". SVA - это Subject-verb agreement, очевидно же?
3. Перехожу в Missing verb. Часть про possess вроде выглядит невинно, плюс решаю починить лишние пассивы (I am drunk Guinness). Пишу всякие условия вроде: если у причастия есть прямое дополнение, или мы в придаточном относительном с (вероятно) опущенным прямым дополнением, то не надо предлагать be в качестве отсутствующего глагола. Вроде написал, вроде работает, запускаю тесты...
А они падают. Причём не из-за этих изменений, а из-за предыдущих. Это я на предыдущем шаге уже подзадолбался и забыл их, собственно, запустить перед коммитом. А там, о ужас, перестало подчёркиваться I went there every few year!
2.1. Срочный shelve, возвращаюсь, чиню: если после each|every есть число или few, то всё-таки множественное число надо разрешить. Прогоняю-таки все тесты, коммит en QNC: allow pluralizing "every few year". За это время как раз успели проревьюить и одобрить предыдущее изменение, в том же месте, и тут я такой приношу ещё одно.
2.718281828... Обед. Спасибо Дане! Как раз в тему, ибо, как уже сказано, я подзадолбался следить за этим стеком.
3.1. Unshelve. Что там вообще было-то? А, possess и пассив. Вроде работает, вроде диффы в тестах разумные, коммит en MissingVerb: correct "possess", don't suggest passive in contexts with direct objects.
3.2. Перечитываю себе код Missing verb, много думаю, никого не трогаю. Вдруг вижу слово obj. Как раз в районе пассива. Ой, мы там уже проверяем на прямое дополнение? А я же только что ещё в другом месте стал проверять. Непорядок, надо объединить. Тесты, коммит en MissingVerb: simplify not suggesting passive in contexts with direct objects. И добавление его в предыдущее ревью, которое как раз уже опять две минуты как одобрили.
На большом корпусе замечаю интересное: в предложении The average numbers for people aged 65 and over in three countries risen глагол has иногда вставляется правильно после countries, а иногда, в глупом локальном парсере, - после over.
3.3. Изучаю. Глупый локальный парсер решил, что in three countries - это зависимость типа obl: равноправная с подлежащим составляющая предложения. А правило вставляет глагол сразу после подлежащего. Приходится адаптировать правило, чтобы смотрело, нет ли сразу после подлежащего какого-нибудь obl, и вставлять после него. Коммит en MissingVerb: insert the verb after a subject nmod misattached as clause obl.
4. Так, что там ещё на полочке (Shelf) осталось? О, предлагать прошедшее время в I drunk. Добавляю. В корпусе много изменений, в основном к лучшему. Иногда, правда, замечаю, что и перфект-то предлагать не надо. Например, в They begun work in 1941, ибо с явным указанием прошедшего года нужно Past Simple. И у нас даже есть на это правило Markers requiring specific tense, можно же оттуда код переиспользовать!
4.1. Начинаю писать на это тесты. В корпусе есть ещё похожее с in August 1941. Но правило про маркеры так уже не умеет. Не беда, научим. Добавляю тест. Тут же придумывается, что можно так же с конкретными датами, причём во всех форматах. Добавляю на это всё тоже тесты, смотрю на код и грустно понимаю, что что-то я уже слишком глубоко закопался, и сейчас совсем не до переписывания ещё одного правила. Добавляю эти примеры в наш внутренний трекер в Notion и решаю, что пока можно и перфект попредлагать.
Коммит en MissingVerb: suggest VBD when encountering VBN, где VBN - частеречный тег причастия (drunk), VBD - тег глагола прошедшего времени (drank).
5. Что ещё на полке? О, можно, наконец, достать предлагание вероятной формы глагола для неоднозначного числа подлежащего. И вылезающее вместе с ним подавление ошибок в неправильных деревьях вроде Roslyn analyzers. Коммит: en MissingVerb: use VerbInflectionNumber.fromLikely to suggest the correct perfect form in more cases and to fix "I has" suggestions.
6. Наконец, можно достать с полочки самое изначальное! Последний контрольный запуск тестов, просмотр изменений на большом корпусе и коммит: en SVA: allow "population" to agree with plural verbs.
Итого: около 9 утра начал, около 14:30 закончил. Мааленький фикс, ага. Изменения в минимум трех правилах, плюс пожелания новых проверок в ещё одном. 8 коммитов. В понедельник, если ничего не сломается, изменения должны подтянуться в наше
браузерное расширение Grazie и в
IntelliJ-плагин.
Такие вот трудовые будни. Когда мне удаётся позаниматься именно лингвистикой (а не всем остальным вокруг), подобное часто бывает. И на этом день не кончился, конечно. Я починил ещё всяких ложных срабатываний и переключился на производительность тестов. Для этого теперь думаю над названием тому, из чего же произрастают синтаксические деревья зависимостей (или это кусты?). Но это уже совсем другая история.