Работа нашей фирмы связана с разработкой под Microsoft Outlook и Exchange Server, и поэтому копаться в них мы очень любим. Сегодня мы будем копать маленькую новую фишечку Microsoft Outlook — напоминалку о забытых вложениях. Казалось бы, что может быть проще? Тексты наших «раскопок» на английском языке мы публикуем в блоге компании, а на русском — эксклюзивно для Хабра. Поехали!
Начиная с версии 2013, пользователь может включить в Microsoft Outlook автоматическое напоминание о забытых вложениях:

При отправке письма в этом случае может быть показано следующее предупреждение:

Немного поиграв с текстами, вы сможете обнаружить, что:
Забегая вперед, скажем сразу, что словарь и алгоритм жестко закодированы, и вы не сможете исправить или добавить свои ключевые слова или исключения. Все что вы можете, это либо включить эту функцию, либо выключить.
По мере того, как вы будете играть с новой функцией, у вас возникнут к ней вопросы. Почему на «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 выбрала такой сложный путь и написала в тысячу раз больше кода для не самой первоочередной задачи?
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 в последнее время, видимо не ведется. И реального обновления приходится ждать еще очень не скоро.
Начиная с версии 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 в последнее время, видимо не ведется. И реального обновления приходится ждать еще очень не скоро.