Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Sarnaste aadressite tuvastamine märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
iFlop
Kreisi kasutaja
iFlop

liitunud: 03.05.2003



Autoriseeritud ID-kaardiga

sõnum 24.05.2013 15:03:19 Sarnaste aadressite tuvastamine vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 24.05.2013 16:33:59 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
iFlop
Kreisi kasutaja
iFlop

liitunud: 03.05.2003



Autoriseeritud ID-kaardiga

sõnum 24.05.2013 17:05:17 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 24.05.2013 17:17:44 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
iFlop
Kreisi kasutaja
iFlop

liitunud: 03.05.2003



Autoriseeritud ID-kaardiga

sõnum 27.05.2013 14:41:05 vasta tsitaadiga

Lõpuks jõudsin nüüd ka reaalselt seda SimMetrics'it testida ning asi tõesti toimib thumbs_up.gif
Suuremate nimekirjade match'imisel võtab tulemuste leidmine natuke aega, aga igal juhul on see oluliselt kiirem, kui seda käsitsi teha icon_biggrin.gif
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:
  1.  
  2. import java.io.BufferedReader;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8.  
  9. import uk.ac.shef.wit.simmetrics.similaritymetrics.AbstractStringMetric;
  10. import uk.ac.shef.wit.simmetrics.similaritymetrics.MongeElkan;
  11. import uk.ac.shef.wit.simmetrics.similaritymetrics.SmithWaterman;
  12. import uk.ac.shef.wit.simmetrics.similaritymetrics.SmithWatermanGotoh;
  13. import uk.ac.shef.wit.simmetrics.similaritymetrics.SmithWatermanGotohWindowedAffine;
  14.  
  15. public final class Mapping {
  16.  
  17.         public static void main(final String[] args) {
  18.                
  19.                 String[] arr1 = readLines("data/map.txt");
  20.                 String[] arr2 = readLines("data/master.txt");
  21.  
  22.                 for (String map : arr1) {
  23.  
  24.                         float p = 0f;
  25.                         String match = null;
  26.  
  27.                         for (String master : arr2) {
  28.                                 float result = getMatchLikelyhood(map, master);
  29.  
  30.                                 if (result > p) {
  31.                                         p = result;
  32.                                         match = master;
  33.                                 }
  34.                         }
  35.  
  36.                         System.out.println(map + "\t" + p + "\t" + match);
  37.                 }
  38.         }
  39.  
  40.         private static float getMatchLikelyhood(final String str1, final String str2) {
  41.                 AbstractStringMetric metric;
  42.  
  43.                 float avg = 0F, result = 0F;
  44.  
  45.                 metric = new SmithWaterman();
  46.                 result = metric.getSimilarity(str1, str2);
  47.                 avg += result;
  48.  
  49.                 metric = new SmithWatermanGotoh();
  50.                 result = metric.getSimilarity(str1, str2);
  51.                 avg += result;
  52.  
  53.                 metric = new SmithWatermanGotohWindowedAffine();
  54.                 result = metric.getSimilarity(str1, str2);
  55.                 avg += result;
  56.  
  57.                 metric = new MongeElkan();
  58.                 result = metric.getSimilarity(str1, str2);
  59.                 avg += result;
  60.  
  61.                 return (avg / 4.0F) * 100.0F;
  62.         }
  63.  
  64.         public static String[] readLines(String path) {
  65.  
  66.                 List<String> lines = new ArrayList<String>();
  67.                 String line = null;
  68.                 BufferedReader reader = null;
  69.  
  70.                 try {
  71.                         reader = new BufferedReader(new FileReader(path));
  72.                 } catch (FileNotFoundException e) {
  73.                         e.printStackTrace();
  74.                 }
  75.  
  76.                 try {
  77.                         while ((line = reader.readLine()) != null) {
  78.                                 lines.add(line);
  79.                         }
  80.                         reader.close();
  81.  
  82.                 } catch (IOException e) {
  83.                         e.printStackTrace();
  84.                 }
  85.  
  86.                 return lines.toArray(new String[lines.size()]);
  87.         }
  88.  
  89. }


EDIT: järsku avastasin, et PHPs on olemas selline funktsioon nagu similar_text. Kuidas ma küll seda varem ei märganud icon_eek.gif
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 icon_smile.gif
Kommentaarid: 67 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 66
tagasi üles
vaata kasutaja infot saada privaatsõnum
telefoon
HV vaatleja

liitunud: 05.05.2003




sõnum 27.05.2013 21:33:49 vasta tsitaadiga

Pythoni kasutajatele on olemas selline tore asi nagu difflib.SequenceMatcher http://docs.python.org/2/library/difflib.html
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
Aruta
HV vaatleja

liitunud: 29.10.2009




sõnum 28.05.2013 08:47:04 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
kalvis
Kreisi kasutaja

liitunud: 20.10.2009




sõnum 29.05.2013 11:49:58 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
iFlop
Kreisi kasutaja
iFlop

liitunud: 03.05.2003



Autoriseeritud ID-kaardiga

sõnum 29.05.2013 13:29:15 vasta tsitaadiga

kalvis kirjutas:
Lausa uskumatu kui valesti oskavad inimesed aadresse kirjutada (Talin ja Tallin jne.)

See ei tohiks ju väga suur uudis olla icon_wink.gif
Ü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
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Sarnaste aadressite tuvastamine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.