Андрей Колесов

В Microsoft Office XP впервые реализована новая технология интеллектуальной обработки текста Smart Tags (в русской версии Office она так и называется - смарт-теги). Судя по всему, это одна из наиболее интересных новинок пакета, которая наверняка получит развитие и, скорее всего, в недалеком будущем станет доступной для приложений, создаваемых независимыми разработчиками.

Очевидно, что уже реализованный в версии 1.0 механизм представляет практический интерес для решения конкретных задач. Однако, несмотря на внешнюю простоту идей, заложенных в основу технологии, первое знакомство с внутренней ее реализацией позволяет увидеть некоторые "подводные камни" и узкие места. Но тут нужно подчеркнуть, что сегодня мы имеем дело по сути дела с опытным образцом, - как известно, промышленная работа с новой технологией обычно начинается с появлением версии 2.0, а то и 3.0.

Интеллектуальная обработка текста

Ранее Microsoft Word, Excel и Outlook позволяли автоматически распознавать адреса Web-сайтов и электронной почты, преобразуя их в соответствующие ссылки. Теперь эти же приложения версии 2002 (для Outlook 2002 - только в режиме ввода текста в формате HTML, когда применяется Word 2002), а также новый Internet Explorer 6.0 (но только если на компьютере установлен Office XP) могут существенно расширить возможности подключения разнообразных функций, обеспечивающих связь между документами и различными информационными и вычислительными ресурсами.

Идея технологии достаточно проста - пользователь может применять механизм распознавания, который связывает наборы терминов (лексем) с различными "присоединенными" к ним функциями. То есть каждой группе лексем будет соответствовать свое контекстное меню с набором самых произвольных команд, которые можно выполнять непосредственно при работе с данным документом.

Общая схема работы смарт-тегов выглядит следующим образом.

На уровне операционной системы регистрируется один или несколько специальных программных компонентов - "распознавателей" (recognizer). Каждый распознаватель включает список обрабатываемых им лексем, а также набор действий (команды контекстного меню), которые могут к ним применяться.

В процессе ввода текста (точнее, при завершении ввода ячейки в Excel или абзаца в Word) содержимое данного фрагмента анализируется на наличие заданных терминов. Найденные распознавателем термины помечаются как лексемы (одному термину могут соответствовать несколько распознавателей). На экране такие слова подчеркиваются фиолетовой пунктирной линией.

Если к такому слову подвести курсор мыши, то появится кнопка Smart Tag Actions ("Действия для смарт-тегов"). По щелчку на этой кнопке выводится меню с перечнем доступных операций (рис. 1). В заголовке меню указано имя распознавателя (в данном случае "Справка по Basic-программированию"), который среагировал на слово "Бейсик". Две нижние строки меню представляют стандартные служебные операции ("Удалить смарт-тег" и "Параметры смарт-тегов"), а выше располагаются команды, предлагаемые распознавателем ("Посмотреть Web-сайт VB + VBA House" и "Отправить электронное письмо").

Fig.1
Рис. 1. Так работает технология смарт-тегов.

В состав Office XP входит несколько готовых англоязычных распознавателей. Но важнее всего, что пользователи могут создавать собственные "распознаватели", реализованные двумя способами. В простейшем случае они формируются в виде XML-файла - это может сделать человек с минимальной компьютерной подготовкой с помощью самого примитивного текстового редактора, такого как NotePad. Однако при применении XML-описаний дополнительная обработка ограничивается достаточно узким кругом операций, связанных в основном со ссылками на Web-ресурсы.

Существенно более широкие возможности предоставляет второй вариант создания распознавателя в виде ActiveX-DLL - здесь для обработки может применяться сколь угодно сложный программный код с применением библиотеки типов Microsoft Smart Tags 1.0, входящей в состав Office XP. Описание технологии разработки смарт-тегов и примеров ее реализации есть в наборе Smart Tag SDK 1.1 (http://msdn/microsoft.com/office). В рамках этой статьи мы рассмотрим первый вариант создания распознавателей, а разработку DLL отложим до следующей статьи.

Следует также подчеркнуть, что технология смарт-тегов активно используется для реализации внутреннего механизма самого Office XP. Это можно проиллюстрировать на следующем примере. Заполните в Excel 2002 несколько ячеек, выделите диапазон и скопируйте его через буфер обмена в Word 2002. В среде Word рядом со вставленной таблицей появится кнопка смарт-тега, с помощью которой можно получить доступ к дополнительным операциям оформления таблицы (рис. 2).

Fig.2
Рис. 2. Смарт-теги применяются для программирования внутренних операций офисных приложений.

Подключение смарт-тегов к приложению

Набор распознавателей регистрируется на уровне ОС, но каждое из офисных приложений (в данном случае Word и Excel) может определять состав подключенных к нему модулей (по имеющейся информации, Internet Explorer 6.0 не позволяет делать такого выбора). Управляют смарт-тегами с помощью вкладки Tools | AutoCorrect options | Smart Tags (Сервис | Параметры автозамены | Смарт-теги), приведенной на рис. 3.

Fig.3
Рис. 3. Управление режимами в окне "Автозамена | Смарт-теги".

Флажок "Добавить смарт-теги к тексту" управляет включением/выключением режима применения смарт-тегов. Под ним находится список распознавателей, которые зарегистрированы на данном компьютере и подключением которых можно управлять индивидуально. Внизу окна находится флажок "Показать действие кнопки" (он включает/выключает поддержку контекстного меню). Можно также отключить выделение смарт-тегов с помощью подчеркивания - это делается флажком "Смарт-теги" в области "Показывать" во вкладке "Сервис | Параметры | Вид".

Следует обратить внимание на кнопки "Проверка документа" и "Удалить смарт-теги". Дело в том, что в документе сохраняются все лексемы, которые были ранее помечены распознавателями, даже если некоторые из этих модулей удалены с компьютера (или документ распознавался на другом компьютере). Кнопка "Удалить" убирает все смарт-теги документа, а "Проверка" восстанавливает их с учетом текущей конфигурации.

Все позиции окна "Распознаватели", кроме "Списки смарт-тегов", - это средства распознавания, реализованные в виде DLL. "Списки смарт-тегов" - это наборы распознавателей, представленные XML-описаниями (на рис. 3 видно, что таких описателей в данном случае нет).

Все остальные представленные распознаватели - это стандартные модули, поставляемые в виде DLL. Они реализованы пока только для английского языка. Получатели электронной почты также распознаются только в случае английских имен. К сожалению, в документации о работе стандартных распознавателей практически ничего не говорится. Конечно, довольно легко догадаться, что подразумевается под "Именами" и "Телефонами", но что понимается под "Местами" и сколько человек умещается в понятие "Последние" - не вполне очевидно.

Тем не менее действие готового набора смарт-тегов при наборе текста может выглядеть примерно следующим образом (рис. 4). Мое имя удостоилось чести попасть в число смарт-тегов вместе с главой Microsoft, но от этого механизм распознавания имен не становится понятнее. Например, если добавить в предложение еще одно имя (рис. 5), то нас с Биллом почему-то удалят из смарт-тегов.

Fig.4
Рис. 4. Использование встроенных распознавателей.

Fig.5
Рис. 5. Почему-то не все имена распознаются.

Обратим также внимание, что в первой фразе (рис. 4 и 5) выделен номер телефона, а во второй - нет. Судя по всему, в последнем случае роль сыграло то, что предложение набрано на русском языке. Дата также распознается только в американском формате, даже если она введена неверно (20/09/2001 - тут перепутаны месяц и день).

При работе со смарт-тегами следует иметь в виду и такие моменты:

1. При сохранении документа (но только в родных форматах приложений Word и Excel, а также HTML) смарт-теги сохраняются. Если размер файла критичен, отключите параметр для сохранения смарт-тегов. Для этого нужно очистить флажок "Внедрять смарт-теги" на вкладке "Сервис | Параметры | Сохранение".

2. Смарт-теги можно сохранить в сообщении электронной почты, что позволит получателям (при применении Oullook 2002) воспользоваться ими. Для этого во вкладке "Сервис | Параметры | Общие" нажмите кнопку "Параметры электронной почты", а затем откройте вкладку "Общие" и в области "Параметры HTML" установите или снимите флажок "Сохранять смарт-теги в электронных письмах".

3. При отключении проверки орфографии и грамматики средство проверки правописания продолжает работать для распознавания смарт-тегов. Если требуется полностью отключить средство проверки правописания, следует также отключить смарт-теги. Отметим, что выделение ошибок правописания и выделение смарт-тегов довольно часто накладываются друг на друга.

4. Отключение или подключение распознавателей в окне "Автозамена | Смарт-теги" не влияет на состав выделенных в тексте смарт-тегов. Для того, чтобы обновить документ с применением указанного списка распознавателей, нужно нажать кнопку "Проверка документа".

Программное управление смарт-тегами

Объектные модели Word 2002 и Excel 2002 включают средства программного управления смарт-тегами с помощью VBA или через механизм OLE Automation. Это выполняется с помощью набора новых свойств, которые фактически полностью воспроизводят действия перечисленных выше флажков и кнопок, доступных через меню "Сервис".

  • ActiveDocument.RemoveSmartTags - "Удалить смарт-теги";
  • ActiveDocument.EmbedSmartTags - "Внедрять смарт-теги" (оставить при сохранении документа);
  • ActiveDocument.RecheckSmartTags - "Повторная проверка;
  • Application.Options.LabelSmartTags - "Показывать смарт-теги";
  • ActiveWindow.View.DisplaySmartTags - "Показывать выделение смарт-тегов";
  • Application.EmailOptions.EmbedSmartTag - Сохранять информацию о смарт-тегах в электронных письмах в формате HTML при работе в Outlook 2002.

Кроме того, имеется объект SmartTag и коллекция SmartTags, которые позволяют работать собственно со смарт-тегами. Например, следующий код позволяет получить информацию об именах используемых в документе смарт-тегов (точнее, именах распознавателей, к которым относятся этим смарт-теги; получить имя самого термина, к сожалению, нельзя):

Dim stSmart As SmartTag 
  With ActiveDocument
    For Each stSmart In .SmartTags
      MsgBox stSmart.Name
    Next
  End With

С помощью свойства XML можно получить соответствующее описание смарт-тега:

Sub SmartTagXml()
    Debug.Print "XML-описание первого в документе смарт-тега: " & _
        ActiveDocument.SmartTags(1).XML
End Sub

В окне мы увидим такой XML-текст:

XML-описание первого в документе смарт-тега:
<xml xmlns:st1="urn:schemas-microsoft-com:office:smarttags">
  <st1:PersonName>Thomas Robbins</st1:PersonName>
</xml>

Можно также добавить пользовательские свойства смарт-тегу:

Sub NewSmartTagProperty()
    ActiveDocument.SmartTags(1).Properties _
        .Add Name:="Мой приятель", Value:="Его телефон _ 123-4567"
End Sub

и получить информацию обо всех свойствах всех смарт-тегов документов (см. листинг 1):

 
Имя Значение
Мой приятель Его телефон - 123-4567
Phonenumber 0953697697
Month 9
Day 20
Year 2001

Сейчас трудно оценить практическую пользу от применения объекта SmartTag в его нынешнем виде. Отметим, что у него почему-то нет возможности получить напрямую информацию об имени самого смарт-тега (правда, это можно сделать через XML-свойство). Наверное, пригодились бы в работе и события, обрабатывающие операции со смарт-тегами на уровне VBA-кода.

Тут нужно еще сказать, что кроме перечисленных средств Excel включает дополнительно (в Word'е их нет) объекты SmartTagAction и SmartTagRecognizer для программирования распознавателей с помощью VBA. Но с этим вопросом нужно будет разбираться дополнительно.

Создание простейшего XML-распознавателя

Логика работы технологии смарт-тегов хорошо видна на примере создания и применения простейшего обработчика в виде XML-файла (первый способ разработки распознавателей), которые в английской документации называются Smart Tag List Definition Files. Выполним следующие действия:

  1. Закроем Word 2002.
  2. В простейшем редакторе Notepad введем XML-код с описанием медицинских терминов, приведенный в Smart Tag SDK 1.1 (листинг 2).
  3. Сохраним файл с именем Medical.xml в каталоге C:\Program Files\Common Files\Microsoft Shared\Smart Tag\Lists.
  4. Запустим Word 2002 и откроем окно "Автозамена | Смарт-теги" (рис. 6). Здесь мы увидим, что строка "Списки смарт-тегов" пополнилась описанием нашего файла - Medical Condition Terms. Установим флажок для этой строки.
  5. Введем текст, которые содержит термины, перечисленные в XML-теге , например cough (кашель), и убедимся, что наш обработчик смарт-тегов исправно работает (рис. 7).

Fig.6
Рис. 6. В окне "Автозамена | Смарт-теги" появилось имя XML-описания в строке "Списки смарт-тегов".

Fig.7
Рис. 7. Работа XML-обработчика смарт-тегов.

Мы сейчас не будем детально рассматривать все элементы синтаксиса XML-описания обработчика смарт-тегов - во многом их смысл понятен из имен, а более подробная информация имеется в Smart Tag SDK. Обратим внимание только на некоторые ключевые моменты.

Корневой элемент файла –

<FL:smarttaglist>,
а общая структура файла имеет следующий вид:

    <FL:smarttaglist xmlns:FL=
		"urn:schemas-microsoft-com:smarttags:list">
     {набор вспомогательных элементов}  
    <FL:smarttag>...</FL:smarttag>
    </FL:smarttaglist>

"Набор вспомогательных элементов" в общем случае необязателен. Однако следует иметь в виду, что большая группа этих элементов обеспечивает автоматическое обновление списка элементов, а также возможность ссылки на XML-описание, хранящееся на удаленном сервере (в том числе на Web-сервере).

Собственно обработчик описывается в элементе , который является обязательным и единственным. Он должен содержать оригинальное имя (или, иначе, - тип) смарт-тега в формате "пространство имен Uniform Resource Indefier#имя смарт-тега" (namespaceURI#tagname). Например, так: urn:schemas-adatum-com:medical#condition.

Список терминов описывается в элементе (единственном в файле). Набор терминов можно также считывать из двоичного файла с помощью элемента . Обратите внимание, что все термины записаны с помощью строчных букв; в этом случае в документе будут выделяться термины, набранные в любом регистре. Если же определить термин, например Allergy, то будет выделяться только слово точно такого написания.

Элементы описывают пользовательские операции по обработке смарт-тега: имя позиции меню (caption) и URL-ссылку для выполнения действий. Обратите внимание, что с помощью параметра {Text} можно передать конкретный выделенный термин.

Все изменения XML-описания вступают в силу только в момент перезагрузки офисного приложения. Более того, если вы модифицировали имя смарт-тега в элементе , то необходимо инициировать его работу, нажав кнопку "Проверка документа" в окне "Автозамена | Смарт-теги".

Для регистрации XML-описаний смарт-тегов достаточно простой записи файлов в предопределенный каталог C:\Program Files\Common Files\Microsoft Shared\Smart Tag\Lists. Можно изменить этот каталог, откорректировав системный Реестр.

Еще один XML-описатель, русскоязычный

Чтобы лучше разобраться с работой XML-описателей, создадим еще один файл - Andy.xml (листинг 3) с использованием русских букв. Сразу обратим внимание на появление заглавной строки XML-кода с описанием русской кодировки:

   <?xml version="1.0" encoding="Windows-1251" ?> 

В этом случае файл после создания в NotePad нужно сохранить как текст. В среде Windows XP программа NotePad может сохранять текстовый файл как в однобайтном (ANSI), так и двухбайтном (Unicode) коде. Для ANSI следует применять Windows-1251, а для Unicode - UTF-16.

Действие нового описателя при распознавании текста показано на рис. 8. Здесь следует отметить два момента. Во-первых, английские термины выделены без различия строчных и прописных букв. С русским словом "бейсик" видны проблемы - выделена только точная его копия. Слово "Бейсик", не говоря уже о "Бейсиком" и "бейсиком", осталось нераспознанным.

Второе - на примере слова QuickBASIC хорошо виден конфликт (наложение подчеркивания) между выделением смарт-тегов и грамматических ошибок.

Fig.8
Рис. 8. Обработка русских терминов с помощью XML-описателя.

Обратим также внимание, что в новом описателе используется и слово cough, которое уже задействовано в файле Medical.xml. В данном случае никакого конфликта не происходит - при обращении к кнопке "Действия для смарт-тегов" выдается комбинированное меню с возможностью выбора нужного обработчика (рис. 9).

Fig.9
Рис. 9. При использовании одного термина в двух обработчиках выдается комбинированное меню.

Что же дальше

Более широкие возможности обработки смарт-тегов дает использование программных DLL-компонентов, технологию разработки которых мы рассмотрим в следующей статье. А пока хотелось бы сделать несколько предварительных выводов и замечаний.

Судя по всему, Smart Tags - это очень перспективная технология, но для оценки ее реальных достоинств требуется время и изучение практических примеров. К тому же некоторые элементы технологии кажутся пока сыроватыми. Например, только в этом обзоре мы столкнулись с неоднозначным распознаванием имен (Билла Гейтса то узнают, то нет), с проблемой распознавания русских терминов, набранных в разных регистрах. Довольно запутанно выглядит ситуация с сохранением смарт-тегов при удалении ранее использованных распознавателей.

Лично для меня самое непонятное - насколько актуальна идея автоматического распознавания терминов для практической работы? Не запутается ли пользователь во всех этих распознавателях и выделенных терминах в тексте?

Никто не спорит, возможность интеллектуальной обработки текста очень полезна. Но ведь все то, о чем говорилось выше, достаточно просто и более эффективно реализовать с помощью давно известных средств программирования офисных приложений! Делается это несложно - подводите курсор к нужному слову, открываете нажатием "горячей клавиши" макрокоманду в контекстном меню и делаете все, что нужно. Ведь пользователь сам, без проблем (и гораздо лучше программы), поймет, где записан телефон, где название организации, а где имя клиента.

Впрочем, возможно, я просто пока не вижу новых потенциальных возможностей технологии смарт-тегов. Что же, поживем - увидим.

 

Листинг 1. Получение информации о свойствах смарт-тегов документа с помощью свойства Properties объекта SmartTag

Sub SmartTagProps()
    Dim docNew As Document
    Dim stgTag As SmartTag
    Dim stgProp As CustomProperty
    Dim intTag As Integer
    Dim intProp As Integer

    'Создание нового документа
    Set docNew = Documents.Add

    With docNew.Content  ' выводим заголовок будущей таблицы
        .InsertAfter "Имя" & vbTab & "Значение"
        .InsertParagraphAfter
    End With

    'Просматриваем все смарт-теги текущего документа
    For intTag = 1 To ThisDocument.SmartTags.Count
        With ThisDocument.SmartTags(intTag)
           'Проверяем на наличие свойтств
           If .Properties.Count > 0 Then

                'Выводим имена и значения свойств в новый документ
                For intProp = 1 To .Properties.Count
                    docNew.Content.InsertAfter .Properties
		(intProp) _
                        .Name & vbTab & .Properties(intProp).Value
                    docNew.Content.InsertParagraphAfter
                Next
            Else
              MsgBox "У этого смарт-тега нет свойств"
            End If
        End With
    Next

    'Преобразование табулированного списка в таблицу 
    docNew.Content.Select
    Selection.ConvertToTable _
      Separator:=wdSeparateByTabs, NumColumns:=2
End Sub

Листинг 2. Простейший XML-обработчик смарт-тегов - Medical Condition Terms

<FL:smarttaglist xmlns:FL="urn:schemas-microsoft-
com:smarttags:list"><FL:name>Medical Condition Terms</FL:name> 
  <FL:lcid>1033</FL:lcid> 
  <FL:description>A list of medical conditions for recognition, 
        as well as a set of actions that work with them.
  </FL:description> 
  <FL:moreinfourl>http://www.adatum.com/
		moreinfo</FL:moreinfourl> 
  <FL:updateable>true</FL:updateable> 
  <FL:autoupdate>true</FL:autoupdate> 
  <FL:lastcheckpoint>100</FL:lastcheckpoint> 
  <FL:lastupdate>0</FL:lastupdate> 
  <FL:updateurl>http://www.adatum.com/smarttags/
		listupdate.xml</FL:updateurl> 
  <FL:updatefrequency>5</FL:updatefrequency> 
  <FL:smarttag type="urn:schemas-adatum-com:medical#condition">
    <FL:caption>A. Datum Corporation</FL:caption> 
    <FL:terms>
      <FL:termlist>allergy, cough, arthritis, headache, migraine, 
         heartburn, high blood pressure, digestive disorder, 
         diarrhea, cold, thyrotoxicosis, thalassemia, 
         bloating, nausea, bronchitis
      </FL:termlist> 
  </FL:terms>
    <FL:actions>
      <FL:action id="CompanyInfo">
        <FL:caption>&A. Datum Corporation Company 
		Reports</FL:caption> 
        <FL:url>http://www.adatum.com</FL:url> 
    </FL:action>
      <FL:action id="CompanyHomePage">
        <FL:caption>View A. &Datum Website</FL:caption> 
        <FL:url>http://www.adatum2.com/home.asp?String=
		{TEXT}</FL:url> 
    </FL:action>
  </FL:actions>
</FL:smarttag>
</FL:smarttaglist>

Листинг 3. XML-обработчик смарт-тегов с использованием русского языка

<?xml version="1.0" encoding="Windows-1251" ?> 
  <FL:smarttaglist xmlns:FL=
		"urn:schemas-microsoft-com:smarttags:list">
    <FL:name>Basic-программирование</FL:name> 
    <FL:description>Basic Language</FL:description> 
    <FL:smarttag type="urn:schemas-andy-com:visualbasic#terms">
      <FL:caption>Справка по Basic-программированию</FL:caption> 
      <FL:terms>
        <FL:termlist>vb, visual basic, бейсик, QuickBasic, cough
        </FL:termlist> 
    </FL:terms>
      <FL:actions>
        <FL:action id="GotoMyWebSite">
          <FL:caption>Посмотреть Web-сайт "VB + 
		VBA House"</FL:caption> 
          <FL:url>http://www.visual.2000.ru/develop/vb</FL:url> 
      </FL:action>
        <FL:action id="SendEmail">
          <FL:caption>Отправить электронное письмо</FL:caption> 
          <FL:url>Mailto:akolesov@online.ru</FL:url> 
      </FL:action>
    </FL:actions>
  </FL:smarttag>
</FL:smarttaglist>