2015-02-22 2 views
2

Мне нужно проанализировать необработанные записи WHOIS в полях. Нет единого согласованного формата для необработанных данных, и мне нужно поддерживать все возможные форматы (есть около 40 уникальных форматов, о которых я знаю). Для примера, вот выдержки из 3-х различных WHOIS записей необработанные данные:Автоматический анализ данных 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 

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

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

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

Буду рад услышать любые идеи, так как я здесь как-то взволнован. Thanks

+0

Там нет запятой (;) в вашем коде, только двоеточие (:) –

+0

справа вы :-) отредактированные соответственно, спасибо за исправление меня. – KidCrippler

+0

Как вы уже заявили, проблема заключается в отсутствии стандарта для записей WHOIS. Это было бы прекрасно, если бы не было уже более 1000 TLD (постоянно растущее число). Единственный верный способ разбора каждого из форматов правильно и последовательно состоит в том, чтобы написать парсер, настроенный для каждого формата. Среди таких вопросов, как политика ограничения скорости, черные списки и изменения формата, разные серверы могут возвращать данные по-разному даже для одного и того же ДВУ. После попытки создать собственное решение какое-то время я обратился к сервису [хостинга и обслуживания] (https://jsonwhoisapi.com). – sousdev

ответ

0

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

Вы должны продолжить работу с начала. Но вы должны аффинных:

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

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

+0

Спасибо за ответ. Вы предполагаете, что блок кода всегда будет выглядеть как 2-й или 3-й отрывки, но он может выглядеть совсем по-другому (может быть, вообще нет двоеточия ...) Нет простого способа обойти это - регулярное выражение или что-то более сложное – KidCrippler

+0

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

+0

Я думаю, что регулярное выражение не приблизит вас к цели. Regex - не чудесное решение любой проблемы синтаксического анализа. –

1

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

EDIT: дополнительная информация добавлена ​​по запросу. Существует задача, известная в НЛП, как обозначение последовательности, то есть назначение одного или нескольких классов токенам. Основная идея заключается в том, что вы указали такие данные, как «Регистрант/Другое имя/Другое:/Другое DI/Name-start VALENTIO/Name-Inside Rossi/Name-end Contact/Other», и вы тренируете классификатор, чтобы автоматически маркировать дополнительные данные. Как только у вас есть данные, помеченные таким образом, его тривиально извлекать необходимые строки.

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

Записки предостережения:

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

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

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

+0

У меня есть доступ ко многим «помеченным» данным, которые я извлек сам из более «удобных» форматов whois. Можете ли вы рассказать о классификаторе CRF? Может быть, ссылайтесь на пример, где он используется в контексте NLP? Спасибо – KidCrippler

+0

Я добавил дополнительную информацию к ответу –

+0

Спасибо за очень тщательный ответ, я проверю его – KidCrippler

Смежные вопросы