Kirjoittaja Aihe: Millä ohjelmalla voi hakea boolean-haulla ?  (Luettu 4279 kertaa)

kamara

  • Käyttäjä
  • Viestejä: 3032
    • Profiili
Millä ohjelmalla voi hakea boolean-haulla ?
« : 22.01.24 - klo:16.10 »
Haluaisin hakea tiedostosta monipuolisesti boolean-haulla.

Esim. tekstitiedostoista haluaisin ulos tekstitiedostojen nimet, joissa esiintyy äänitiedosto teksti tai sekä audio että file-teksti ...
Koodia: [Valitse]
hae.sh 'äänitiedosto|audio&file'
Taipuuko awk siihen ?

Edit - Mikäli ei löydy, niin onko jollakin muullakin siihen tarvetta ?
« Viimeksi muokattu: 22.01.24 - klo:17.19 kirjoittanut kamara »

kamara

  • Käyttäjä
  • Viestejä: 3032
    • Profiili
Vs: Millä ohjelmalla voi hakea boolean-haulla ?
« Vastaus #1 : 24.01.24 - klo:15.59 »
No, on sen verran lyhyt ohjelma, että julkaisen sen täällä:

Parannetun ohjelman voisi tehdä C/C++:llä tai Rust:lla saisi ratkaisun tehtyä aikaan ainakin O(n) soveltaen https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm mutten jaksa vielä säätää niin paljoa.

Jos tulee aikakriittiseksi, niin sitten pitää laittaa kädet rasvaan ja kääntää se tehokkaammalle kielelle.

Bonuksena ohjelma hakee zip-tiedostoistakin, joten ohjelman avulla voi hakea myös libreOffice:n tiedostoista. Rekursiivisuutta en ole jaksanut tehdä, mutta ohjelma on mielestäni kätevä jo tällaisenaan.

Valitettavasti search ei tue säännöllisiä lauseita, mutta mielestäni on helpommin lähestyttävä kuin säännölliset lauseet.

Tehokkuutta voisi myös lisätä säikeillä, mutta sitäkään en tee ennen kuin sille löytyy tarvetta. Onneksi se on kuitenkin säikeistettävissä.

Ohjelma siis tulostaa osajoukon annetuista tiedostonnimistä. Tiedostojen nimet voi antaa joko parametrina tai putkitettuna.

