Párszor már beleakadtam ebbe a problémába, de most nagyon jó lenne 1 ilyen tool: Van 1 csomó string-em, amire meg kéne találni azt a regex pattern-t ami a lehető legszigorúbb és minden megadott stringre illeszkedik. Van erre kész megoldás, illetve hogy kéne nekiállni?
Igazából az a feladat, hogy:
- a lista 1 része meccsel regex1-re,
- a lista másik része meccsel regex2-re,
- Kéne egy 3-ik regex, amire a maradék meccsel,
- illetve a maradékból menyi az, amire regex3 mégsem meccsel.
Mondjuk úgy, hogy a nem well-formed stringeket kéne megtalálni és ez tényleg az a 2 legyen a nagyonsokból, amit biztosan javítani kell kézzel.
Ötlet, tipp, bármi?
- 556 megtekintés
Hozzászólások
Ennek a meghatározásnak így nincs értelme mert bármi két regexet vagy-al összekapcsolsz, az is regex.
Például: (a|b)
Definiáld mi az ami well-formed, arra tudsz kapni egy regexet.
Az, hogy "mennyire nem well-formed" a többi, az első körben érdektelen.
Gábriel Ákos
- A hozzászóláshoz be kell jelentkezni
Pont az az érdekes, ami nem well-formed, azok a problémásak. És a kiveszem az összesből a jókat és a maradék az hiba, az se jó megközelítés, mert nem a problémára válaszol. Pl.
van 1 csomó regex-em, amivel inputot validálok,
rendszeresen átcsúsznak invalid tételek, amik később problémát okoznak,
jó lenne egyszerűen bővíteni az input filtereket.
- A hozzászóláshoz be kell jelentkezni
jó lenne egyszerűen bővíteni az input filtereket.
Lehet ,hogy egyszerűbb írni egy nem regexes függvényt és azt pluszban meghívni.
- A hozzászóláshoz be kell jelentkezni
Értsd: kéne az a regex, aminek a hiánya miatt átcsúszott a szemét. Igen meg kell írni, de a kérdés nem az, h közben ki kell-e fújni az orrunkat, hanem, h mi az a regex.
- A hozzászóláshoz be kell jelentkezni
Ez jutott eszembe: https://www.youtube.com/watch?v=Ct-lOOUqmyY
Gábriel Ákos
- A hozzászóláshoz be kell jelentkezni
Kész megoldást nem tudok, de Javaban ez nem tűnik túl komplikáltnak.
Kell egy List<String> amin végigiterálsz és hívogatod a Stringeken a metódust ami végigpróbálja mindhárom Matcher -el, hogy matches() -e. Ha egyikre sem machel a String, akkor azt gyüjtöd egy másik listába.
Feltéve, ha jól értettem meg azt, amit szeretnél.
- A hozzászóláshoz be kell jelentkezni
Vagy bedobni az összes stringet egy szövegfájlba, aztán
sort fájl | uniq | grep -v regexp1 | grep -v regexp2 | grep -v regexp3 > javítandók
disclaimer: ha valamit beidéztem és alá írtam valamit, akkor a válaszom a beidézett szövegre vonatkozik és nem mindenféle más, random dolgokra.
- A hozzászóláshoz be kell jelentkezni
Nem értem. A 3. regex, ami meccsel mindenre amire első kettő nem, az a teljes halmaz, kivéve az első kettő feltételeit. Ebben minden benne lesz, ami nem meccsel az első kettőre egyikére sem. Elméletileg nem lesz olyan, ami nem meccsel egyikre sem a háromból.
Vagy félreértek valamit...
"A megoldásra kell koncentrálni nem a problémára."
- A hozzászóláshoz be kell jelentkezni
Asszem félre, igen. Nem azt akarom megtudni, mire nem meccsel, hanem h mi az a legszigorúbb regex, amire a maradék meccsel. Kolléga az előző kommentben jól érezte, hogy a hibát kell megtalálni.
- A hozzászóláshoz be kell jelentkezni
Indulásként esetleg nézd meg ezt. Elég sok példa van.
(libregexp-assemble-perl csomag része.)
- A hozzászóláshoz be kell jelentkezni
Van ilyen tool!
Úgy hívják awk és program, amit meg kell írni.
A problémád tipikus addattisztítási feladat:
- kell egy minta, amire illeszkednek az 1. típusú rekordok
- kell egy minta, amire illeszkednek az 2. típusú rekordok/a maradék
- kell egy minta, amire illeszkednek az 3. típusú rekordok/a maradék
- megnézzük mi maradt
- utána esetleg újabb minta, vagy
- javító algoritmus
- loop, amíg el nem fogynak a rekordok vagy a hiba mennysége kellő mértékben csökken
Egyes esetekben lehet javító szótárat építeni. Pl.:
"well-formed"=Budapest ->szótárba (persze ilyen már van)
A megtalált hibák alapján kialakulhat egy szótár sor: Budapest,budappest,BudiPest,budoPest
Itt az első trükk a nagybetűsítés!!
A szótár sorokból készül egy regexp szótár (tömb). Ha az Input nagybetűsített elem megegyezik a szótár bármely elemével, akkor találat. Ilyenkor az erdeti inputot cseréljük a szótár sor fő elemére. Ha változott, akkor hiba++.
A maradék nincs a szótárban - pl. Csepel. ;) Szemrevételezés után csaphatjuk a javító szótárhoz: BUDAPEST=Budapest,budappest,BudiPest,budoPest,Csepel
Aztán loop.
Az élet nem oneliner. ;)
- A hozzászóláshoz be kell jelentkezni
Igen, tisztogatás, de a szemrevételezés az munkás.
- A hozzászóláshoz be kell jelentkezni
Van olyan program, ami kitalálja még a gondolatodat is. Csak most nem jut eszembe. ;)
A szemrevételezés nem az, hogy a maradék 10M rekordot megnézem. Elég néhány darabot, amiből újabb szabályt lehet lérehozni.
A való világ tud létrehozni érdekes eseteket is. Íme egy cím: Budapest Miskolc Wien, Kossuth utca 3. Erre mit lépne a MI?
A fent leírt módszerrel közel 100% pontossággal lehet javítani, bár nem tudom miben mesterkedsz.
- A hozzászóláshoz be kell jelentkezni
Elég néhány darabot, amiből újabb szabályt lehet lérehozni.
Na látod pont ez a baj ezzel. Mert mi van, ha a maradék 10M tétel között van 7 különböző mintájú szemét, de 10M helyett legyen csak nx100, ugyanúgy elvész. Nehéz garantálni, hogy azt a maradék 7et megtalálom.
- A hozzászóláshoz be kell jelentkezni
Erre idézem magam
loop, amíg el nem fogynak a rekordok vagy a hiba mennysége kellő mértékben csökken
Ha tényleg adattisztításról van szó, akkor bizony van egy határ, amikor már elfogynak a javítási lehetőségek. A megmaradt eseteket vissza kell dobni az adatforrásnak javításra. (adatpontosítás) Fel lehet mérni azt is, hogy a részlegesen javított adatok felhasználhatók-e.
További lehetőség az esetlegesen ellentmondó vagy hiányos adatok más algoritmussal végzett kiegészítése vagy kijavítása. De ehhez már tényleg tudni kellene mit csinálsz. A regexp is algoritmus, de tudni kell mit csinálsz.
Adott esetben az adatok keletkezésének folyamatát és forrását is érdemes ismerni. Persze néha előfordulhat az "adatbányászás a semmiből" konstelláció is. Ha ezeket fel lehet mérni, akkor akár vissza is dobható a feladat, mint reális költséggel megvalósíthatatlan. Ilyen munkát is láttam már...
- A hozzászóláshoz be kell jelentkezni
ez is lehet 1 metric
- A hozzászóláshoz be kell jelentkezni
Ez a Hamming távolság új neve?
- A hozzászóláshoz be kell jelentkezni
Nem. Egyébként a Levenshtein elég lassú.
- A hozzászóláshoz be kell jelentkezni
Esetleg építeni egy Aho-Corasickot építeni valamilyen random módon kiválasztott mintára majd azt redukálni regexppé.
- A hozzászóláshoz be kell jelentkezni
Más miatt, de érdekes
- A hozzászóláshoz be kell jelentkezni
Ezzel most nem nagyon fogsz tudni mit kezdeni, de van ilyen eszköz, kb az elmúlt fél évben jött szembe a neten. Már csak annyi kiegészítésként, hogy sem a szoftver nevére, sem az oldal címére nem emlékszem, de ha valahol elmentettem vagy beugrik, még jelentkezem. Valami regex teszter vagy hasonló, és pont az volt a leírás lényege, hogy legenerálja neked azt a mintát, ami pontosan a megadott elemekre fog meccselni.
Eddig ez lett:
- A hozzászóláshoz be kell jelentkezni
az előbbi jópofa, köszi
- A hozzászóláshoz be kell jelentkezni
Hahh, ez marhajó, köszi!
- A hozzászóláshoz be kell jelentkezni
Talán ez volt az:
- A hozzászóláshoz be kell jelentkezni
Köszi ezeket. Pont a minap futottam bele én is egy ilyesmibe: https://github.com/pemistahl/grex
- A hozzászóláshoz be kell jelentkezni