BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM
VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRNÖK INFORMATIKUS SZAK
Autonóm intelligens rendszerek Intelligens rendszerek ágazat Önálló laboratórium (BMEVIMIA362)
Allergiához kapcsolódó kulcsszó keresési statisztikák vizsgálata Készítette: Kovács Zsolt (H39JKL)
Konzulens: Hullám Gábor
MÉRÉSTECHINKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK
2014
HIBA! A HIVATKOZÁSI FORRÁS NEM TALÁLHATÓ.
TARTALOMJEGYZÉK 1. A FELADAT ..................................................................................................................... 1 1.1. Bevezetés ......................................................................................................................... 1 1.2. Kereső motor ................................................................................................................... 1 2. MEGVALÓSÍTÁS ...........................................................................................................2 2.1. Feladat felbontása ............................................................................................................2 2.2. User Interface .................................................................................................................. 2 2.3. Google Trends API implementálása ............................................................................... 3 2.4. Adatok kezelése............................................................................................................... 4 2.5. Grafikon kirajzolása ........................................................................................................6 2.6. A program felépítése .......................................................................................................7 2.7. Működés bemutatása .....................................................................................................11 2.7.1. Funkciók ismertetése ............................................................................................ 11 2.7.2. Egy példa bemutatása ........................................................................................... 13 3. A MEGVALÓSÍTÁS UTÁN ......................................................................................... 15 3.1. Összefoglalás ................................................................................................................. 15 3.2. Folytatási lehetőségek ...................................................................................................15 4. MUNKANAPLÓ ............................................................................................................16 4.1. Ötödik hét ...................................................................................................................... 16 4.2. Hatodik hét .................................................................................................................... 16 4.3. Hetedik – Tízedik hét ....................................................................................................16 4.4. Tizenegyedik – Tizenkettedik hét ................................................................................. 16 4.5. Tizenharmadik hét .........................................................................................................16 4.6. Tizennegyedik hét .........................................................................................................16 5. HIVATKOZÁSOK.........................................................................................................17
i
A feladat
1. A FELADAT 1.1. Bevezetés Önálló laboratórium keretein belül egy allergiákkal foglalkozó projektben való segédkezést választottam. A feladatomhoz kaptam egy pollen adatbázist, amiben 2011 januárjától 2014 novemberéig tartalmazza az aktuális 2 óra pollenkoncentrációját, és ezeknek az adatoknak az eloszlását szerettem volna összehasonlítani valamilyen nagyobb internetes kereső keresési statisztikáival.
1.2. Kereső motor Első választásom a Google keresőre esett. A Google-nek van egy szolgáltatása, ami 2004 óta heti bontásban tárolja mikor mire kerestek rá. Ez a szolgáltatás a Google Trends. A Google Trends lehetőséget ad arra, hogy tetszőleges kulcsszó statisztikát lekérjük az általunk kijelölt országban, és idő intervallumon belül. Ezért is ezt választottam, mivel minden funkciója megvolt, ami számomra szükséges.
1
MEGVALÓSÍTÁS
2. MEGVALÓSÍTÁS 2.1. Feladat felbontása A feladat megkezdéséhez először egy nyelvet választottam, ami a java lett. Azért ezt, mert régebben is foglalkoztam már vele, és mindent tudott, amire szükségem lehetett a feladatom elkészítéséhez. A feladatomat négy külön részre bontottam fel a könnyebb fejleszthetőség és átláthatóság érdekében. Ezek sorban:
User Interface
Google Trends API implementálása
Adatok kezelése
Grafikon kirajzolása
Nulladik lépésként megismerkedtem az JetBrains IntelliJ IDEA fejlesztő környezetével, amivel ezek után effektíven tudtam haladni.
2.2. User Interface A User Interface kialakítása az első dolog volt, amivel foglalkoztam. Ehhez az IDE beépített UI designer-ét használtam.
2
MEGVALÓSÍTÁS
Ez kezdetekben nehezebben kezelhető, mint a kézileg összerakott, de végeredményben látványosabb és a későbbiekben könnyebben bővíthető és módosítható. Egy olyan kompakt, könnyen kezelhető felületet létrehozására törekedtem, ami a későbbiekben is könnyen bővíthető.
2.3. Google Trends API implementálása A Google Trends mint már említettem, a keresési előzményekből készít statisztikát, és lehetőséget ad ezek elérésére. Ehhez a Google bejelentette 2007-ben, hogy készít egy APIt, de erről frissebb információ azóta sincs.[1]
3
MEGVALÓSÍTÁS
De pár lelkes fejlesztő azóta is készít nem hivatalos verziókat ebből, ezek Java és Python nyelven íródtak. Ebből is a Java verziót választottam, amit GitHub-ról töltöttem le. [2] Ezeknek a verzióknak több baja is van, mivel idővel a Google lekorlátozta ezek használatát, kezdetben pár percenként lehetett lekérdezni, de nyár eleje óta már csak naponta egyszer. (Bár akkor egyszerre többet is.) Ekkor befejezték ennek az API-nak a fejlesztését, de ezzel a megkötéssel számomra még használható maradt, ellenben a fejlesztést és debuggolást jelentősen lassította. Ez az API lehetőséget adott nekem arra, hogy bejelentkezzek a Google fiókomba, a megadott kulcsszóra rákeressek, és ezt egy CSV file-ba mentesem.
2.4. Adatok kezelése Ahogy a bevezetőben írtam, két féle adattal kellett dolgoznom. Az első, amit a feladatomhoz kaptam, az egy 13000 soros CSV file. Ebben egy sorban található egy időpont és 8 számérték arról, hogy abban az időpontban mekkora volt a pollenkoncentráció. Ennek mértéke a pollen/m3, ez 60 felett számít már közepes értéknek, alatta csak az erősen allergiások érzik meg.
A másik a Google Trends-ből töltött adatok. Ezek 2004-től a lekérés időpontjáig hetes felbontásban vannak, nullától százas skálára normálva. Ebben az adathalmazban még szerepeltek számomra érdektelen információk is, mint például, hogy hol kerestek rá legtöbbször, vagy milyen vonatkozásban, ezeket még le kellett vágnom róla.
4
MEGVALÓSÍTÁS
Amiatt, hogy ezeket később ábrázolni tudjuk, közös formára kell hozni. Ehhez azt választottam, hogy a pollen adatbázis 2 órás időblokkjait összeadtam 84-essével, hogy ez is heti bontásban legyen, ezután ezeket az értékeket is lenormáztam 0-100-as skálára, úgy hogy a 100-as érték a maximumot jelenti. Ezután minden adathalmazt elmentettem egy-egy külön CSV fájlba, hogy később használni tudjam őket. Ezekkel a kis átalakításokkal elértem, hogy a két adathalmazom struktúrájában teljesen megegyezzen.
5
MEGVALÓSÍTÁS
2.5. Grafikon kirajzolása A feladatom célja az volt, hogy az előző pontban bemutatott adatokat ábrázoljam. Emiatt volt szükségem az adatok korábban bemutatott formázására, hogy így grafikonon ábrázolhatóak legyenek. Ehhez a feladathoz a JFreeChart API[3] segítségét kértem. Ez egy olyan ingyenes interfész, amivel különféle változatos grafikonokat tudunk egyszerűen kirajzolni Java-ban. Egy kis ízelítő a lehetőségeiből:
6
MEGVALÓSÍTÁS
Ezek közül én az XYSpline nevű diagramot választottam. Ez lehetővé teszi, hogy tetszőleges számú adatsort ábrázoljak egy grafikonon. A függőleges tengelyen az érték nagyságát ábrázoltam, a vízszintesen pedig az időt.
Ezen az ábrán kékkel találhatóak a Google statisztikai eredmények, pirossal pedig a kapott adatbázis módosított értékei.
2.6. A program felépítése Ebben a fejezetben az alkalmazás felépítéséért felelős osztálykönyvtár rendszerét nézzük meg. Az osztálydiagram:
7
MEGVALÓSÍTÁS
Mint látható a működés nagy részét a FormUI osztályomba központosítottam, ez felelős a User Interface kirajzolásáért, megjelenítéséért és, hogy az egyes komponensek a funkcióikat megfelelően ellássák.
Main absztrakt osztály A program futtatásakor indul, egyetlen feladata, hogy meghívja a FormUI konstruktorát.
FormUI osztály Az osztály felelős minden fő funkció eléréséért, és a felhasználói felület biztosításáért. A 2.2-es pontban bemutatott funkciókat foglalja magában. A különböző java.swing elemek elhelyezéséhez az IntelliJ GUI builder-ét használtam.
A különböző swing komponensek funkciói:
JButton searchButton: Ez 2-es számmal van jelölve a képen. Szerepe, hogy aktiválásakor lekéri az 1-es számmal jelzett mező tartalmát, és meghívja rá a GoogleCall osztály call (String) függvényét.
JList list1: Ez a 3-as számmal jelzett mező, itt jelennek meg a Google mappában lévő CSV fájlok.
JList list2: Ez a 4-es számmal jelzett mező, itt jelennek meg az Idosor mappában lévő CSV fájlok.
8
MEGVALÓSÍTÁS
JButton newTable: Az 5-ös számmal jelzett gomb. Szerepe, hogy megnyomásakor létrehoz egy új TimeTable osztályt, ami segítségével új állományt exportálhatunk a kapott adatbázisból.
JButton deleteButton: 6-ossal jelölt elem, megnyomásakor a 3,4-es mezőkön kijelölt elemeket törli.
JButton magicButton: 7-es számmal jelölt gomb. Aktiválásakor létrehozza az XYLine osztály egy példányát, aminek a 3,4-es mezőkön kijelölt file-ok neveit adja át.
Az osztály függvényei:
setFileList(int) – a 3,4-es mezőn kijelölt elemek számával megegyező mérető String tömböt készít.
concat(String[]…) – String tömböket kap, és ezeket egyesíti.
GoogleCall osztály Az osztály a Google szerverre authentikálás-t, a kérés szerkesztését, felküldését, majd a válasz fogadását és megformálását intézi. Az osztály fő paraméterei:
Google azonosító / jelszó: Erre a célra készítettem egy felhasználót, amit beleépítettem a programba. Ennek paraméterei: acc:
[email protected], pass: 115191ab.
GoogleTrendsAuthenticator: ezt a program hozza létre a felhasználó, és egy HttpClient segítségével, ez építi fel a kapcsolatot a szerverrel.
GoogleTrendsRequest: ez maga a kérés, amit a keresőmezőből kapott szöveg alapján formáz meg.
Az osztálynak egy fő metódusa van a call(String). Ezt hívja meg a gomb megnyomásakor az alkalmazás. Ez végzi el a szerverre bejelentkezést és a kérés meghívását. Miután megkaptuk az adathalmazt lementi egy ideiglenes CSV-be a kinyert még formázatlan adathalmazt, majd ezt újra beolvassa, formázza és kiírja a végleges helyére.
9
MEGVALÓSÍTÁS
TimeTable osztály Ez az osztály az eredeti adathalmazunk feldarabolására szolgál. Segítségével oszlopokat vághatunk ki belőle, és lementhetjük külön file-ba. Konstruktorában felépít egy egyszerű swing UI-t, ami egy listából és egy gombból áll, majd feltölti a lista elemeit a táblázat első sorának elemeiből. Az osztálynak egy fő metódusa van a seperate(int). Ez a gomb lenyomására hívódik meg, és a listából kiválasztott elem sorszámát kapja meg, majd ennek a sorszámnak megfelelő oszlop elemeit gyűjti ki egy file-ba, miközben megkeresi ezeknek a maximum értékét, és mindegyiket ennek a századával leosztja (így 0-100-as skálára hozzuk az adatokat.).
XYLine osztály Ezen osztály felel a grafikon kirajzolásáért. Ezek rajzolásához a JFreeChart API-t használja, amibe többféle grafikon is bele van építve, de ebből az XYSpline-t használtam. Az osztály a konstruktorában felépíti az ablakot, és metódusaival ezt tölti fel. Az osztály főbb metódusai:
createChartPanel(): ez egy JFreeChart objektummal tér vissza, ezt pedig itt építi fel. Létrehoz egy adathalmazt, amit később a myDataset() metódussal töltök fel, és ennek az adathalmaz elemeivel feltölti a diagramot, majd megformázza ezt. Itt állíthatjuk be, hogy milyen formátumban és sűrűségben írja ki a tengelyeken az időközöket, mik legyenek a tengelyek nevei és még sok mást is.
myDataset(): ez egy XYDataset-tel tér vissza, ebben hívom meg a createCollecionSeries() metódusomat minden elemre, amit ki akarok rajzolni. Ebben az XYDataset lesz az az adathalmaz, amit később ábrázolunk a diagramon.
createCollecionSeries(String, TimeSeriesCollection): Ez adja hozzá az adathalmazhoz a file-ok tartalmát, a String-ben kapja meg ezek elérési útvonalát, ezeket beolvassa, majd a kapott XYDataset-hez hozzáadja.
10
MEGVALÓSÍTÁS
2.7. Működés bemutatása 2.7.1. Funkciók ismertetése A következőkben felhasználói oldalról szeretném bemutatni a programom működését. Mint már korábban mutattam a program futtatásakor a következő kép jelenik meg:
A képen megszámoztam a felhasználók által használható mezőket, ezeknek a funkcióit fogom itt taglalni.
1. Ez a mező, ahova azt a kifejezést kell írnunk, amire a Google Trends adatbázisában keresni szeretnénk.
2. Ha beírtuk a keresendő kifejezést, erre a gombra kattintva a kliens bejelentkezik a Google szerverre (Ezt csak első esetben teszi meg.), ezen keresztül lekéri a statisztikákat, kiválogatja a számunkra érdekeset (Levágja a 2011 előttieket.), megformázza, majd kiírja egy CSV fájlba.
3. Ebben a listában jelennek meg azok a keresőről lekért fájlok, illetve azok a CSV file-ok, amik ezekkel egy mappában találhatóak.
4. Itt a pollen adatbázisból kiexportált adatok tároló mappájának elemei találhatóak.
11
MEGVALÓSÍTÁS
5. A gomb arra hivatott, hogy ne legyen szükséges a feladathoz kapott teljes, nagy adatbázist betölteni a programba, hanem csak azokat, amikre ténylegesen szükségünk van. A gomb megnyomásakor a program betölti a pollen adatbázist, és ebből lehet az egyes oszlopokat kiexportálni, hogy később a program ezeket kezelni tudja. A gomb aktiválásakor ez az ablak ugrik fel: Az ablak működése teljesen értelemszerű, a fenti felsorolásból kiválasztjuk azt az adatot, amire szükségünk van, és a hozzáadás gombbal, ezt az adatot kimásolja egy külön file-ba, amit később a főablakban már láthatunk. A „Hozzáadás” gomb megnyomásakor az ablak bezárul.
6. Ezzel a gombbal a 3-as és 4-es listából kijelölt elemeket lehet törölni. 7. Ez a gomb jeleníti meg a 2.5-ös pontban ismertetett grafikont a 3,4-es listából kijelölt elemekből.
12
MEGVALÓSÍTÁS
2.7.2. Egy példa bemutatása Tegyük fel, hogy én szeretném megnézni, hogy vajon milyen összefüggésben lehet a levegőben található csalánfélék pollenmennyisége azzal, hogy mennyire keresnek rá a Google-ben arra, hogy nátha. Először rá kell keresni arra, hogy nátha.
Ha ez megvolt, akkor rákattintunk az „Új integrált tábla” gombra, ahol a felugró ablakban kiválasztjuk a „csalánfélék”-et.
Ha hozzáadtuk a nekünk kellő táblákat a program újraindítására van szükség, hogy a főablak táblái frissüljenek. Ekkor megjelenik mindkét oszlopban a frissen importált táblák.
13
MEGVALÓSÍTÁS
Itt, ha a nekünk kellő két új file-t kiválasztva rákattintunk az „Összehasonlítás” gombra, akkor megjelenik a kívánt grafikon, amit elemezve észrevehetjük, hogy a csalánfélék virágzásának nem sok köze van ahhoz, hogy Google-be mennyien keresnek erre rá. Ami ebből következhet, hogy aki a csalánra allergiás valószínűleg nem a náthához hasonló tüneteket produkál.
14
A MEGVALÓSÍTÁS UTÁN
3. A MEGVALÓSÍTÁS UTÁN 3.1. Összefoglalás A feladatom elkezdésekor az volt az eredeti felvetés, hogy vajon mennyiben függ össze a levegőben található pollennek az értéke azzal, hogy az emberek mennyire keresnek rá az allergiával kapcsolatos kulcsszavakra (allergia, nátha, pollen…), vagy növényekre (virágpor, parlagfű, üröm…). Ennek érdekében végeztem el ezt a projekt munkát. És mint a végén kiderült, a keresések ugyan úgy időszakosak, mint a pollen jelenléte a levegőben. Télen szinte egyáltalán nem érdeklődnek ilyenek után, míg nyáron az allergén növények virágzása alatt az érdeklődés felugrik.
3.2. Folytatási lehetőségek A feladat során sok minden eszembe jutott még, hogy miként lehetne ezt a programot bővíteni, de idő hiányában nem volt lehetőségem ezeket implementálni. Az ilyen lehetőségekről szeretnék kicsit írni a továbbiakban.
Több keresőmotor implementálása:
Arra gondoltam, hogy a Google mellett több keresőnek a statisztikáit figyelni ebben a témakörben (pl: Origo, Twitter), emellett a Wikipedia-ról is le lehet kérni az oldalainak a látogatottságát.
Idősorelemzés megvalósítása
Ha több helyről származó adatot vizsgálunk, azzal lehetőségünk nyílik ezek összevetésére. Itt lehetne együttfutást, meredekséget, lokális min/max értékeket vizsgálni.
Időjárással való egyezések vizsgálata és perdikció
Ha az eddigi adataink mellé bevesszük az időjártást (pl. hőmérsékletet) a figyelt értékek közé, akkor abban az esetben lehetőségünk nyílik jóslásokat tenni a jövőbeli értékekre vonatkozóan, az eddigi tapasztalataink, és az időjárási előrejelzések alapján
15
MUNKANAPLÓ
4. MUNKANAPLÓ 4.1. Ötödik hét A feladatomat ezen a héten kaptam meg, itt kezdtem el ismerkedni a fejlesztőkörnyezettel, és utána járni a különböző keresőoldalak statisztikának eléréséről.
4.2. Hatodik hét Megkaptam a pollen adatbázist, de még továbbra is a keresőmotor API-jával foglalkoztam. Megismertem a használt gTrends API használatát, de egyből egy problémába is ütköztem.
4.3. Hetedik – Tízedik hét Az API hibáját sikerült megoldanom, és megvoltak az első automatizált lekérdezések. Emellett elkészítettem egy User Interface-t a programhoz. (Ezt még kézzel.)
4.4. Tizenegyedik – Tizenkettedik hét A 2.4-es pontban leírt dolgokat itt végeztem el. Megírtam az osztályt, ami tetszőleges adatbázisból szétválogatja az oszlopait, és hasonló formára hozza a Google Trends értékekhez.
4.5. Tizenharmadik hét A további bővíthetőség érdekében átemeltem a programot egy IntelliJ IDEA GUI builderrel készített User Interface-re, és ebbe implementáltam a meglévő funkciókat. Emellett elkészítettem a programom diagram rajzoló funkcióját.
4.6. Tizennegyedik hét Készültem a prezentációra, és elvégeztem a végső simításokat, és a kódot átláthatóbb struktúrára faragtam.
16
HIVATKOZÁSOK
5. HIVATKOZÁSOK [1]
Google Trends. Forrás: https://www.google.com/trends/explore#q=allergia%2C%20pollen%2C%20parlagf %C5%B1&geo=HU&cmpt=q
[2]
Java Google Trends API (unofficial). (dátum nélk.). Forrás: GitHub: https://github.com/elibus/j-google-trends-api
[3]
jFreeChart. (dátum nélk.). Forrás: http://www.jfree.org/jfreechart/
17