[P&AM Lab] Парсинг строк.
lonely.ruyk
lonely.ruyk на mail.ru
Пт Мар 22 20:35:10 MSK 2013
Привет всем из списка рассылки.
Столкнулся с небольшой проблемкой, надеюсь кто-нибудь помогёт советом
или линком.
В общем у меня есть задание: нужно написать парсер который каждую
введённую строку (состоящую из названий городов, населённых пунктов,
стран) должен распарсить на элементы которые уже потом как-то
обрабатываться будут (в моём случае будут запихиваться в бд но это
наверное не важно).
Приведу простой пример. Строка:
г.Гусь-Хрустальный Владимирская обл.
должна распарситься на
1) г.Гусь-Хрустальный
2) владимирская область
Подводные камни:
1) Строки могут состоять из произвольного кол-ва элементов (т.е. может
быть только название города и страны, а может быть 3 - 4 элемента,
например посёлок - автономный округ - страна)
2) Порядок не задан. Т.е. могут встречаться строки где элементы
перечислены от большего к меньшему или от меньшего к большему
3) могут быть названия из 2 и более слов (пример: Нижнее Ивкино,
ненецкий автономный округ)
4) разграничителем записей может был как пробел так и запятые
5) строк порядка 58к
Посылаю пример прототипа на питоне.
Чего он делает:
1)строка нормализуется (добавляются пробелы в некоторых местах,
убираются запятые и прочие лишние символы) и разбивается на список слов
2) каждое слово сравнивается с набором префиксов (например г. с.
Республика) и постфиксов((например район, край, ССР) если это префикс
то в результирующий список заносится следующее слово, если суффикс то
предыдущее
3) производится попытка соединить названия из 2-х слов (пытаюсь найти
прилагательное и объединить его со следующим словом)
Почему я пишу это длинное сообщение (надеюсь хоть кто-то до этого
момента дочитал):
алгоритм обрабатывает не все случаи и я не уверен что я делаю всё
оптимально и хотелось бы услышать чьё то мнение по коду и идеям пока
всё не зашло слишком далеко).
Мои вопросы:
1) есть ли более простые способы?
2) может что то стоит изменить/добавить?
Во вложении исходник и первые 1000 строк данных)
небольшое пояснение по использованию скрипта. на stdin кормятся данные,
на stdout выводится список, элементы которого разделены
последовательностью "=>". В скобках указан номер типа территории
(определяю по префиксам, постфиксам)
тип номер
поселение 1
район 2
провинция 3
страна 4
Пример:
Познанка-1 (1) =>Любашевский район (2) =>Одесская область (3) =>
Вместо PS: Извините за кривоту кода(только прототип + его нужно будет
переписать под другой ЯП поэтому всё немножко не оптимально написано) и
многословность.
Вместо PPS: Может кто-то имел дело со всякими PL/SQL. Отзовись, добрый
человек, нужно задать пару вопросов:).
Вместо PPPS: Отдельное спасибо всем дочитавшим.
----------- следущая часть -----------
An embedded and charset-unspecified text was scrubbed...
Name: data.txt
URL: <http://amplab.syktsu.ru/pipermail/lab/attachments/20130322/ceaae154/attachment.txt>
----------- следущая часть -----------
A non-text attachment was scrubbed...
Name: split.py
Type: text/x-python
Size: 6861 bytes
Desc: отсутствует
URL: <http://amplab.syktsu.ru/pipermail/lab/attachments/20130322/ceaae154/attachment.py>
Подробная информация о списке рассылки Lab