Что нового

Определить указаны ли в адресе улица и дом.

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
С начала подумал, что может быть проще... а задача оказывается не самая тривиальная.

Дано:
База данных с адресами.
Альметьевск Ленина 100
г.Менделеевск, ул.Фомина, д.19 423650
423570 г.Нижнекамск, ул. Площадь 50 лет Октября, д.3а
с.Баз.Матаки, ул.Крайнова, 56
г. Казань, ул. Парковая, 10
Елабужский р-н, с.Т.Дюм-Дюм, ул.Школьная,3
г.Казань, ул.С.Перовской, 150

г. Лаишево, ул. М.Ульяновой,54
г.Агрыз, пер. Нариманова, д.4а
с. Актаныш, пр. Мира, 9

Рыбно-Слободской МР, пгт. Кутлу Букаш
423719,РТ,Мензелинский район,д.Коноваловка
422592, Республика Татарстан, Верхнеуслонский район, с Печищи

Требуется:
Нужно определить с долей вероятности есть ли улица и дом.(true/false) Погрешность в 1-2% не существенна.

Готовый код не нужен. Хочу понять саму концепцию решения данной задачи. (+ писать придется на PHP...)

1-е что подумал это поиск цифры в адресе... но встречается иногда почтовый индекс или "50 лет октября"
2-е это где-то указано ул. пр. пер.... т.е. находя конструкцию "ул.","пр.","пер." + "цифру после неё"
3-е улицы имеет, как правило одинаковые окончания... "ина","ова","овой","ая"...
4-е "проспект","Бульвар","переулок"
5-е Регион только "Республика Татарстан", так что можно перед определением убить индекс, чтобы не мешал. "42[\d]{4,4}"

Возможно, что-то упускаю? :scratch:
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Re: Определение указаны ли в адресе улица и дом.

zlo-kazan
Первые несколько символов в строке отбрасывать?
 
Автор
zlo-kazan

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
WSWR

Не особо понял, о чем ты.
(если про: "убить индекс"... это избавит от лишних цифр... потому, что индекс может быть и вначале и в середине и в конце... вместо номера дома)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
zlo-kazan,
С домом можно примерно так попробовать.
Код:
;#include <Array.au3>

$sText = FileRead(@ScriptDir & '\test.txt')
$aText = StringSplit(StringStripCR($sText), @LF)

For $i = 1 To $aText[0]
	$sTemp = StringRegExpReplace($aText[$i], '[\d]{6}', '')
	If StringInStr($sTemp, ',') Then
		$sDel = ','
	Else
		$sDel = ' '
	EndIf
	$aTemp = StringSplit($sTemp, $sDel)
	;_ArrayDisplay($aTemp, $i & '(' & $aText[0] & ')')
	;здесь как-то анализировать $sTemp[$sTemp[0]] на номер дома и $sTemp[$sTemp[0] - 1] на улицу, например, по дому так:
	If StringRegExp($aTemp[$aTemp[0]], '.*д?\.?.*(\d+)') Then
		ConsoleWrite($aText[$i] & @TAB & '--> номер дома есть' & @LF)
	Else
		ConsoleWrite($aText[$i] & @TAB & '--> номера дома нет' & @LF)
	EndIf
Next
Надо паттерн изменять, если адрес типа 423570 г.Нижнекамск, д.Без урожая 30 лет, то говорит, что номер дома есть.
 
Автор
zlo-kazan

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Немного криво, но наглядно и работает... не срабатывает только на очень редких названиях улицы из 500... всего 1-2 ошибки...

PHP:
$chek_adress = $row['adress'];
$chek_adress=preg_replace("/42[\d]{4,4}/si", "", $chek_adress);
$chek_adress=preg_match("/(пр-кт|Пр-кт|пр-т|Пр-т|про-спект|пр |ул |пер |пр\,|ул\,|пер\,|Пр\,|Ул\,|Пер\,|пр\.|ул\.|пер\.|Пр |Ул |Пер |Пр\.|Ул\.|Пер\.|ПР |УЛ |ПЕР |ПР\.|УЛ\.|ПЕР\.|проспект|бульвар|улица|Проспект|Бульвар|Улица|ПРОСПЕКТ|БУЛЬВАР|УЛИЦА|ина |ова |овой |ая |ина\,|ова\,|овой\,|ая\,).*?[\d]{1,3}/s",$chek_adress);
 

Microteam

Осваивающий
Сообщения
74
Репутация
34
Итак у нас там есть запятые, можно их считать, потом у нас есть цифры их тоже можно считать, но после того как удалится индекс...
PHP:
<?php

$b = "Адрес сюды!";

$a = preg_replace("/^\\d{6,6}$/i","",$b);

$address_valid = false;
if (!preg_match("/^,{2,3}$/i", $a)) {

if (preg_match("/^\\d{1,3}$/i", $a))
$address_valid = true;
}
else
$adress_valid = true;
?>

Думаю понятно... Сначала мы смотрим есть ли запятые, потом если их нет, то мы смотрим есть ли цифры... Если есть, то $adess_valid будет true, иначе false
 
Автор
zlo-kazan

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Эм... а зачем смотреть есть ли запятые? :smile:

Есть:
"Альметьевск Ленина 100"
и есть:
"423719,РТ,Мензелинский район,д.Коноваловка"

А может быть и наоборот:
"д.Коноваловка"
и "Альметьевск, Ленина, 100"

А может быть и "Елабужский р-н, С. Яковлево 8(8-5557-)7-20-24"

P.S. Базу создавали в течении 5-6 лет, совершенно разные люди... в разном настроении... и без всякого регламента. :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
zlo-kazan [?]
не срабатывает только на очень редких названиях улицы
Не знаю названий улиц в Татарстане, но вот в Питере:
[box title=Названия улиц]
  • ул.Лазо
  • Невский пр.
  • ул.Тельмана
  • ул.Зодчего Росси
  • Индустриальный пр.
  • ул.Коммуны
  • и т.д. и т.п.
[/box]
 
Автор
zlo-kazan

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
В России и Татарстане довольно сильно различаются. Работал в Москве, все названия улиц казались очень необычные. :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Автор
zlo-kazan

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Garrett
Да MySQL.

А что за 1 волшебный запрос? :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
zlo-kazan [?]
А что за 1 волшебный запрос?
Вам нужно знать структуру вашей БД, и просто проверять то или иное значение в базе. Если есть то возвращать, если нет то "null"
Загляните сюда
 
Автор
zlo-kazan

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Базу MySQL проектировал сам... :smile:
Значение столбца "adress" это всякая хрень на подобии той что скинул...
т.е. не хранится отдельно Регион, Город, Улица, дом... весь адрес это одна ячейка.

Если бы изначально делал всю систему сам, то там был бы или четкий формат адреса или разделение по ячейкам отдельно... (До меня это была таблица Excel в которую добавляли строки и кричали: "у кого открыто? Мне нужно добавить запись!!")
 
Верх