Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: pruzkumbojem kdy 12. 01. 2022, 14:41:41

Název: Frekvenční analýza výskytu řetězce?
Přispěvatel: pruzkumbojem kdy 12. 01. 2022, 14:41:41
co je nejlepsi nastroj pro zjisteni cetnosti patternu?

napriklad mam tabulku a   potrebuju zjistit 100 nejcasteji se vyskytujicich alfanumerickych stringu o 10 znacich (a pocet tech vyskytu).

moznost SQL query jsou hodne omezene ( a midleware to zabije na 3 dny), ale mam moznost vyexpertovat jeden log jako text
co je na tohle nejlepsi nastroj, vzit splunk? R?

BTW tohle je mimo moje knowhow, ale potrebuju to a mnoha hlavy indicky tym zasadne nic nedoda. uz jsem to zkousel escalovat, ale to by musel management pripustit, ze platit asi 50 "levnych" indu zbytecne, takze to je nepruchozi.


Název: Re:Frekvenční analýza výskytu řetězce?
Přispěvatel: Karmelos kdy 12. 01. 2022, 17:40:16
něco takovýho? https://cran.r-project.org/web/packages/bpa/vignettes/introduction.html (https://cran.r-project.org/web/packages/bpa/vignettes/introduction.html)
pro r je dobrý si nainstalovat rstudio
Název: Re:Frekvenční analýza výskytu řetězce?
Přispěvatel: alex6bbc kdy 12. 01. 2022, 19:10:32
a kolik dat v db tabulce je?
nebo jak je velky vyexportovany textovy log?

mate k dispozici vice stroju, ze by slo praci rozsekat ukol na n samostatnych pocitacu.
podobne by to slo udelat jako viceprocesove, vicevlaknove zpracovani.

1) nejprve bych log prohnal filtrem na 10 znakove slova.
2) pak bych zacal plnit vhodnou strukturu kde by slo rychle vyhledat zda slovo uz existuje pripadne slovo vlozit (mapa, strom, apod.)
3) v datove strukture (2) bych vyhledal slovo a zvysil counter pokud uz tam slovo je nebo ho vlozil, pokud se slovo objevilo poprve.
Název: Re:Frekvenční analýza výskytu řetězce?
Přispěvatel: _Jenda kdy 13. 01. 2022, 00:57:38
Citace od: alex6bbc kdy 12. 01. 2022, 19:10:32mate k dispozici vice stroju, ze by slo praci rozsekat ukol na n samostatnych pocitacu.
Jak se tohle paralelizuje? Podle mě bude bottleneck velikost paměti, protože těch možných stringů je... hodně (64**10, resp. 10*velikost_vstupních_dat). Pokud jsou statisticky hodně nerovnoměrně rozdělené (což v ,,lidském textu" jsou), tak by to možná šlo nejdřív předfiltrovat třeba počítáním 32bit hashů těch substringů (nějaké zkolidují) a v druhé fázi počítat jenom ty co se zahashovaly do bucketů kde toho je nejvíc.
Název: Re:Frekvenční analýza výskytu řetězce?
Přispěvatel: Google CTCCTCGGCGGGCACGTAG kdy 13. 01. 2022, 07:51:35
nejdriv bych zkusil trivialne


from collections import Counter

def chunks(s, n=10):
    for i in range(len(s)):
        yield s[i:i + n]

c = Counter()

for s in zdrojdat():
     c.update(chunks(s))

print(c.most_common(3))


zalezi, jestli to potrebujes jen jednou, nebo chces vysledky drzet v databazi

Pokud je tech dat opravdu hodne, typicka uloha pro mapreduce
Název: Re:Frekvenční analýza výskytu řetězce?
Přispěvatel: Exceptions kdy 13. 01. 2022, 08:42:46
Citace od: _Jenda kdy 13. 01. 2022, 00:57:38
Citace od: alex6bbc kdy 12. 01. 2022, 19:10:32mate k dispozici vice stroju, ze by slo praci rozsekat ukol na n samostatnych pocitacu.
Jak se tohle paralelizuje? Podle mě bude bottleneck velikost paměti, protože těch možných stringů je... hodně (64**10, resp. 10*velikost_vstupních_dat). Pokud jsou statisticky hodně nerovnoměrně rozdělené (což v ,,lidském textu" jsou), tak by to možná šlo nejdřív předfiltrovat třeba počítáním 32bit hashů těch substringů (nějaké zkolidují) a v druhé fázi počítat jenom ty co se zahashovaly do bucketů kde toho je nejvíc.

ano, přesně takhle se to paralelizuje, spočítaj se postupně kolidující stringy (buď využití hashe nebo v případě stejné délky řětězců jdeš postupně po písmenech) a přiděluješ jednotlivé prefixy nějakému výpočetnímu procesu. Frekvenční analýza je aditivní výpočet, lze tedy počítat postupně a připočítávat mezivýsledky, dobře se to paralelizuje.