Семантическая сеть. Часть 2

March 14, 2008

Я продолжаю рассказ о Семантической Паутине и технологиях, которые, возможно, никогда не изменят будущего, если вы не окажите им немного помощи. Вкратце: основная идея семантической паутины - добавить к существующим веб-страницам немного информации ориентированной на машинную обработку, добавить сведения о самой информации и о том в каких отношениях она находится с другими страницами сети. Когда это случится, то по Сети будут путешествовать автономные Семантические Агенты, похожие на ИскИны, (Искусственные Интеллекты из популярных научно-фантастических рассказов). Они будут помогать искать информацию, планировать рабочий день, брать на себя все больше и больше рутинной работы.

Почему я сказал “возможно, никогда не изменят будущего”? Если углубиться в историю, то сегодняшний Интернет – это самое простое решение, которое могло работать. Помимо Тим-Бернерса Ли над идеями Сети и гипертекста работали Дуглас Энгельбарт, Тед Нельсон (проекты memex, enquire, xanadu) и в своем оригинале выглядели они гораздо сложнее чем сегодняшний веб. “Самое простое решение“ было обусловлено не только техническими сложностями, но и тем фактором, что для роста сети необходимы генераторы наполнения. А что, если правила, по которым выполняется этот процесс, сложны (например, система Enquire каждой ссылке приписывала сведения о том, в каком взаимоотношении находятся связанные страницы, требовалось наличия двухсторонних ссылок)? Задумайтесь, кто будет заниматься генерацией информации, если это так сложно? Компьютерные энтузиасты, это само собой. Но если вы заядлый аквариумист и хотите рассказать про свои опыт выращивания золотых рыбок, то тратить несколько недель своей жизни на оформление документа по сложным правилам, налаживанием отношений с другими участниками создающими информацию, согласованию ссылок и терминов … Фактически, вы выполнили бы объем работы сравнимый с подготовкой книги для печати, но не получили бы за это ни копейки. А веб-страница, будучи построенной не по правилам, просто не открылась бы ни в одном из браузеров. В первоначальном виде семантическая сеть была бы полезна только ученым и никогда не смогла бы привлечь достаточное количество писателей и читателей и стала бы еще одной разновидностью библиотеки и довольно дорогой, кстати. Но что делать сейчас, когда техническая база достаточна как с точки зрения “железа” так и “умного софта”. Явно не ломать и не строить систему с нуля - нужно добавлять к существующей информации перед публикацией “кусочки семантики” (благо соответствующие стандарты приняты уже не первый год и есть конкретные программные продукты, понимающие эти стандарты). Объем капиталовложений в сеть растет с каждым днем, стоимость мирового рынка рекламы уже сравнима с годовым бюджетом нашей Республики, реклама становится все более контекстной, базы данных о пользователях социальных сетей все детальней и дороже, а сами пользователи становятся все более избирательными и “ленивыми”. Так что для того, чтобы остаться на “гребне волны” нужно не только добавлять к сайтам удобности и красивости (flash, видео, ajax), но и заняться упорядочением информации.

Возможно, что до того момента как ваши усилия превратятся в “поток золотых монет” пройдет еще несколько лет. Но когда это случится, то вы сможете продавать свою информацию более эффективно, чем те, кто не задумывался о семантике и должен переработать по новым правилам весь объем своих публикацией, чтобы надеяться на рейтинговые места в результатах выдачи поисковых машин или на “доступность” для тех самых мифических семантических агентов. Так что я призываю всех, кто занимается публикацией в сети информации добавить к ней семантику уже сейчас. На этой оптимистической ноте я перехожу к продолжению рассказа о формате RDF и его применении “здесь и сейчас”.

В прошлой статье я показал, как с помощью RDF можно описать некоторую сущность, указать на ее характеристики и отношения с другими сущностями (в качестве примера было выбрано описание некоторого человека по имени Вася). После того как я указал на такие простые характеристики как “дата рождения”, “цвет волос” и дал определения эти терминам с помощью ссылок на другие RDF-страницы, пора поработать с множественными характеристиками, например, списком друзей. Очевидно, что друзей у Васи очень много и нам нужен способ их группировки. Ведь не можем же мы начать создавать вложенные в Person элементы “friend_1”, “friend_2”, … это просто глупо. Для группировки некоторого количества связанных сущностей в RDF предусмотрен тег “”.
  1. <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ns="http://family.site.com/#">
  2.  <ns:Person rdf:about="http://family.site.com/#Vasya" >
  3.   <ns:hasFriend>
  4.    <rdf:Bag>
  5.     <rdf:li>Anna</rdf:li>
  6.     <rdf:li>Mary</rdf:li>
  7.    </rdf:Bag>
  8.   </ns:hasFriend>
  9.  </ns:Person>
  10. </rdf:RDF>