Tässä esimerkki käytöstä:
Koodia: [Valitse]
./search 'Ohje'  ~/Asiakirjat/*.odt
Sama koodi toisin esitettynä:
Koodia: [Valitse]
ls ~/Asiakirjat/*.odt|./search 'Ohje'


kamara

  • Käyttäjä
  • Viestejä: 3032
    • Profiili
Vs: Millä ohjelmalla voi hakea boolean-haulla ?
« Vastaus #2 : 24.01.24 - klo:16.03 »
Ohjelma oletuksena huutelee aika paljon, joten sitä saattaa kannattaa käyttää ohjaamalla error-virta nulliin...

Koodia: [Valitse]
ls ~/Asiakirjat/*.odt|./search 'Ohje' 2>/dev/null

kamara

  • Käyttäjä
  • Viestejä: 3032
    • Profiili
Vs: Millä ohjelmalla voi hakea boolean-haulla ?
« Vastaus #3 : 24.01.24 - klo:16.10 »
Ohjelma siis tulostaa PATTERN:n täyttävien asiakirjojen tiedostonimet. Sillä tavalla muistuttaa find-ohjelmaa.

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Millä ohjelmalla voi hakea boolean-haulla ?
« Vastaus #4 : 30.01.24 - klo:18.07 »
Toi lineaarinen hakukomplesisuus kyllä todella hyvä, mitä luin tuon alkujaan Wikipedia-yhteisön tekstin linkkaamasi.

Kyllä joku ihan varmasti jo ohjelmoinut Rustilla tai C++/C -kielillä, mitä 1969/1970 -luvulta tuo algoritmin esitys.

Rust mielenkiintoinen kieli, mitä joku aika takaperin täälläkin otin kantaa vai kysyinkö ittse tuon roskien keruun GC:n muistinhallinnasta, ja käytin siihen yhden illan aikaa, niin tuo Rust voisi olla mielekäs käydä dokumentaatiota läpi, mitä siinä ei ole roskienkeruu-järjestelmää, ja silti sillä voi luoda sovelluksia alhaisen tason resurssien laitteisiin. Uutena tuli mitä kävin aamupäivällä jonkin verran tuota "book" -läpi "Getting Started", tuo omistaja "Ownership".

Voisiko tuota jakamaasi algoritmiä jotenkin soveltaa mitä pistän tähän liitteeksi DVD ja Blu-Ray -kokoelmani mitä Winkkarissa olen arkiston käyttämällä Eric's Movie Database -freewarea, mitä siinä tulee seuraavat tietueet lajittelu-vaihtoehtoina ohjelmaan on sisällytetty:

Numero
Nimi
Lainassa
Kesto
Maa
Laji
IMDB pisteet
IMDB TOP 250
Omat pisteet
TomatoMeter score
Sijainti
Lisäyspäivä
Last played

Mitä tästä saisi vielä tekstitiedostosta louhittua irti soveltamalla tuota pythonilla ohjelmoimaasi hakuohjelmaa, mitä tässä nyt ei ole yllä listattuna.



Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

kamara

  • Käyttäjä
  • Viestejä: 3032
    • Profiili
Vs: Millä ohjelmalla voi hakea boolean-haulla ?
« Vastaus #5 : 31.01.24 - klo:08.02 »
Mitä tästä saisi vielä tekstitiedostosta louhittua irti soveltamalla tuota pythonilla ohjelmoimaasi hakuohjelmaa, mitä tässä nyt ei ole yllä listattuna.

Tässä esimerkissäsi ei minun boolean-hausta ole paljoa hyötyä, sillä kuten mainitsin ylempänä, niin boolean-hakuni näyttää vain tiedostojen nimet, joissa hakuehto toteutuu...

Sen tähden haku kertoo vain, löytyykö tai puuttuuko kokoilmastasi jotakin...
Esim.
Koodia: [Valitse]
./search "' 007'|Bond" DVDBRKokoelma_Sumell2.txtPaljastaa, ettei kokoilmassasi ole yhtään Bond-leffaa, mutta valitettavasti tiedostosi ei ole tekstitiedosto, koska ensimmäinen merkki on chr(255), johon ohjelmani kompastuu, sillä chr(255) ei kuulu utf-8-merkistöön.

Elikkäs poistamalla ensimmäinen merkki tekstitiedostostasi saadaan oikeaoppinen utf-8-tiedosto, joka tälle ohjelmalleni kelpaa.

Liitteenä korjattu liitetiedosto.

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Millä ohjelmalla voi hakea boolean-haulla ?
« Vastaus #6 : 31.01.24 - klo:15.08 »
Käytin ohjelman "Vie tiedostoon" -toimintoa, olisi pitänyt manuaalisesti muuttaa tuo kirjasinkoodi UTF-8 -muotoon, se jäi tarkistamatta.

Melkein sama vissiin jos käyttäisi grep komentoa ja putkittaa count -comennolla elementtien laskua.

Kokoelmassa kyllä on ainakin 2 Bond-filmiä, mutta ymmärrän kyllä, että 007 ja "Bond" -merkkijonot ei esiinny titteli -sarakkeessa, joten boolean-tyyppinen palautus on 0 1-matchin sijaan.

Menee enemmän tekoäly-algoritmien puolelle, jotta ohjelma osaisi listata Bond-nimikkeet Bond-elkouvan tittelin perusteella.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

kamara

  • Käyttäjä
  • Viestejä: 3032
    • Profiili
Vs: Millä ohjelmalla voi hakea boolean-haulla ?
« Vastaus #7 : 31.01.24 - klo:18.30 »
Jep,
Toimii varsin samalla periaatteella kuin grep, mutta palauttaa vain tiedostonnimet, joissa kyseinen hakuehto täyttyy.

Tämä on pieni muutos grep:n ja find:n ajattelutapaan. Itselleni on kuitenkin boolean-haut helpompi tehdä/haut kuin säännölliset lausekkeet.

Siksi tein kyseisen ohjelman.

Esimerkiksi, jos tiedät jossakin libbreoffice-tiedostossa olevan opetussuunnitelma, mutta ei ole harmainta aavistusta, missä se piilee kiintolevyllä, niin tämän ja locate:n avulla kyseisen tiedoston löytäminen on kohtuullisen yksinkertaista.

Boolean operaattorit ovat C:stä tuttuja:
| - OR
& - AND
^ - XOR
~ - NOT
() - Sulkeet.

Sen lisäksi ohjelma tuntee hipsut ja lainausmerkit. Lisäksi '\'-viiva lisää hakuehtoon sen jälkeisen merkin. Sitä voi käyttää esimerkiksi välilyönnin määrittelemiseen.

Pieniä ongelmia aiheuttaa shell, kun se käyttää osittain samoja operaattoreita eri tarkoitukseen, niin siksi hakuehto kannattaa laittaa hipsujen sisään.

kamara

  • Käyttäjä
  • Viestejä: 3032
    • Profiili
Vs: Millä ohjelmalla voi hakea boolean-haulla ?
« Vastaus #8 : 09.02.24 - klo:15.28 »
No, joo
C++:lla sain vähän nopeutta lisättyä, mutta vielä puuttuu muutama ominaisuus.

Koodia: [Valitse]
time ../search "class|Ei löydy" *.cpp
classTest.cpp
orsearchminTest.cpp

real    0m0,004s
user    0m0,000s
sys     0m0,004s

Koodia: [Valitse]
time search "class|Ei löydy" *.cpp
classTest.cpp
orsearchminTest.cpp

real    0m0,067s
user    0m0,055s
sys     0m0,008s

Ainakaan vielä se ei tue CaseUnsensitiveä (muistaakseni), mutta kuten näkyy, niin näyttäisi toimivan n. 10x nopeudella python-ohjelmaan verrattuna.

Tämä on siis ensimmäinen kerta, kun ohjelma tulostaa jotain järkevää. Siis ../search on C++/C-ohjelma, ja search on python-ohjelma.

Edit - Siis ohjelma ei osaa löytää zip-tiedostoista hakusanoja.
« Viimeksi muokattu: 09.02.24 - klo:15.30 kirjoittanut kamara »

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Millä ohjelmalla voi hakea boolean-haulla ?
« Vastaus #9 : 17.02.24 - klo:13.48 »
Itsellä tylsä yksinäinen viikonloppu tällä hetkellä.

Ajattelin itsekin ohjelmoida tuon Javalla ja Pythonilla, vaikka ne nyt mitään lisäarvoa tuo mihinkään. Pseudo-koodihan löytyi tuosta alkuperäisen Wikipedia-artikkelista.

Ohjelmointihammasta kolottaa.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

kamara

  • Käyttäjä
  • Viestejä: 3032
    • Profiili
Vs: Millä ohjelmalla voi hakea boolean-haulla ?
« Vastaus #10 : 29.02.24 - klo:14.12 »
No, niin kiitokset nm:lle avusta.

Sain ensimmäisen yksinkertaisin version tehdyksi.

Vahvasti suosittelen käytettäväksi virtuaalikonetta tämän testaamiseen, kun tämä on tällainen varhaisbeta.

Kovin nopea tämä ei kuitenkaan ole, mutta kätevä on kuitenkin omasta mielestäni. Ohjelman saa hakemaan rekursiivisesti pakatuista tiedostoista. Elikkä jos on pakattu kahteen kertaan, niin ohjelma saattaa löytää merkkijonon sen sisältä. Kätevin ominaisuus tulee haettaessa libreoffice-tiedostoja, koska ne ovat pakattuja tiedostoja, niiden sisältä hakeminen pelkällä grep:llä on vaikeaa.

Jos ohjelma löytää pakatun paketin sisältä hakuehdon täyttävän merkkijonon, niin se palauttaa isäntä-tiedoston nimen.


kamara

  • Käyttäjä
  • Viestejä: 3032
    • Profiili
Vs: Millä ohjelmalla voi hakea boolean-haulla ?
« Vastaus #11 : 29.02.24 - klo:14.39 »
Ohjelman pitäisi toimia suoraan Ubuntu-varianteissa. Tarjolla on ainakin toistaiseksi pelkkä binääri.

Edit - Jos jolakin saa ohjelman coredump:paamaan, niin otan bugeja vastaan tässä säikeessä. Toki muitakin bugeja saa esittää.
« Viimeksi muokattu: 29.02.24 - klo:14.43 kirjoittanut kamara »