Дискретные подсказки для адреса
Команда по стандартизации записи позволяет выполнять совместную обработку данных разного типа, например адреса и телефона. Для наглядности возьмем в качестве примера информацию о клиенте. Предположим, что по нему имеется рабочий и домашний адрес, мобильный и домашний телефон, а также известно его ФИО. Вся эта информация образует единую запись о человеке. Данная запись содержит пять элементов - два адреса, два телефона и одно ФИО.
Для выполнения стандартизации каждого элемента данной записи можно было бы использовать API-команды сервиса, предназначенные для обработки соответствующего типа данных: для стандартизации двух адресов - команду cleanse/address, для стандартизации двух телефонов - команду cleanse/phone, а для стандартизации ФИО - команду cleanse/person. Однако такой подход имеет два существенных недостатка.
Во-первых, пришлось бы отсылать сервису пять запросов - по числу элементов записи, что может ощутимо сказаться на быстродействии пользовательского приложения, особенно, если требуется выполнять обработку в больших масштабах. Во-вторых, элементы записи обрабатываются независимо друг от друга, так что не учитывается тот факт, что все они семантически связаны друг с другом.
Наличие семантической связи между элементами записи позволяет сервису выполнять их перекрестную обработку. Например, сервис может уточнить рабочий адрес человека на основе его мобильного телефона, или наоборот - уточнить номер домашнего телефона на основе информации о домашнем адресе. Такое возможно лишь в случае, если почтовые адреса и телефоны человека будут объединены в единую запись. Именно в этом заключается основное назначение API-команды cleanse/record.
При использовании данной команды важно понимать, что элементы, объединяемые в одну запись, должны быть как-то связаны между собой. Чаще всего эта связь обусловлена принадлежностью информации из этих элементов одной персоне. Неправильным является, например, попытка включения множества разрозненных адресов, никак друг с другом не связанных, в одну запись для выполнения их простой пакетной обработки. Для пакетной обработки несвязанных друг с другом данных предназначена команда cleanse/chunk.
Поскольку запись представляет собой структуру из нескольких элементов разного типа, для ее передачи сервису в структурированном виде требуется немного усложнить сам запрос. В простых командах стандартизации адреса, телефона и ФИО запрос передается в виде обычной строки в параметре query. В отличие от них, при обработке записи в параметр query записывается строка, содержащая JSON-текст или XML-сообщение. Использование этих языков разметки обусловлено необходимостью передать сервису информацию о структуре обрабатываемой записи.
Чтобы подсказать сервису, в каком именно формате (JSON или XML) ему передается на обработку запись, нужно использовать параметр input со значениями input=json или input=xml.
Ниже приведен пример запроса при передаче на обработку записи в формате JSON.
{
"id": "1",
"items":
[
{
"type": "address",
"role": "рабочий адрес",
"body": "ивановка, ул. строителей д. 1"
},
{
"type": "address",
"role": "домашний адрес",
"body": "Москва ул. ткацкая д. 5"
},
{
"type": "phone",
"role": "рабочий телефон",
"body": "533-61-00"
},
{
"type": "phone",
"role": "мобильный телефон",
"body": "8(913) 832-11-11"
},
{
"type": "person",
"role": "ФИО",
"body": "Иванов Иван Иванович"
},
{
"type": "text",
"role": "Комментарий",
"body": "Не обрабатывается сервисом"
}
]
}
В приведенном примере запись, подлежащая обработке, содержит два почтовых адреса - рабочий и домашний, два телефонных номера - рабочий и мобильный, ФИО персоны и элемент с комментарием по всей записи в целом. Ниже приведено назначение всех элементов приведенного запроса в формате JSON.
Каждый элемент массива items представляет собой JSON-объект со следующими элементами.
Информация, передаваемая в запросе в формате XML, семантически эквивалента информации, передаваемой в формате JSON. Пример запроса в формате XML приведен ниже.
<record id="1"> <item type="address" role="рабочий адрес"> ивановка, ул. строителей д. 1 </item> <item type="address" role="домашний адрес"> Москва ул. ткацкая д. 5 </item> <item type="phone" role="рабочий телефон">533-61-00</item> <item type="phone" role="мобильный телефон">8(913) 832-11-11</item> <item type="person" role="ФИО">Иванов Иван Иванович</item> <item type="text" role="Комментарий">Не обрабатывается сервисом</item> </record>
Запрос в формате XML представляет собой документ со следующими XML-элементами.
Каждый XML-элемент item содержит следующие атрибуты.
Информация элемента, подлежащая непосредственно обработке и стандартизации, передается в рамках текстовой части XML-элемента item. В этом отношении текстовое содержимое XML-элемента item эквивалентно содержимому JSON-элемента body.
Запрос в виде JSON-строки или XML-сообщения передается сервису в рамках параметра query. Данный параметр может передаваться как методом GET в рамках URL запроса, так и методом POST в рамках HTTP-тела запроса. В обоих случаях строка с запросом должна быть закодирована с использованием URL-encoding.
Приведенный ниже запрос отсылает сервису на обработку запись, представленную выше в формате JSON. При этом используется минимальное количество параметров и опций.
В данном запросе используются следующие параметры.
Рассмотрим более подробно все параметры, которые сервис может получать в рамках данной команды.
Обязательные параметры для выполнения запроса.
Опциональные параметры.
Приведенный ниже запрос отсылает сервису на обработку запись, представленную ранее в формате XML, с дополнительными параметрами.
В данном запросе используются следующие параметры.
Ниже приведен ответ сервиса с результатом обработки записи, представленной в качестве примера ранее. Результирующий JSON-ответ получен с использованием опции output=json|pretty, позволяющей выполнить "красивое" форматирование JSON-текста.
{
"id" : "1",
"items" : [
{
"body" : "ивановка, ул. строителей д. 1",
"result" : {
"addresses" : [ ... варианты стандартизации адреса ... ],
"check_info" : { ... сводная информация о результате ...},
"best_phone" : {
"item" : 2,
"role" : "рабочий телефон"
}
},
"role" : "рабочий адрес",
"type" : "address"
},
{
"body" : "Москва ул. ткацкая д. 5",
"result" : {
"addresses" : [ ... варианты стандартизации адреса ...],
"check_info" : { ... сводная информация о результате ...},
"best_phone" : {
"item" : 2,
"role" : "рабочий телефон"
}
},
"role" : "домашний адрес",
"type" : "address"
},
{
"body" : "533-61-00",
"result" : {
"phones" : [... варианты стандартизации телефона ...],
"check_info" : {... сводная информация о результате ...},
"best_address" : {
"item" : 0,
"role" : "рабочий адрес"
}
},
"role" : "рабочий телефон",
"type" : "phone"
},
{
"body" : "8(913) 832-11-11",
"result" : {
"phones" : [... варианты стандартизации телефона ...],
"check_info" : {... сводная информация о результате ...},
"best_address" : {
"item" : 0,
"role" : "рабочий адрес"
}
},
"role" : "мобильный телефон",
"type" : "phone"
},
{
"body" : "Иванов Иван Иванович",
"result" : {
"persons" : [... варианты стандартизации ФИО ...],
"check_info" : {... сводная информация о результате ...}
},
"role" : "ФИО",
"type" : "person"
},
{
"body" : "Данная информация не обрабатывается сервисом",
"role" : "Комментарий",
"type" : "text"
}
],
"request_process_time" : 0
}
Для простоты изложения в приведенном примере не отображены реальные результаты стандартизации элементов обработанной записи. Для элементов типа "почтовый адрес" варианты стандартизации заменены фразой "... варианты стандартизации адреса ...". Для элементов типа "телефонный номер" варианты стандартизации заменены фразой "... варианты стандартизации телефона ...". Для элементов типа "ФИО" варианты стандартизации заменены фразой "... варианты стандартизации ФИО ...".
Важной чертой ответа сервиса является полное повторение структуры исходной записи. В ответе сервиса, также как и в исходной записи, присутствуют следующие элементы.
Данный JSON-объект внедряется в тело JSON-элемента обработанной записи и содержит результат стандартизации данных, представленных в его теле body. Содержимое данного объекта зависит от типа, которому принадлежит обработанный элемент.
Если исходный элемент является почтовым адресом (в этом случае его элемент type содержит значение address), то результат обработки этого элемента будет содержать результат стандартизации почтового адреса. А именно, в объекте result будут присутствовать следующие элементы.
Если исходный элемент является телефонным номером (в этом случае его элемент type содержит значение phone), то результат обработки этого элемента будет содержать результат стандартизации телефона. А именно, в объекте result будут присутствовать следующие элементы.
Если исходный элемент содержит информацию о ФИО персоны (в этом случае его элемент type содержит значение person), то результат обработки этого элемента будет содержать результат стандартизации ФИО. А именно, в объекте result будут присутствовать следующие элементы.
Объект best_phone вставляется в результат стандартизации почтового адреса обработанной записи. Данный объект указывает на телефонный номер в рамках обработанной записи, который наилучшим образом соответствует почтовому адресу. Если для адреса не удастся подобрать соответствующий ему телефонный номер, то JSON-объект best_phone не добавляется в ответ сервиса.
Соответствие между адресом и телефоном проверяется на основе имеющейся информации о географической принадлежности стандартизованного телефонного номера. Если почтовый адрес распознан многозначно, то на основе информации о географической принадлежности подобранного телефона выполняется фильтрация вариантов распознавания адреса так, чтобы среди предложенных вариантов остались только те из них, которые соответствуют географической принадлежности телефона.
Пример объекта best_phone приведен ниже.
"best_phone" : {
"item" : 2,
"role" : "рабочий телефон"
}
Объект best_phone содержит следующие элементы.
Оба элемента: item и role - могут использоваться в качестве ссылки на элемент записи, содержащий наилучший телефонный номер для обработанного адреса.
Объект best_address вставляется в результат стандартизации телефонного номера обработанной записи. Данный объект указывает на почтовый адрес в рамках обработанной записи, который наилучшим образом соответствует телефонному номеру. Если для телефона не удастся подобрать соответствующий ему почтовый адрес, то JSON-объект best_address не добавляется в ответ сервиса.
Соответствие между телефоном и адресом проверяется на основе имеющейся информации о географической принадлежности телефонного номера. Если телефонный номер распознан многозначно, то выполняется фильтрация вариантов его распознавания так, чтобы среди предложенных вариантов остались только те из них, географическая принадлежность которых соответствует почтовому адресу.
Пример объекта best_address приведен ниже.
"best_address" : {
"item" : 0,
"role" : "рабочий адрес"
}
Объект best_address содержит следующие элементы.
Оба элемента: item и role - могут использоваться в качестве ссылки на элемент записи, содержащий наилучший почтовый адрес для обработанного телефона.
Здесь и далее приводится описание ответа сервиса в случае использования формата XML. По существу возвращаемые в XML-ответе элементы имеют аналогичное назначение JSON-элементам, описанным выше. Для получения ответа в формате XML необходимо в исходном запросе использовать значение параметра output=xml.
Ниже приведен XML-ответ сервиса с результатом обработки записи, представленной в начале данной документации.
<record id="1"> <item type="address" role="рабочий адрес"> <Address> ... вариант стандартизации адреса ... </Address> <CheckInfo> ... сводная информация о результате обработки адреса ... </CheckInfo> <BestPhone role="рабочий телефон" item="2"/> </item> <item type="address" role="домашний адрес"> <Address> ... вариант стандартизации адреса ... </Address> <CheckInfo> ... сводная информация о результате обработки адреса ... </CheckInfo> <BestPhone role="рабочий телефон" item="2"/> </item> <item type="phone" role="рабочий телефон"> <Phone type="fixed" verified="1"> ... вариант стандартизации телефона ... </Phone> <CheckInfo> ... сводная информация о результате обработки телефона ... </CheckInfo> <BestAddress role="рабочий адрес" item="0"/> </item> <item type="phone" role="мобильный телефон"> <Phone type="mobile" verified="1"> ... вариант стандартизации телефона ... </Phone> <CheckInfo> ... сводная информация о результате обработки телефона ... </CheckInfo> <BestAddress role="рабочий адрес" item="0"/> </item> <item type="person" role="ФИО"> <Person> ... вариант стандартизации ФИО ... </Person> <CheckInfo> ... сводная информация о результате обработки ФИО ... </CheckInfo> </item> <item type="text" role="Комментарий"> <![CDATA[Данная информация не обрабатывается сервисом]]> </item> </record>
Как и при описании JSON-ответа сервиса, в приведенном выше XML-ответе для простоты изложения результаты стандартизации адресов, телефонов и ФИО заменены комментариями типа "...вариант стандартизации...".
XML-ответ, по аналогии с JSON-ответом, полностью повторяет структуру исходной записи. А именно, ответ сервиса представлен XML-элементом record, содержащим следующую информацию.
Содержимое XML-элемента item в XML-ответе сервиса заполняется результатом обработки и стандартизации исходного элемента записи. Содержимое этого элемента зависит от типа, которому принадлежит обработанный элемент.
Если исходный элемент является почтовым адресом (в этом случае его атрибут type содержит значение address), то результат обработки этого элемента будет содержать результат стандартизации почтового адреса. А именно, в нем будут представлены следующие дочерние XML-элементы.
Если исходный элемент является телефонным номером (в этом случае его атрибут type содержит значение phone), то результат обработки этого элемента будет содержать результат стандартизации телефона. А именно, в нем будут представлены следующие дочерние XML-элементы.
Если исходный элемент содержит информацию о ФИО персоны (в этом случае его атрибут type содержит значение person), то результат обработки этого элемента будет содержать результат стандартизации ФИО. А именно, в нем будут представлены следующие дочерние XML-элементы.
Элемент BestPhone вставляется в результат стандартизации почтового адреса обработанной записи. Данный объект указывает на телефонный номер в рамках обработанной записи, который наилучшим образом соответствует почтовому адресу. Если для адреса не удастся подобрать соответствующий ему телефонный номер, то XML-элемент BestPhone не добавляется в ответ сервиса.
Семантически XML-элемент BestPhone эквивалентен JSON-объекту best_phone, возвращаемому в ответе сервиса при использовании формата JSON.
Пример XML-элемента BestPhone приведен ниже.
<BestPhone role="рабочий телефон" item="2"/>
Элемент BestPhone имеет следующие атрибуты.
Элемент BestAddress вставляется в результат стандартизации телефонного номера обработанной записи. Данный элемент указывает на почтовый адрес в рамках обработанной записи, который наилучшим образом соответствует телефонному номеру. Если для телефона не удастся подобрать соответствующий ему почтовый адрес, то XML-элемент BestAddress не добавляется в ответ сервиса.
Семантически XML-элемент BestAddress эквивалентен JSON-объекту best_address, возвращаемому в ответе сервиса при использовании формата JSON.
Пример XML-элемента BestAddress приведен ниже.
<BestAddress role="рабочий адрес" item="0"/>
Элемент BestAddress имеет следующие атрибуты.