Niejednocznaczne wyszukiwanie adresów w bazie danych

0

Witajcie.
Mam małą zagwozdkę. Mam bazę danych z tabelą zawierającą adresy:

  • miasto,
  • ulica,
  • kod pocztowy,
  • numer domu.

Przykładowo: 84-00 Kraków, Królewny Śnieżki 12

Muszę zrobić skrypt sprawdzający czy dany adres znajduje się w bazie danych.
Problemem jest format wprowadzanych danych przez użytkowników:

  • użytkownicy wpisują np. Kraków 84-00, Dworcowa dwanaście (liczba słownie),
  • Warszawa, ulica Katowice 12 mieszkanie cztery (dopisują "mieszkanie", "przez" etc oraz mieszkają cyfry pisane z liczbami).

Założenie: nie mogę zmienić formatu bazy danych oraz nie mam wpływu na wprowadzanie danych przez użytkowników (dane pochodzą z zewnętrznej aplikacji, na którą nie mam wpływu).

Jak byście rozwiązali powyższy problem?

0

Myślę że nie dasz rady tego zrobić w rozsądnym czasie, bo musisz jakkolwiek znać format albo chociaż cząstkowy format by regexem podejść.

2

Ogólnie to sytuacja bardzo kiepska, prawie beznadziejna. To jest jedno z takich zadań, gdzie automaty zawsze będzie problemem, powinien być człowiek, który to ogarnie albo chociaż zweryfikuje.

Najlepiej byłoby jakoś wpłynąć na sam sposób wprowadzania danych - poprawić formularz, zrobić walidację na froncie itp. no ale że piszesz, że to niemożliwe to lipa.

Może jakimś punktem zaczepienia będzie szukanie słów kluczowych typu "ulica". Jak się takie pojawi to po pierwsze wiesz, że je należy usunąć, a po drugie - zaraz po nim powinna być nazwa właściwa, która chcesz uzyskać.

Jeszcze można próbować to połączyć z jakaś baza ulic w kraju i dopasowywać coś z bazy do tego, co mamy od usera - ale to też nie da gwarancji, że będzie ok.

Pamiętaj - ludzie to idioci i wymyślą 70 sposobów na wprowadzenie adresu tak odjechanych, że żaden z nas by na to nie wpadł, nawet mocno zjarany ;)

1
baracuda napisał(a):

Witajcie.
Mam małą zagwozdkę. Mam bazę danych z tabelą zawierającą adresy:

  • miasto,
  • ulica,
  • kod pocztowy,
  • numer domu.

Przykładowo: 84-00 Kraków, Królewny Śnieżki 12

Muszę zrobić skrypt sprawdzający czy dany adres znajduje się w bazie danych.
Problemem jest format wprowadzanych danych przez użytkowników:

  • użytkownicy wpisują np. Kraków 84-00, Dworcowa dwanaście (liczba słownie),
  • Warszawa, ulica Katowice 12 mieszkanie cztery (dopisują "mieszkanie", "przez" etc oraz mieszkają cyfry pisane z liczbami).

Założenie: nie mogę zmienić formatu bazy danych oraz nie mam wpływu na wprowadzanie danych przez użytkowników (dane pochodzą z zewnętrznej aplikacji, na którą nie mam wpływu).

Jak byście rozwiązali powyższy problem?

Nie da się tego jednoznacznie sprawdzić, niestety. Jak mówisz że ludzie wpisują adres słownie, to nie dasz rady tego rozróżnić, bo są ulice które mają liczebniki w nazwie, np "Aleja Trzech Króli". Pewnie znajdzie się ulica która ma w nazwie "jeden", "dwa", "trzy", "sto", "tysiąc". Dodatkowo, ludzie mogą wpisać liczbę z błędem, np "Dworcowa dwanści" (be e) i skąd wtedy program ma wiedzieć czy to liczebnik czy część ulicy?

No ale jeśli chcesz do tego jakoś podejść, to:

  • rozdziel wprowadzony adres po spacjach i przecinkach na listę słów
  • usuń wszystkie znaki które wiesz że nie należą do adresu: "przez", "mieszkanie", "mieszkania".
  • zrób mapę liczb {jeden:1, dwa:2, trzy:3, "dwadzieścia trzy":23} i zamień część słów na liczby

Ale jak mówiłem, to nie są żadne rozwiązania które dadzą Ci jakiś wiarygodny wynik. Najlepiej byłoby pokazać userowi listę adresów pasujących do wpisanego słowa, i spytać go czy to jest poprawny adres czy nie.

1

Jeśli są to tylko adresy polskie to można podejść do tego jeszcze inaczej.
Podłączasz się do Teryt https://api.stat.gov.pl/Home/TerytApi lub pobierasz aktualny spis adresów i dokonujesz porównania.
Na początek kod pocztowy, bo to masz w oddzielnej kolumnie i chyba ktoś nie wpisze kodu pocztowego słownie?
Potem porównujesz miasto.
Potem porównujesz ulicę wycinając jakieś dodatkowe zwroty lub jak zaproponował @Riddle tworząc słownik liczebników.
Pytanie zasadnicze jak dobre masz dane. Bo ktoś świadomie lub nie może wpisać nieistniejący adres.
No i jakiej precyzji się spodziewasz.
Pamiętaj też że nawet historycznie może okazać się, że komuś zmieniono adres i kiedyś mieszał na "Bohaterów Stalingradu 12" a teraz na "Katastrofy Smoleńskiej 24" a nawet mogą się zmienić miasta czy kody pocztowe.

1

Ja bym polaczyl wszystkie pola w jedno zeby bylo bez myslnikow i przecinkow kropek, zamienil polskie ogonki na odpowiedniki, oraz na male litery.

8400krakowkrolewnysniezki12

i wyszukal np sniezki
LIKE '%sniezki%'

0

Dziękuję za dotychczasowe odpowiedzi :) Requestów będzie ok 120-150 na minutę...

Gdybym chciał wyłowić z tych stringów tylko miasto, to jakbyście się do tego zabrali? Jaka Waszym zdaniem byłaby najlepsza opcja?

1
baracuda napisał(a):

Dziękuję za dotychczasowe odpowiedzi :) Requestów będzie ok 120-150 na minutę...

Gdybym chciał wyłowić z tych stringów tylko miasto, to jakbyście się do tego zabrali? Jaka Waszym zdaniem byłaby najlepsza opcja?

Zrób listę akceptowanych miast i wyciągaj je pojedynczo. Tylko też nie wiem jak miałoby działać, jeśli ktoś wpisze literówki, np: "krakow" "karków" noi jak ze znakami diaryktycznymi. Czy "Łódź" vs "Lodź".

0
Riddle napisał(a):
baracuda napisał(a):

Dziękuję za dotychczasowe odpowiedzi :) Requestów będzie ok 120-150 na minutę...

Gdybym chciał wyłowić z tych stringów tylko miasto, to jakbyście się do tego zabrali? Jaka Waszym zdaniem byłaby najlepsza opcja?

Zrób listę akceptowanych miast i wyciągaj je pojedynczo. Tylko też nie wiem jak miałoby działać, jeśli ktoś wpisze literówki, np: "krakow" "karków" noi jak ze znakami diaryktycznymi. Czy "Łódź" vs "Lodź".

Myślisz nad czymś w stylu:

$string = "Kraków ulica wałowa 18b przez 5";

$array = explode(" ", $string);
$newArray = [];
foreach ($array as $key)
{
	if (!preg_match('~[0-9]+~', $key)) {
    	echo "$key <br/>"; // lecimy z tym do bazy?
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1