Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
iFlop
Kreisi kasutaja

liitunud: 03.05.2003
|
24.05.2013 15:03:19
Sarnaste aadressite tuvastamine |
|
|
On olemas 2 aadressite nimekirja, mida sooviksin omavahel võrrelda. Eeldame, et esimeses nimekirjas on kõik sobivad aadressid korrektsel kujul ning teises nimekirjas on mingi osa nendest samades aadressitest natuke teisel kujul kirjutatud.
Näiteks mõned võimalikud A. H. Tammsaare tee 123 kujud:
A H Tammsaare 123 II-korrus
Tammsaare tee 123
A.H.Tammsaare tee 123, Tallinn
jne.
Olen jõudnud nii kaugele, et Approximate string matching peaks olema see, mida mul vaja läheks, aga vastavaid algoritme on mitmeid ning hetkel pole väga palju aega neid põhjalikumalt uurida.
Äkki keegi oskab soovitada mõnda valimis library't või teeki, mis vastavaid aadressi nimekirju küllaltki lihtsalt võrrelda suudaks? Eelistatud keelteks oleks php või java, aga kui väga vaja, siis saaks vast ka JSi või VBAga hakkama..
|
|
Kommentaarid: 67 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
66 |
|
tagasi üles |
|
 |
napoleon
Unknown virus

liitunud: 08.12.2008
|
24.05.2013 16:33:59
|
|
|
Ma ei tea, milleks sul seda vaja on, aga kui oled nõus natuke raha välja käima, võid ka Regiost uurida. Kui vaatad näiteks delfi kaardi autocomplete'i, siis umbes samasugust API-t pakuvad nad ka kuumaksu eest klientidele, et annad selle stringi sisse ja leitakse sobivad aadressid. Lisaboonusena saad korrektse aadressi struktuuri(eraldi lahtrites linn, maakond, tänav, küla jne.) pluss aadressi gps koordinaadi seega hilisemad võrdused või muu töötlus on oluliselt lihtsam.
Aga lihtsa lahdusena võib abi olla ka mysql'i SOUNDEX funktsioonist.
|
|
Kommentaarid: 77 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
60 |
|
tagasi üles |
|
 |
iFlop
Kreisi kasutaja

liitunud: 03.05.2003
|
24.05.2013 17:05:17
|
|
|
napoleon, antud juhul on vaja võrrelda ikkagi kindlaid nimekirju. 3. nimekirja saaks loomulikult mõne API abi sisse tuua, aga hetkel sobiks paremini mingisugune quick 'n' dirty lahendus.
Hetkel jõudsin natuke uurida SimMetrics nimelist asja, mis esmapilgul paistab toimivat. Sealt terve hunnik erinevaid algoritme koos.
|
|
Kommentaarid: 67 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
66 |
|
tagasi üles |
|
 |
napoleon
Unknown virus

liitunud: 08.12.2008
|
24.05.2013 17:17:44
|
|
|
Mõtlesin seda, et suurema osa aadressite puhul suudaks regio tõenäoliselt selle stringi järgi aadressi leida ja kui mõlemad baasid ära oled korrastanud, saad kasvõi gps koordinaatide järgi neid võrrelda. Aga eks ta oleneb ka baasi suurusest, pisema hulga puhul võib üritada ka põlveotsas midagi nikerdada ja viimased käsitsi kokku panna.
|
|
Kommentaarid: 77 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
60 |
|
tagasi üles |
|
 |
iFlop
Kreisi kasutaja

liitunud: 03.05.2003
|
27.05.2013 14:41:05
|
|
|
Lõpuks jõudsin nüüd ka reaalselt seda SimMetrics'it testida ning asi tõesti toimib
Suuremate nimekirjade match'imisel võtab tulemuste leidmine natuke aega, aga igal juhul on see oluliselt kiirem, kui seda käsitsi teha
Kui mitut erinevat algoritmi kombineerida siis tuli täpsuseks üle 95% ning ebatäpsete vastete puhul olid ka similarity score selgelt madalam.
Siin on ka vastav java kood kahe nimekirja mappimiseks:
java:
|
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import uk.ac.shef.wit.simmetrics.similaritymetrics.AbstractStringMetric; import uk.ac.shef.wit.simmetrics.similaritymetrics.MongeElkan; import uk.ac.shef.wit.simmetrics.similaritymetrics.SmithWaterman; import uk.ac.shef.wit.simmetrics.similaritymetrics.SmithWatermanGotoh; import uk.ac.shef.wit.simmetrics.similaritymetrics.SmithWatermanGotohWindowedAffine; public final class Mapping { public static void main (final String[] args ) { String[] arr1 = readLines ("data/map.txt"); String[] arr2 = readLines ("data/master.txt"); float p = 0f; float result = getMatchLikelyhood(map, master); if (result > p) { p = result; match = master; } } System. out. println(map + "\t" + p + "\t" + match ); } } private static float getMatchLikelyhood (final String str1, final String str2 ) { AbstractStringMetric metric; float avg = 0F, result = 0F; metric = new SmithWaterman(); result = metric.getSimilarity(str1, str2); avg += result; metric = new SmithWatermanGotoh(); result = metric.getSimilarity(str1, str2); avg += result; metric = new SmithWatermanGotohWindowedAffine(); result = metric.getSimilarity(str1, str2); avg += result; metric = new MongeElkan(); result = metric.getSimilarity(str1, str2); avg += result; return (avg / 4.0F) * 100.0F; } List<String> lines = new ArrayList<String>(); try { e.printStackTrace(); } try { while ((line = reader.readLine()) != null) { lines.add(line); } reader.close(); e.printStackTrace(); } return lines. toArray(new String[lines. size()]); } }
|
EDIT: järsku avastasin, et PHPs on olemas selline funktsioon nagu similar_text. Kuidas ma küll seda varem ei märganud
Aga sama testi põhjal selgus, et similar_text täpsus pole võrreldav selle java näitega, ehk teisisõnu erinevad alogritmid toimivad erinevalt
|
|
Kommentaarid: 67 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
66 |
|
tagasi üles |
|
 |
