[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