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