telefoon
HV vaatleja
liitunud: 05.05.2003
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
Aruta
HV vaatleja
liitunud: 29.10.2009
|
28.05.2013 08:47:04
|
|
|
Praktiline kogemus GPSi otsinguga.
Teatad telefonis: Aadress on Wiiralti .....
Varsti saad uue kõne: Ainus Viiralti tänav on Tallinnas.
***
Täidad maksuameti ankeeti:
Aadress E.Wiiralti
Arvuti vastab: Täpsustage ka teise aadressi andmed.
Jätad ära punkti, korras.
DOSi all oli kena sistem:
? on üks midagi
* on ükskõik kuipalju ükskõik mida
Selles stiilis sai kirjutada otsingumootoreid. Ka webi jaoks.
Juurdepääsuga serveris sai mootori kenasti C-s kirja panna ja 20 MB hulgast leiti otsitav üle võrgu 0,2 sekundiga.
Aasta oli siis ca 95. Sellist kirjapilti kaasaegne Google enam ei tunnista.
Alustaja näites võiks alustuseks võtta ette pikima sõna ja otsida.
Siis lubada sõnas 1, 2, 3... viga.
Sellist lahendust sai kunagi kasutatud spelleri kirjutamisel.
Aga kui proged ja libid olemas siis ei pea ju ise mõtlema.
|
|
tagasi üles |
|
 |
kalvis
Kreisi kasutaja
liitunud: 20.10.2009
|
29.05.2013 11:49:58
|
|
|
Kunagi, kui pidin palju aadressitöötlust tegema siis oli mul excelis (aadressid anti mul excelis) just selle jaoks oma script tehtud. Õnneks oli Regio aadresside andmebaas korrektne seege käis korrastamine lihtsa algoritmi järgi - otsisin kas A. H (või A H) saab teisendada alamhulgaks Anton Hansen Tammsaare tee 123. Lahendus oli: kõigepealt iga stringi sidurdamine, st. erimärkide järgi iga sõna või tähekombinatsioon oma stringi. Korduvaid erimärke võis ignoreerida. Kas jätad punkti alles või teed enne erimärki ka lõpus punktiga olevate võimalike lühendite erikontrolli (t.=tee, t=tee jne. - maitse asi. Nüüd allesjäänud ühetähelistele tegin erikontrolli täisnimega - kui A oli Anton esimene täht siis sobis. Igaks juhuks tegin võimalike erijuhu, et kui nüüd oli peeaegu vaste (erinevus 1 või 2 märki) siis küsiti kasutajalt kas ta kiidab heaks lähima vastega aadressi (aadressi sai muidugi valida ka aadresslistist). Kui ei leitud siis vigased aadressid tegin Boldiks või kandsin eraldi sheeti. Süsteem töötas ülihästi, sest ainsana sattusid vigasesse sheeti ikka totaalselt valesti kirjutatud aadressid. Lausa uskumatu kui valesti oskavad inimesed aadresse kirjutada (Talin ja Tallin jne.). Samas tee, pst jt tuntud lisalühendid võisid puududda (p.=põik aga mitte)
|
|
tagasi üles |
|
 |
iFlop
Kreisi kasutaja

liitunud: 03.05.2003
|
29.05.2013 13:29:15
|
|
|
kalvis kirjutas: |
Lausa uskumatu kui valesti oskavad inimesed aadresse kirjutada (Talin ja Tallin jne.) |
See ei tohiks ju väga suur uudis olla
Ühtalsi tähendab see seda, et spetsiifiliste vigade kontrollimisega võib hulluks minna.. Näiteks kui kõikvõimalike lühenditega arvestada tahad. Fuzzy string matching tundub aga oluliselt universaalsem lahendus olevad. Saad nime+aadressi+linna/maakonna+muu läbu kokku keevitada ning enda näite puhul olid tulemused vägagi täpsed.
iFlop kirjutas: |
Aga sama testi põhjal selgus, et similar_text täpsus pole võrreldav selle java näitega |
PHP similar_text funktsioonil pole ka midagi viga. Algselt suutsin ise ühe vea sisse tuua, mistõttu näitas see aiateibaid. Samas sellegi poolest töötab kombineeritud SmithWaterman + SmithWatermanGotoh + SmithWatermanGotohWindowedAffine + MongeElkan enda kogemuse puhul märksa täpsemalt.
|
|
Kommentaarid: 67 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
66 |
|
tagasi üles |
|
 |
|