2015-08-04 5 views
0

Я пишу программу, которая сбрасывает сообщения в блогах с нескольких веб-сайтов. Я пытаюсь извлечь их австралийские форматированные телефонные номера из свободного текста. Это оказалось довольно сложным.Извлечение телефонных номеров из свободного текста

Вот несколько построенных в блоге разместить примеры:

Пример 1:.

«Здравствуйте, меня зовут Алисия, я 32 и жили в Брисбене в течение последних 40 лет я 6 «высокий и подвижный бегун. С 2004 года я работаю 2-3 раза в неделю. Не стесняйтесь позвонить +61 (04) 654 456 или попробовать другой мой номер 0434 43 22 34.»

От этого блога мне нужно извлечь "04654456" и "0434432234"

Пример 2:

«Я Джо, а также люблю бегать. Стоит 7 футов в высоту и идет с ним с 2004 года. Для обучения советуйте по телефону 043 572-6087 или (02) 1232 23 56. "

От этого блога мне нужно извлечь "0435726087 и "0212322356"

Пример 3:.

" Меня зовут Pricilla и я люблю работать. Вы можете связаться со мной по телефону 0 434 45 45 12, но не звоните до 12:00 вечера (я получил клиентов до 10-11-ий). Мой номер лицензии - 4335TE33, и я управляю Ford Bronco 2004 года с новыми 6-дюймовыми шинами. Я могу проехать 28 км, но обычно требуется перерыв каждые 3 или 4 км. Позвоните мне сегодня (04) 3 445 4512 «

Из этого сообщения в блоге мне нужно извлечь «0434454512».

я придумал довольно сложную систему, что для каждой записи в блоге делает следующее:

1) Отбросьте все не числовые символы, триммеры и удалить двойные пробелы

2) Преобразует строку массив. Итак, теперь у нас есть только массив чисел, например [0, 434, 45, 45, 12, 435, '3', '4', '04', '34', '832', '234]

3) Проведите через массив чисел и примените правила, чтобы собрать их вместе. Этот код раздувается и не очень красив.

4) Подтвердить результат, используя шаблон RegExp для австралийских номеров мобильных и наземных линий

Очевидно, я попытался с помощью регулярных выражений, но они не большое время в этом случае.

Моя система работает большую часть времени, но код не так уж и мал.

Как вы бы на это нанести удар?

+0

Показать коды, которые вы пробовали. – Raptor

ответ

1

Что вы ищете, на самом деле является областью исследований в области обработки естественного языка, известной как извлечение сущности. Существует много подходов к проблеме и нескольких математических моделей для решения таких задач, к счастью, имеются доступные инструменты, которые выполняют аналогичные задачи - OpenNLP и Stanford NER - это несколько примеров. У него есть инструменты для автоматического извлечения имен, дат, частей речи и т. Д. Возможно, вы сможете изменить его для извлечения телефонных номеров - одна вещь, чтобы знать, что это статистические модели (как противостоять основанной на правилам, которая является вашим текущим подходом), поэтому вам понадобятся учебные данные.

Обратите внимание, что это может потребовать значительных изменений в том, что вы сейчас делаете, чтобы оно могло или не стоило того, но если вы собираетесь работать над такими проблемами, связанными с извлечением сущности из неструктурированного текста, возможно, стоит знать об этих инструментах.

Я бы начал с изучения документации OpenNLP/Stanford, чтобы узнать, возможно ли то, что вы ищете.

+0

ну, это вопрос программирования, но NLP, который вы указали, может быть ценным для OP. – Raptor

0

Я хотел бы использовать более простой подход:

  1. Удалить пробелы, запятые, скобки и любой другой символ, вы можете.
  2. используйте регулярное выражение, чтобы соответствовать X цифрам в строке, соответствующей длине австралийских телефонных номеров.
+0

Ibu, это в основном то, что я сейчас делаю. Как сказано, это работает, но не идеальный подход. – ChrisRich

+0

это не работает для вас? это провал? этот подход будет работать для всех 3 примеров, которые вы показали. – Ibu

0

Я бы с регулярным выражением, потому что иногда вы получили неправильные номера, если вы используете только все цифры:

+49 (0) 7121/1229-276

Это должно читаться как местные 071211229276 или международные, 004971211229276 .

+0

Покажите мне RegExp, который может справиться с моими разными примерами и бесконечными немыслимыми способами, которыми пользователи могут писать номера телефонов. Потому что я не смог ни найти, ни построить одну себе! В настоящее время в моем коде я просто игнорирую международные коды. – ChrisRich

+0

https://github.com/ChristianRich/phone-number-extractor – ChrisRich