А кто такие Anna, Mary? Давайте мы подскажем машине, где можно найти информацию о них, задав сведения в виде не просто имени, а тега Person.
  1. <ns:Person rdf:about="http://family.site.com/#Vasya">
  2. <ns:hasFriend>
  3.   <rdf:Bag>
  4.    <ns:li><ns:Person rdf:about="http://family.site.com/#Mary" /></ns:li>
  5.    <ns:li><ns:Animal rdf:about="http://animals.site.com/#Murka" /></ns:li>
  6.   </rdf:Bag>
  7.  </ns:hasFriend>
  8. </ns:Person>
Так я указал для Васи сведения об его двух друзьях: девушке Мэри и кошке Мурке.

В случае если список друзей Васи должен быть упорядочен по некоторому критерию, то вместо элемента “rds:Bag” нужно использовать тег “rdf:Seq”. И последний вид контейнера – выбор из списка альтернатив, например, список профессий на которые может учиться Вася:
  1. <ns:Person rdf:about="http://family.site.com/#Vasya" >
  2.   <ns:willStudy>
  3.   <rdf:Alt>
  4.    <ns:li><ns:Profession rdf:about="http://jobs.site.com/#Programmer" /></ns:li>
  5.    <ns:li><ns:Profession rdf:about="http://jobs.site.com/#Boss" /></ns:li>
  6.   </rdf:Alt>
  7.   </ns:willStudy>
  8. </ns:Person>
В том случае если мы хотим сказать, что некоторый список элементов является закрытым. Т.е. не может содержать других элементов кроме указанных нами (в примерах выше ничего не мешает добавить к списку профессий Васи или списку его друзей еще несколько позиций). В этом случае мы используем атрибут rdf:parseType="Collection".
  1. <ns:willStudy rdf:parseType="Collection">
  2.   <ns:Profession rdf:about="http://jobs.site.com/#Programmer" />
  3.   <ns:Profession rdf:about="http://jobs.site.com/#Boss" />
  4. </ns:willStudy>
В том случае, если вам покажется, что форма записи в виде XML очень громоздка, то можно формировать RDF-документы и в виде такой формы записи как N3. например следующие два документа идентичны. Сначала пример XML:
  1. <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ns="http://family.site.com/#">
  2.  <ns:Person rdf:about="http://family.site.com/#Vasya" ns:birthDay="2007.1.1">
  3.   <ns:hasColor rdf:resource="http://colors.site.com/red"/>
  4.   <ns:hasFriend>
  5.    <ns:Person rdf:about="http://family.site.com/#Jim"/>
  6.   </ns:hasFriend>
  7. </ns:Person>
  8. </rdf:RDF>
А теперь пример формы N3. Обратите внимание, что каждое высказывание записывается на отдельной строке и заканчивается символом точки. Строятся высказывания по правилу: подлежащие, сказуемое, дополнение и разделяются пробелами. Те термины, которые не имеют дальнейшего определения (например, значение даты "2007.1.1") записываются в кавычках, а те понятия, что могут быть “раскрыты” дополнительно, представлены их URI заключенными в угловые скобки. Порядок расположения “троек” может быть любым:


