В этом-то и была загвоздка. Моя программа автоисправления должна была справляться с выбором между двумя вариантами: заменить то, что вы напечатали, на самое очевидное слово с учетом того, какие клавиши вы нажимали, то есть определить, что вы могли при этом иметь в виду, или в точности воспроизвести последовательность тех букв, которые вы нажимали и которые видели подсвеченными в пользовательском интерфейсе, то есть показать именно то, что вы сделали. Клавиатура должна была сопоставить то, что
Размышляя над противопоставлением того-что-вы-имели-в-виду и того-что-сделали, я выделил две проблемы. Первой было повышение качества словаря — мне была нужна лучшая база данных. Второй было полное использование сенсорного ввода и языковой информации, которая имелась в моем распоряжении, — мне нужно было улучшить алгоритмы. Я сосредоточился на совершенствовании базы данных и алгоритмов как на особых задачах, надеясь, что отдельные нити улучшений в конце концов сплетутся вместе и в результате получится клавиатура, точно сопоставляющая слова, введенные пользователями, без всяких комических ошибок.
Демоверсия eff grackles подчеркнула важность качества данных. Во время показа программы Скотту с моими алгоритмами все было в порядке. Ошибка скрывалась в словаре. Чтобы исправить ее, я должен был удостовериться, что все употребляемые в повседневной жизни слова, такие как egg, имеют правильную частоту использования. Мне пришлось тщательно присваивать значения словам с похожим написанием, особенно тем, в которых буквы находятся рядом в раскладке QWERTY, например tune (мелодия) и time (время). Поскольку отсутствующие слова, такие как freckles, могли привести к глупым ошибкам, я также проверил словарь на то, чтобы в него входили все несколько тысяч самых распространенных английских слов.
Так как каждый в команде Purple постоянно использовал наше программное обеспечение, мы делали удивительные открытия по поводу того, что должно входить в словарь программы автоисправления. Мы обнаружили, что нужно добавить полную коллекцию ругательств и поставить на эти слова особые пометки, чтобы запретить ПО использовать их при автоисправлении: представьте себе, что вы пытаетесь написать nugget (самородок), но случайно путаете первую гласную или последнюю согласную. Мы не хотели «любезно» предлагать варианты расистских эпитетов и решили, что никогда не будем делать подсказки программы для оскорбления или унижения.
Коллеги по команде Purple также давали мне знать о том, каких слов, по их мнению, не хватает в словаре. Со временем я решил, что стоит включить самые разные блоки информации: названия спортивных команд и стадионов, городов, торговые марки, сленг для чатов, аббревиатуры и так далее. Словарь программы автоисправления представлял собой не академическое лингвистическое собрание слов, а скорее каталог современной жизни. Мои товарищи по Purple хотели, чтобы была возможность набирать слова, используемые каждый день в обычной речи — в обычных текстовых сообщениях друзьям, которые вы пишете во время просмотра бейсбольной игры по телевизору:
Теоретически составление словаря для программы автоисправления было понятным, но на практике — трудноосуществимым. Раннее за всю мою карьеру мне действительно не приходилось работать с таким массивом данных, но в самой идее ничего сложного не было. Хорошие словари составляются по одному слову за раз. Дело было знакомым. Оно очень напоминало то, как я заполнял перекрестные ссылки в первые дни создания браузера Safari. Как и в долгой, нудной и кропотливой работе по утихомириванию компилятора, постоянно сообщающего об отсутствующих перекрестных ссылках, самой трудной частью создания словаря был огромный масштаб этой задачи. Тем не менее я двигался к финишной черте по прямой. Просто настраивай значения частоты использования. Просто добавляй слова. Просто работай.
С разработкой алгоритмов автоисправления все было по-другому. Начиная работу над победившей в дерби клавиатурой, я и понятия не имел о том, как делать полезные алгоритмы, помогающие людям вводить текст. Даже когда я добился успеха с помощью клавиатуры QWERTY, где на каждой клавише размещалось по одной букве, мой код автоисправления оставался чрезвычайно простым. Он работал как переключение рычажков на кодовом замке для велосипеда.