Работа нашей фирмы связана с разработкой под Microsoft Outlook и Exchange Server, и поэтому копаться в них мы очень любим. Сегодня мы будем копать маленькую новую фишечку Microsoft Outlook — напоминалку о забытых вложениях. Казалось бы, что может быть проще? Тексты наших «раскопок» на английском языке мы публикуем в блоге компании, а на русском — эксклюзивно для Хабра. Поехали!
Начиная с версии 2013, пользователь может включить в Microsoft Outlook автоматическое напоминание о забытых вложениях:
При отправке письма в этом случае может быть показано следующее предупреждение:
Немного поиграв с текстами, вы сможете обнаружить, что:
- поддерживается только английский язык (возможно, потом будут добавлены и остальные);
- в случае опечаток в «ключевых» словах напоминания не будет (если быть точным, Microsoft Outlook знает только одну опечатку, слово «ATACHMENT»);
- не все «ваши» ключевые слова система считает таковыми;
- алгоритм не простой, но он явно не идеален.
Забегая вперед, скажем сразу, что словарь и алгоритм жестко закодированы, и вы не сможете исправить или добавить свои ключевые слова или исключения. Все что вы можете, это либо включить эту функцию, либо выключить.
По мере того, как вы будете играть с новой функцией, у вас возникнут к ней вопросы. Почему на «see picture» или «see gif» в теле письма система реагирует, а на «see photo» или «see pdf» нет? Надо же, на «file not attached» система не среагировала, а на «file attached not» среагировала. Как же оно устроено?
Как оно устроено
Алгоритм реализован в библиотеке MSFAD.DLL (мы изучали версию файла от 1 ноября 2013 года), которая находится в папке Microsoft Office. Эта библиотека содержит единственную функцию «HasAttachments», которой передаются тема и тело письма. В ответ функция возвращает решение – предупреждать пользователя или нет. Размер библиотеки более 300 килобайт. Многовато, чтобы просто найти в одной строке другую строку. Раньше в 300 килобайт огромные программы помещались. Неужели она больше ничего не делает, кроме как проверяет текст на наличие ключевых слов?
Но это действительно так. 86 килобайт в библиотеке занимают данные, непосредственно связанные с анализом текста. Но вы не увидите в теле библиотеки ключевых слов, даже если у вас есть шестнадцатеричный редактор. Словарь хранится в компрессированном виде и содержит около 650 ключевых слов. Но если слова, даже в раскодированном виде, занимают чуть более 5 килобайт, что же тогда занимает еще 80кб?
На ответ могут натолкнуть имена функций, которые можно найти в коде библиотеки: ChunkGrammarRule, ChunkGrammarLevel, CompoundAnalyzer, StringAnalyzer, TemplateLexiconBasedStringAnalyzer, FlatLexiconStringAnalyzer, MorphLayerStringAnalyzer, ScriptStringAnalyzer, PartOfSpeechDisambiguator. 80 килобайт, это данные для системы обработки естественного языка!
Вот это размах! Почти что искусственный интеллект! Вот только уместен ли он в этой задаче?
Как это делают другие
Напоминания о забытых вложениях уже лет 15 умеют показывать многие плагины для Microsoft Outlook. Например, в “швейцарском ноже” MAPILab Toolbox for Outlook есть компонент “Attachments Forget”, настройки которого показаны на изображении.
Работает он очень просто. Нашлась подстрока в письме – получите предупреждение. Никакого анализа естественного языка в нем нет, и «обмануть» его проще простого.
Тем не менее, работает он, не смотря на всю простоту, достаточно эффективно. Плюс его можно обучить под ваш стиль письма и используемые вами языки. Если вы часто отправляете по почте счета, вы в два щелчка научите MAPILab Toolbox реагировать на фразу «see invoice». А вот крутой естественно-языковой анализатор Microsoft Outlook 2013 на фразу «see invoice» не среагирует и вашему стилю письма никогда не обучится. Самообучения в нем нет.
Смотрим глубже под капот
Будучи вначале весьма заинтригованы и впечатлены новой возможностью Microsoft Outlook, мы остались несколько разочарованы после практических испытаний.
Есть «мощные» слова, которые, если их указать в пустом теле письма, вызывают предупреждение. Их всего девять: ATTACHED, ATTACHMENT, ATTACHMENTS, FYI, ATTACHING, REATTACHING, ENCL, ENCLOSURE, ENCLOSURES. Некоторые из этих слов образуют словосочетания, которые очень сильно работают в коротких фразах. Например, на фразу «WHUSGD YODJHHW IS ATTACHED» алгоритм сработает. Но это пока не сильно отличается от алгоритма MAPILab Toolbox. Он тоже знает 10 слов, и его можно научить еще десяти словосочетаниям.
Перейдем к естественно-языковому анализу. На фразу «HE WAS VERY ATTACHED TO THE OLD LADY» срабатывания не будет. А вот на фразу «THEY FOUND A FIRE IN THE ATTACHED GARAGE OF A SINGLE-FAMILY HOME» срабатывание произойдет. Для анализатора, располагающего ограниченным словарем, эти фразы выглядят как «HE WAS VERY ATTACHED TO THE * *» и «THEY FOUND A * IN THE ATTACHED * OF A * *» (звездочки – неизвестные анализатору слова). Анализатор, видимо, сумел различить «очень привязанный» и «в приложенном». Здесь мы видим, что с синтаксисом анализатор справляется неплохо, а семантика ему не подвластна. Словаря из 650 слов не достаточно.
Теперь давайте отойдем от слов связанных с ATTACHMENT, и посмотрим, как анализатор справится. Не вполне корректная фраза «I SEND YOU THE FILE» не вызывает срабатываний, даже если FILE заменять другими похожими словами. А вот фраза «I AM SENDING YOU THE FILE» срабатывает. Надо отметить, что анализатор знает английский язык очень хорошо, и если где-то пропустить артикль, то нередко даже очевидная фраза перестает вызывать срабатывание.
В словаре многим словам присвоен одинаковый семантический код. Например, он одинаков у слов CONTRACT, DOCUMENT, EXCEL, FILE, FORM, PHOTO, RESUME, SPREADSHEET, WORKBOOK и некоторых других. Поэтому замена слова FILE в последней фразе на эти слова ни на что не повлияет. Но словарь ограничен, и мы легко найдем что подставить, чтобы срабатывания не было. На фразы «I AM SENDING YOU THE BILL» или «I AM SENDING YOU THE NON-DISCLOSURE AGREEMENT» срабатывания не будет.
Заглянем в словарь
На иллюстрации ниже поместилось чуть больше пятой части словаря, отсортированного по семантическому коду (CODE, его абсолютное значение ни на что не влияет). Мы взяли начало, середину и конец словаря:
Словарь, на наш взгляд, мал для решаемой задачи. Половину словаря составляют слова, необходимые для синтаксического анализа предложения. Вторая половина тесно связана с тем, что может быть отправлено по электронной почте в виде вложения. При этом в словарь попали только самые популярные слова связанные с электронными вложениями. В словаре вообще нет слов типа HOME, GIRL, CAR, WORLD, PEACE. Поэтому «ATTACHED GARAGE” и “ATTACHED STATEMENT» для анализатора совершенно одинаковые наполовину неизвестные словосочетания.
Анализатор допускает довольно много ложных срабатываний как первого порядка (реагируя на безобидные фразы), так и ложных срабатываний второго порядка (не срабатывая на фразы типа «THIS EMAIL CONTAINS AN IMPORTANT ATTACHMENT»).
Если сравнивать используемый алгоритм с примитивным поиском ключевых слов, то их результаты вполне сопоставимы. Зачем же Microsoft выбрала такой сложный путь и написала в тысячу раз больше кода для не самой первоочередной задачи?
Во всем виноват Google?
Attachment Reminder появился в Gmail в 2010 году (до этого он два года был в Gmail Labs). Аналогичная функция появилась в HotMail (теперь Outlook.com) на год позже. Соперничество между двумя гигантами проявляется даже в мелочах. И если Google сделал что-то «просто», то Microsoft сделает это круто, чтобы снисходительно улыбнуться.
В 2009 году одним немецким техническим университетом была опубликована статья «Learning to Recognize Missing E-mail Attachments», в котором приводились данные о превосходстве обучаемых алгоритмов перед методом статических ключевых слов. Возможно, именно она и положила идею в Microsoft создать «умный» Attachments Reminder. Огромная база писем у Microsoft есть, результат технологии можно использовать и на Outlook.Com, и в Microsoft Outlook и, вероятно, даже в мобильных приложениях.
Вот как срабатывали Attachment Reminders на некоторых тестовых фразах в Microsoft Outlook 2013 и популярных онлайн-службах (Yes – предупреждение было, зеленый цвет – система не ошиблась):
По этому мини-тесту нельзя уверенно утверждать об используемых алгоритмах. Но можно обоснованно предположить, что Gmail использует примитивный метод статических ключевых слов. Он однозначно срабатывает на словосочетание «I HAVE ATTACHED» и «IS ATTACHED» вне зависимости от семантики и синтаксиса. Outlook.com тоже работает по этому методу, но срабатывая на большее число ключевых фраз, чем Gmail. Видимо, передовые технологии, используемые в Microsoft Outlook 2013, до него еще не добрались.
И только Microsoft Outlook 2013 демонстрирует попытку анализировать текст. Но делает это не всегда удачно. И в приложенном мини-тесте он не стал уверенным лидером. За счет увеличения словаря (в разы) можно добиться, вероятно, существенного улучшения качества работы алгоритма.
Но в плане практического применения, метод статических ключевых слов с возможностью настройки пользователем обеспечит, скорее всего, лучшую защиту, так как в электронной переписке часто используются сокращения речи и слов, профессиональный жаргон, переписка ведется в каком-то контексте и поэтому полноценный анализ текста затруднителен.
Но, в любом случае, Microsoft сделал крутую необычную штуку, которую было очень интересно изучить. Посмотрим, какой она станет через несколько лет! Мы также изучили версию MSFAD.DLL от 16 июля 2014 года, вышедшую в составе обновления KB2883094 (последнюю доступную на момент написания статьи). В новой версии словарь и данные для синтаксического анализа не изменились, не изменились и алгоритмы. Это был только багфикс. Так что активной работы в Microsoft над Attachments Reminder в последнее время, видимо не ведется. И реального обновления приходится ждать еще очень не скоро.
Автор: agorlach77