<http://family.site.com/#Vasya> <http://family.site.com/#hasFriend> <http://family.site.com/#Jim> .
<http://family.site.com/#Jim> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://family.site.com/#Person> .
<http://family.site.com/#Vasya> <http://family.site.com/#hasColor> <http://colors.site.com/red> .
<http://family.site.com/#Vasya> <http://family.site.com/#birthDay> "2007.1.1" .
<http://family.site.com/#Vasya> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://family.site.com/#Person> .
Создав некоторый RDF документ, вы заходите проверить его корректность. В этом вам поможет сервис http://www.w3.org/RDF/Validator/. Он прочитает ваш RDF файл и, если не найдет в нем ошибок, то представит результаты в виде таблицы “троек”, а также будет сформирован файл с графическим представлением Сети (скриншот в прошлой статье было получен именно с помощью этого сервиса). Однако, в случае если ваш RDF-документ достаточно велик, то и получающаяся картинка будет … очень большой, такой большой, что не уместится на экран браузера и ориентироваться по ней будет крайне тяжело. Здесь я посоветую выбрать в окне настроек RDF-валидатора режим отображения графа в виде не картинки, а IsaViz/ZVTM. По этим названием скрывается java-апплет (требуется наличие установленной на вашем компьютере jre), который отобразит граф в виде интерактивной модели (вы можете перемещать, масштабировать изображение). В случае если вы хотите разрабатывать RDF-документы с помощью специализированных графических инструментов, то я могу посоветовать Altova SemanticWorks (хоть это коммерческий программный продукт, но лучше его я ничего не видел). Ну а если покупка Altova SemanticWorks для вас кажется избыточной, то можете попробовать следующую бесплатную программку: rhodonite (http://rhodonite.angelite.nl/). Это графический редактор и браузер для RDF-документов. Вы можете либо создать RDF-файл внутри этого приложения (довольно не удобно), либо импортировать RDF-файл, созданный, да хоть в блокноте, затем проверить файл на корректность и посмотреть тройки утверждений. Доступны функции импорта и экспорта документов в формате RDF-XML и RDF-N3. Большой список, как готовых программ, так и библиотек для разных языков программирования работающих с RDF-документами можно найти на сайте http://semantictools.ru/tools/tools_list.shtml.

Рядом с RDF находится технология RDFS (RDF Schema). Ее назначение – это описание данных с помощью некоторых классов и свойств этих классов. Понятие классов сходно с тем, что принято в мире объектно-ориентированного программирования: моделируемая область знаний представлена в виде множества объектов, каждый из которых строится на основании некоторого шаблона – класса. Так класс human определяется набором свойств ФИО, вес, дата рождения. Классы могут быть организованы в виде иерархии: класс “Кошка” является производным от класса “Животное”, и у каждого из этих классов есть свои специфические свойства. На основании классов создаются конкретные сущности (кошка Мурка). Важно понимать, что RDFS не является справочником всевозможных “готовых” классов и их свойств – это каркас для создания классов, именно, вами. Так что, мы изучаем еще синтаксис RDFS и затем можем сделать что-то практическое? Нет, еще нет: пирамида технологий более длинная. В основе всего лежит XML, на его основе построен RDF, на основе RDF создан RDFS. Но т.к. RDFS представляет только базовые элементы для построения онтологий, то был создан еще и язык OWL (Web Ontology Language). Но и это еще не все: ведь нам нужно просто-напросто разметить публикуемую на сайте информацию особым образом. И, очевидно, что кто-то уже придумал разные словари характеристик объектов и отношений между ними, и, именно, вот эти словари мы будем использовать. Тогда вопрос: а зачем я тратил время на описание RDF? А как вы думаете, что я делал, когда записывал в самом первом теге приведенных ранее примеров такие атрибуты как xmlns:ns="http://family.site.com/#"? Так вот я как раз и ссылался на некоторые онтологии, ведь не могли же появиться из ниоткуда теги и атрибуты ns:Person, ns:hasColor, ns:hasFriend – они были определены некоторой грамматикой, некоторым словарем, некоторой онтологией. Далее я приведу список наиболее известных и уже нашедших практическое применение словарей:

1. FOAF (Friend of a Friend). Эта онтология служит для описания информации о людях, их интересах, связях с другими людьми. Применяется на сайте Живого Журнала и некоторых социальных сетей.

2. Дублинское Ядро (Dublin Core). Это словарь, созданный специалистами в области хранения и каталогизации информации, служит для представления сведений о том, кто разработал некоторый документ, кто его опубликовал, когда …

3. SIOC (Semantically-Interlinked Online Communities). Цель этого словаря – описать сообщения в форумах, чатах, блогах и связать эти сообщений между собой и другими публикациями по сходной тематике.

4. DOAP (Description Of A Project). Этот словарь служит для описания open source программных проектов.

