Автоматический анализ данных 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: giorgio_v@mac.com
Administrative Contact Tel: +39 340 4050596
---------------------------------------------------------------
Registrant :
onse telecom corporation
Gangdong-gu Sangil-dong, Seoul
Administrative Contact :
onse telecom corporation ruhisashi@onsetel.co.kr
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: helissonmaia@markaviva.com.br
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: helissonmaia@markaviva.com.br
Address: RUA FERNANDES LIMA 360 sala 03
Address: 57300070
Address: ARAPIRACA - AL
Phone: 55 11 40039011
Country: BRASIL
Created: 20130405
Updated: 20130405
Как видите, повторяющегося паттерна нет. Мне нужно извлечь поля, такие как "Имя владельца", "Адрес владельца", "Имя администратора", "Город администратора" и т. Д.
Сначала я попробовал базовый метод извлечения поля, основанный на разбиении строки по первому найденному двоеточию, но он работает только тогда, когда префиксы строк различны, инъективны (нет двух строк с одинаковым префиксом) и, ну, в общем, разделены двоеточие... (что не всегда так)
Теперь я могу просмотреть форматы один за другим и попытаться найти регулярное выражение для каждого из них, но для этого потребуется много времени, которого у меня нет. Интересно, есть ли способ автоматически извлекать и обрабатывать блоки текста как контекстный "кусок" (с учетом их пробелов и общих повторяющихся слов, таких как "владелец домена" или "администратор") и анализировать их соответствующим образом. НЛП Может быть?
Я буду рад выслушать любые идеи, так как я немного озадачен здесь. Спасибо
2 ответа
На самом деле, есть способы выполнить работу без ручного анализа каждого формата, но они могут оказаться еще более сложными и трудоемкими, особенно если вы с ними не знакомы. Я хотел бы, например, создать парсер для одного формата, проанализировать много данных, затем получить те же данные в каждом из 39 других форматов и использовать уже полученные знания, чтобы назначить метки для каждого токена (например, "Имя Registant", " Адрес "... и" Другой "). После этого некоторый классификатор последовательностей, такой как CRF, может быть обучен с использованием помеченных данных, или может быть применен какой-либо другой метод, такой как автоматическая генерация регулярных выражений.
РЕДАКТИРОВАТЬ: Дополнительная информация добавляется по запросу. Существует задача, известная в NLP как маркировка последовательности, то есть назначение одного или нескольких классов токенам. Основная идея заключается в том, что вы пометили данные, такие как "Регистрант / Другое имя / Другое:/ Другой DI/ Имя-начало VALENTIO/ Имя-Внутри Росси / Имя-конец-контакт / Другое", и вы обучаете классификатор для автоматической маркировки дальнейших данных. Как только у вас есть данные, помеченные таким образом, извлекать необходимые строки просто.
Широко используемыми классификаторами являются условные случайные поля (CRF) и (недавно) рекуррентные классификаторы на основе нейронных сетей. Математика позади них немного сложна, но есть готовые инструменты, которые можно использовать (в некоторой степени) как черные ящики. В этом ответе я привел пример использования, в котором вы можете найти пошаговую инструкцию.
Примечания осторожности:
Не исключено, что некоторые классификаторы могут обобщать в неизвестные форматы, используя только примеры в известных форматах, но обычно вам нужны примеры в нескольких различных форматах. Можно вручную пометить пару обучающих примеров или, как я предложил, один из способов получить такие примеры - это получить известные данные в нескольких форматах и назначить метки токенам на основе ваших знаний. Например, если вы знаете, что DI VALENTINO ROSSI является именем регистранта в одном формате, вы можете найти его и пометить как имя регистранта в другом формате.
CRF и другие классификаторы не гарантируют 100% совершенного прогноза. Точность будет зависеть от количества обучающих образцов и особенностей шаблона и варьироваться от одной задачи к другой. Положительным моментом является то, что хорошая модель CRF может быть устойчивой к изменениям формата, небольшим ошибкам в формате и новым форматам - в ситуациях, когда рукописный синтаксический анализатор обычно дает сбой. Я думаю, что для вашей задачи это должно работать хорошо, но никто не может сказать, пока вы на самом деле не попробуете и увидите. С этим подходом я решил несколько похожих проблем, таких как разбор прайс-листов произвольной формы, разбор почтовых адресов и т. Д.
Требуется некоторое время, чтобы ознакомиться со всей концепцией.
Не будет никакого способа обойти анализ каждого формата. Кроме того, не используйте регулярные выражения здесь.
Вы должны продолжить, как вы начали. Но вы должны аффинно:
- если две строки имеют одинаковую метку, поместите содержимое в массив (например, для "адреса")
- если строка заканчивается символом ":", пока следующая строка не станет пустой или не закончится знаком ":".
После анализа вам необходимо стандартизировать данные, которые будут иметь разные уровни ключей и деталей.