HTML

Az élet kódjai

Csináld maga. Senki nem csinálja meg helyetted.

Friss topikok

Ha túl sok a cikk

2014.12.08. 00:32 Travis.CG

A tudományos publikációk tárolása és az ott található információk visszakeresése alapvető fontosságú igény minden kutatónak. Selye egy egész fejezetet szentel katalógus rendszerének bemutatására. Manapság a PDF és az elektronikus kütyük világában mindez nevetségesnek tűnhet, de a probléma manapság is jelen van.

Számtalan online megoldás létezik: Mendeley, PubMed, ScienceDirect, stb. Ez teljesen jó a formális csatornákon keresztül megszerezhető cikkeknél. A cikkek egy részéhez viszont informális módon jutunk hozzá: például bírálat formájában. Jó lenne úgy keresni ezekben a cikkekben is, hogy ne kelljen kiadni a fájlokat a kezünk közül.

Eddig egy meglehetősen primitív, de éppen ezért nagyon hatékony rendszert használtam. A cikket letöltöttem PDF-ben, a fájlt a PMID számmal neveztem el, majd a PubMedről letöltöttem szövegként az absztraktot és PMID + txt névvel láttam el. Ha kíváncsi voltam valamire, grep-el megkerestem az absztaktot, majd elolvastam a hozzá tartozó PDF-et.

A rendszer alapvetően működött, de nem tudtam keresni a cikk szövegében, a grep nem kedveli az elírásokat (már pedig ha nem emlékszem pontosan egy kifejezésre, akkor rosszul keresek rá), az informális cikkeket továbbra sem találom. Végezetül meg kell említeni, hogy nem minden absztrakt található meg a PubMedben.

Az egyik megoldás a Lucene és a PDFBox. A Lucene egy szöveg indexelő és kereső rendszer. Java alapú API-val rendelkezik. A PDFBox, mint neve is mutatja egy PDF kezelő könyvtár. A két API-t a leírások alapján könnyű integrálni. De ha minden szép és jó lenne, akkor ez a poszt nem született volna meg...

Jelen poszt a Lucene 4.9.0 és a PDFBox 1.8.6 verziókat mutatja be. Mavennel a fordítás nem okoz gondot, de amint együtt akarjuk használni a kettőt, már problémákba ütközünk. Legalábbis a dokumentációban bemutatott kód nem működött. A PDFBox egységtesztjében egy régi Lucene verzió volt, amihez már Java API sincs a neten.

PDFBox

A PDFBox feladata csak annyi, hogy a PDF állományt beolvassa és kibányássza a szöveget. Ezt négy sorból meg lehet csinálni:

PDDocument pdf = PDDocument.load(f);
PDFTextStripper totext = new PDFTextStripper();
String fulltext = totext.getText(pdf);
pdf.close();

Lucene

A Lucene használata viszonylag egyszerű. Létre kell hozni egy indexet, bele kell tölteni a dokumentumokat, majd keresni kell az indexek között. Az index létrehozása sem bonyolult:

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_9);
IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_4_9, analyzer);
conf.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
IndexWriter index = new IndexWriter("/tmp/luceneindex", conf);

Ahol az igazi móka kezdődik, az a szöveg beillesztése. Ugyanis, akár csak egy adatbázis esetén, itt is lehetőségünk van a szöveget mezőkbe szétosztani. Például létrehozhatunk egy mezőt az absztaktnak, az eredményeknek, stb. Ezzel a későbbi kereséseket tudjuk finomhangolni. Tegyük fel, hogy a fulltext változót felbontottuk fejezetekre és most ezekből készítünk egy dokumentumot, majd adjuk hozzá az indexhez:

Document doc = new Document();
doc.add(new StringField("url", url, Field.Store.YES));
doc.add(new TextField("abstract", abstract, Field.Store.YES));
doc.add(new TextField("methods", methods, Field.Store.YES));
doc.add(new TextField("references", ref, Field.Store.YES));

index.addDocument(doc);

A visszakeresés már gyerekjáték. A példa megkeresi azokat a dokumentumokat, amelyek tartalmazzák a "bioinformatic" és "database" szavakat az absztraktjukban:

dir = FSDirectory.open(new File("/tmp/luceneindex"));
dirread = DirectoryReader.open(dir);
index = new IndexSearcher(dirread);
analyzer = new StandardAnalyzer(Version.LUCENE_4_9);
QueryParser parser = new QueryParser(Version.LUCENE_4_9, "abstract", analyzer);
Query q = parser.parse("bioinformatic AND database");
ScoreDoc[] hits = index.search(q, 1000).scoreDocs;
for(int i = 0; i < hits.length; i++){
  Document pdf = index.doc(hits[i].doc);
  System.out.println(pdf.get("url"));
}
dir.close();
dirread.close();

A Lucene természetesen ennél többet is tud. Lehetőség van a keresett szóhoz hasonló szavak keresésére, a találatokat rendezhetjük, több keresés eredményét összevonhatjuk. Akit elrettent a sok kód, azoknak a Solr jelenthet segítséget.

Szólj hozzá!

Címkék: java programozás

A bejegyzés trackback címe:

https://cybernetic.blog.hu/api/trackback/id/tr876653805

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása