Автоматический анализ данных whois

Мне нужно разбить записи необработанных данных WHOIS на поля. Не существует единого согласованного формата для необработанных данных, и мне нужно поддерживать все возможные форматы (мне известно около 40 уникальных форматов). Например, вот выдержки из 3 разных записей необработанных данных WHOIS:

Created on: 2007-01-04
Updated on: 2014-01-29
Expires on: 2015-01-04
Registrant Name: 0,75 DI VALENTINO ROSSI
Contact: 0,75 Di Valentino Rossi
Registrant Address: Via Garibaldi 22
Registrant City: Pradalunga
Registrant Postal Code: 24020
Registrant Country: IT
Administrative Contact Organization: Giorgio Valoti
Administrative Contact Name: Giorgio Valoti
Administrative Contact Address: Via S. Lucia 2
Administrative Contact City: Pradalunga
Administrative Contact Postal Code: 24020
Administrative Contact Country: IT
Administrative Contact Email: [email protected]
Administrative Contact Tel: +39 340 4050596
---------------------------------------------------------------
Registrant :
onse telecom corporation
Gangdong-gu Sangil-dong, Seoul

Administrative Contact :
onse telecom corporation    [email protected]
Gangdong-gu Sangil-dong, Seoul, 
07079976571

Record created on 19-Jul-2004 EDT.
Record expires on 19-Jul-2015 EDT.
Record last updated on 15-Jul-2014 EDT.
---------------------------------------------------------------
Registrant:

Name:                markaviva comunica??o Ltda
Organization:        markaviva comunica??o Ltda
E-mail:              [email protected]
Address:             RUA FERNANDES LIMA 360 sala 03
Address:             57300070
Address:             ARAPIRACA - AL
Phone:               55 11 40039011
Country:             BRASIL
Created:             20130405
Updated:             20130405

Administrative Contact:

Name:                markaviva comunica??o Ltda
Organization:        markaviva comunica??o Ltda
E-mail:              [email protected]
Address:             RUA FERNANDES LIMA 360 sala 03
Address:             57300070
Address:             ARAPIRACA - AL
Phone:               55 11 40039011
Country:             BRASIL
Created:             20130405
Updated:             20130405

Как видите, повторяющегося шаблона нет. Мне нужно извлечь такие поля, как «Имя регистранта», «Адрес регистранта», «Имя администратора», «Город администратора» и т. д.

Сначала я попробовал базовый метод извлечения поля, основанный на разбиении строки по первому найденному двоеточию, но он работает только тогда, когда префиксы строк различны, инъективны (две строки с одинаковым префиксом не существуют) и, ну, в общем, разделены двоеточие... (что не всегда так)

Теперь я мог бы просмотреть форматы один за другим и попытаться придумать регулярное выражение для каждого из них, но это потребовало бы много времени, которого у меня нет. Интересно, есть ли способ автоматически анализировать и обрабатывать блоки текста как «фрагмент» на основе контекста (в отношении их интервалов и общих повторяющихся слов, таких как «регистрант» или «администратор») и анализировать их соответствующим образом. НЛП Может быть?

Я буду рад услышать любые идеи, так как я здесь как бы в тупике. Спасибо


person KidCrippler    schedule 22.02.2015    source источник
comment
В вашем коде нет точек с запятой (;), только двоеточия (:)   -  person Lorenz Meyer    schedule 22.02.2015
comment
Вы правы :-) Отредактировано соответственно, спасибо, что поправили меня.   -  person KidCrippler    schedule 22.02.2015
comment
Как вы сказали, проблема заключается в отсутствии стандарта для записей WHOIS. Это было бы хорошо, если бы уже не существовало более 1000 TLD (число постоянно растет). Единственный верный способ правильно и последовательно проанализировать каждый из форматов — это написать анализатор, настроенный для каждого формата. Среди таких проблем, как политики ограничения скорости, черные списки и изменения формата, разные серверы могут по-разному возвращать данные даже для одного и того же TLD. После некоторого времени попыток создать собственное решение я обратился к размещенному и поддерживаемому сервису.   -  person sousdev    schedule 16.08.2016


Ответы (2)