5. WSMO (Web Service Modeling Ontology). С помощь этого словаря веб-сервисы могут публиковать информацию о себе и о том, как вызвать некоторую функцию сервиса. Вспомните пример из прошлой статьи, когда Семантический Агент обращался к сайту магазина торгующего молоком и резервировал для вас товары.

И еще множество грамматик ориентированных на специфические предметные области: страны, товары, географическая информация и т.д.

Теперь очень важный момент: словари не существуют отдельно друг от друга: они смешиваются. Например, вы сделали запись в своем блоге и разметили ее с помощью SIOC, к этой заметке кто-то написал интересный комментарий (идентифицировавшись с помощью openid). Я посетил сайт этого человека, мне понравилось информацию, которую он публикует, и я хочу пойти дальше. Например, найти в каких социальных сетях он участвует, найти список его друзей (возможно, у них тоже есть блоги по интересующей меня теме), здесь мне поможет FOAF. А затем я хочу найти все опубликованные друзьями этого человека статьи определенной тематики (и снова мне поможет SIOC).

Давайте ближе к практике: рассмотрим пример внедрения в html-код страницы информации об этой публикации с помощью дублинского ядра (Dublin Core). Это спецификация очень простая, плюс, она переведена на русский язык Алексем Бешеновым (http://beshenov.ru/). Спецификация разделена на две части или набора тегов: простой (15 тегов) и дополнительный (плюс три новых тега) В самом начале html-документа вы должны указать, что это не простой html-файл, а содержащий RDF-информацию, за это отвечает тег “head” и его атрибут “profile”.
  1. <head profile="http://dublincore.org/documents/dcq-html/">
  2.  <link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" />
  3.  <link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" />
Затем внутри тега head вы пишите множество стандартных для html тегов “meta”. Благодаря этому внедрение DC данных не приведет к нарушению отображения страницы ни в одном из браузеров, а те браузеры, которые способы понять DC информацию, будут вам об этом сигнализировать. В качестве значения атрибута “name” указывается название DC характеристики и ее значение (в атрибуте “content”). Имя атрибутов состоит из двух частей: указание на то, к какой спецификации (пространству имен) относится этот тег (DC – если основная спецификация и DCTERMS – если дополнительная). Затем через символ двоеточия идет собственное имя тега, его рекомендуется записывать в нижнем регистре, например:
  1. <meta name="DC.date" content="2008-01-01" />
  2. <meta name="DCTERMS.audience" content="Заинтересованные в Semantic Web" />
Так я указал дату публикации документа и ее аудиторию. Здесь есть два слабых момента: не понятно как быть в случае, когда значением некоторого атрибута является не просто текст, а ссылка на другой веб-документ, и как указать язык, на котором написана информация. Например, у документа несколько авторов и мы хотим указать при записи их имен, что в одном случае это русский язык, во втором – английский.
  1. <meta name="DC.contributor" xml:lang="en" content="John Dow”/>
  2. <meta name="DC.contributor" xml:lang="ru" content="Вася Пупкин”/>
А так я укажу на веб-документ связанный с моим по тематике:
  1. <link rel="DC.relation" href="http://mega-site.ru/doc.html" />
Далее я перечислю в виде таблицы список основных тегов DC:
Элемент Описание
contributor Участник, внесший вклад в разработку данного документа
coverage Области применения документа: как временные, так и географические.
creator Лицо, ответственное за разработку документа
date Дата разработки или публикации документа
description Описание документа
format Формат документа (например: html, pdf или rtf-файл)
identifier Уникальный идентификатор документа (возможно Интернет адрес или номер в системе ISBN)
language Язык документа
publisher Лицо, выполнившее публикацию документа
relation Документы, связанные с этим файлом
rights Информация о правах владения документом
source Источник, на основании которого шла разработка документа
subject Тема документа в виде ключевых слов, терминов
title Заголовок документа
type Жанр документа
Для просмотра опубликованный DC информации вам нужно установить для браузера firefox дополнение Dublin Core Viewer (https://addons.mozilla.org/ru/firefox/addon/528). В результате, когда вы зайдете на страницу с тегами DC, то в углу окна firefox вспыхнет иконка подсказки “обнаружены DC данные”, а по двойному клику по ней откроется следующее окно см. рис. 1.



В следующий раз я продолжу рассказ о технологиях Semantic Web и перейду к FOAF.