На самом деле, есть способы выполнить работу без ручного анализа каждого формата, но они могут оказаться еще более сложными и трудоемкими, особенно если вы с ними не знакомы. Я бы попробовал, например, создать синтаксический анализатор для одного формата, разобрать много данных, затем получить те же данные в каждом из других 39 форматов и использовать уже полученные знания для присвоения меток каждому токену (например, «Имя регистранта», « Адрес"... и "Другое"). После этого можно обучить какой-либо классификатор последовательности, такой как CRF, с использованием помеченных данных, или можно применить какой-либо другой метод, например автоматическое создание регулярных выражений.

РЕДАКТИРОВАТЬ: Дополнительная информация добавлена ​​по запросу. Существует задача, известная в НЛП как маркировка последовательностей, т. е. присвоение маркерам одного или нескольких классов. Основная идея заключается в том, что вы помечаете данные как «Регистрант/Другое имя/Другое:/Другой DI/Имя-начало VALENTIO/Имя-внутри Росси/Имя-конец контакта/Другое», и вы обучаете классификатор автоматически маркировать дополнительные данные. После того, как у вас есть данные, помеченные таким образом, извлечь необходимые строки будет тривиально.

Широко используемыми классификаторами являются условные случайные поля (CRF) и (в последнее время) классификаторы на основе рекуррентных нейронных сетей. Математика, стоящая за ними, немного сложна, но есть готовые инструменты, которые можно использовать (в некоторой степени) как черные ящики. Я описал пример использования в этом ответе где вы можете найти пошаговую инструкцию.

Примечания об осторожности:

  1. Не исключено, что некоторые классификаторы могут обобщать неизвестные форматы, учитывая только образцы в известных форматах, но обычно вам нужны примеры в нескольких разных форматах. Можно вручную пометить пару обучающих образцов, или, как я предложил, один из способов получить такие примеры — получить известные данные в нескольких форматах и ​​присвоить маркерам метки на основе ваших знаний. Например, если вы знаете, что DI VALENTINO ROSSI — это имя владельца регистрации в одном формате, вы можете найти его и пометить как имя владельца регистрации в другом формате.

  2. CRF и другие классификаторы не гарантируют 100% точный прогноз. Точность будет зависеть от количества обучающих выборок и особенностей шаблона и варьироваться от одной задачи к другой. С одной стороны, хорошая модель CRF может быть устойчива к изменениям формата, небольшим ошибкам в формате и новым форматам — ситуациям, когда написанный от руки анализатор обычно дает сбой. Я думаю, что для вашей задачи это должно работать хорошо, но никто не может сказать, пока вы на самом деле не попробуете и не увидите. С помощью этого подхода я решил пару похожих задач, таких как разбор прайс-листа в свободной форме, анализ почтового адреса и т.д.

  3. Требуется некоторое время, чтобы ознакомиться со всей концепцией.

person Denis Tarasov    schedule 22.02.2015
comment
У меня есть доступ к большому количеству размеченных данных, которые я извлек сам из более удобных форматов whois. Не могли бы вы рассказать о классификаторе CRF? Может быть, посоветуете мне пример, где это используется в контексте НЛП? Спасибо - person KidCrippler; 22.02.2015
comment
Я добавил больше информации в ответ - person Denis Tarasov; 22.02.2015
comment
Спасибо за очень развернутый ответ, буду знать - person KidCrippler; 22.02.2015

Невозможно обойти анализ каждого формата. Кроме того, не используйте здесь регулярное выражение.

Вы должны продолжать, как вы начали. Но вы должны аффинировать:

  • если две строки имеют одинаковую метку, поместите содержимое в массив (например, «Адрес»)
  • если строка заканчивается на «:», читается до тех пор, пока следующая строка не станет пустой или не закончится на «:».

После синтаксического анализа вам необходимо стандартизировать данные, которые будут иметь разные уровни ключей и деталей.

person Lorenz Meyer    schedule 22.02.2015
comment
Спасибо за ответ. Вы предполагаете, что блок кода всегда будет выглядеть как 2-й или 3-й отрывок, но он может выглядеть совсем иначе (может быть, двоеточия вообще нет...) Нет простого способа обойти это - регулярное выражение или что-то более сложное - person KidCrippler; 22.02.2015
comment
Или как первый отрывок... В любом случае решения, подходящего для всех, не будет. Вы должны найти способ синтаксического анализа, который работает для большинства, обнаружить другие и написать для них более специализированный синтаксический анализатор. - person Lorenz Meyer; 22.02.2015
comment
Я думаю, что регулярное выражение не приблизит вас к цели. Регулярные выражения не являются чудесным решением любой проблемы синтаксического анализа. - person Lorenz Meyer; 22.02.2015