game_of_life_glider

Sikló az életjátékból

Munkám során (rádiós) sok érdekes feladatot kell teljesítenem, viszont sok a favágó-munka is. Utóbbi igazából gépeknek való feladat, és valóban azt találjuk, hogy nemzetközi tendencia az egyszerű számokból és tényekből álló sajtóbeszámolók megírását gépekre bízni. Jellemzően ilyen gépeknek való feladat az időjárás-jelentés és a deviza-árfolyam hírré való fogalmazása. Ezeket évek óta géppel fogalmaztatja a magyar adás.* Hadd mutassam be, hogyan.

A deviza-árfolyam végtelenül egyszerű, azzal kezdem hát. A Román Nemzeti Bank a honlapján gépi nyelven (xml formátumban) is közli az árfolyamot  (lásd a pentru programatori részt), amelyet bizonyos feltételekkel át lehet venni és fel lehet használni. És valóban, sok honlap tartalmaz ablakocskát (widget), amely éppen ezeket az adatokat közli. A munkahelyemen használt szoftverem (webszerveren futtatott PHP-szkriptek) ilyesmi szöveg-sablonba illeszti be a friss számadatokat, két tizedes pontosságúra csonkolva ( floor(érték x 100)/100 ):

=====VALUTA Keltezve: %a_bnr_keltezése% Lekérve: %kérdezés_dátuma%

 

A Nemzeti Bank %érvényességi_idő% délig érvényes deviza-árfolyama:
1 euró %euró_ára_egészrész% lej %euró_ára_törtrész% bani
1 amerikai dollár %dollár_ára_egészrész% lej %dollár_ára_törtrész% bani
1 svájci frank %frank_ára_egészrész% lej %frank_ára_törtrész% bani
100 forint %forint_ára_egészrész% lej %forint_ára_törtrész% bani

A nagyobb automatizálás kedvéért a program egy évtizedre előre tudja (illetve már csak négy évre, hat eltelt a fejlesztés óta), mikor lesz ortodox húsvét, valamint ott a karácsony és a december elseje, amikor nem számítanak árfolyamot. Eszerint és figyelembe véve, hogy hány óra van, választja ki a program a BNR keltezését és az %érvényességi_idő% szavát, amely lehet ma, holnap, hétfő, esetleg a hét más napja péntekig, ha ünnep miatt ugrani kell.

***

Az időjárási jelenségekről ma már teljesen szabványos nemzetközi leíró nyelven is lehet beszélni, ahogyan erről már korábban is írtam, legyen az az időjárás észlelése vagy előrejelzése, lásd például a METAR rendszert. Elérhető számos internetes szolgáltatás, amely gépi nyelven (valamilyen számadatok formájában, xml-ben például) vagy alapvető szövegben közli a tudnivalókat: érvényességi idő, érvényességi helyszín, felhőzet, páratartalom, csapadék, légnyomás, szél, hőmérséklet. Ilyen adatokból dolgozik a kütyükön oly gyakran megjelenő időjárás-panel. Ideális esetben a közmédia készen és anyanyelven kapja az előrejelzést, de ha a helyzet ideális volna, ez a cikk nem született volna meg.

Míg vizuálisan képekből sokkal hamarabb tájékozódik az ember, és felesleges szöveget fogalmazni, a rádióban hangzó – és nagyon fontos: befogadható – szöveg kell. Egy rádióban elhangzó regionális időjárás-előrejelzés az alábbi sablonra húzható fel, függetlenül attól, hogy ember írja vagy gép:

 (Ma/Holnap) (valahol) (valahogyan alakul az idő) [illetve (máshol) (máshogyan alakul az idő) [illetve (megint máshol) (megint máshogyan alakul az idő) …]]. [A hegyvidéken megint másmilyen idő lesz] A szél (gyenge/közepes/erős) lesz. A legalacsonyabb hőmérséklet X fok lesz, ) a csúcshőmérséklet (pedig) Y fok körül alakul. [Köd lesz / Hőség lesz / (egyéb figyelmeztetés)]

Ha ember írja, ennek a szövegnek, a benne szereplő adatoknak utána kell járni. Forrása válogatja, hogy hogyan közli az adatokat, de alapvetően sokat kell klikkelni, stírolni kell az ikonokat és a hőmérsékleteket, és favágó munka az egész. A szoftverem jelenleg az yr.no szolgáltatáson alapul, és az alábbiak szerint dolgozik.

Az eredményül kapott szövegben bemutatott időintervallum: reggeli, délelőtti lekérdezéskor “ma délután”, délutáni, illetve esti lekérdezéskor “holnap”.

A befogadható szöveg olyasmit jelent, hogy nincs tele adatokkal, vagyis egyszerűsítéseket tartalmaz. Könnyen lehet, hogy Kolozsvár egyik városrészében szakad az eső, míg a másikban süt a Nap, és ez minden városra és falura érvényes lehet, de képtelenség néhány mondatban bemondani. A lekérdezett földrajzi pontokat ezért régióba sorolom az alábbiak szerint. Ez persze vitatható, de lásd lennebb.

$regioinfo = array(
     'maramaros'   => array('Baia_Mare'),
     'partium'     => array('Oradea', 'Satu_Mare', 'Arad'),
     'bansag'      => array('Timi%C5%9Foara'),
     'delerdely'   => array('Alba_Iulia', 'Bra%C5%9Fov', 'Sibiu'),	   
     'eszakerdely' => array('Cluj-Napoca', 'Zal%C4%83u', 'Turda', 'T%C3%A2rgu_Mure%C5%9F'),
     'szekelyfold' => array('Miercurea-Ciuc', 'Sf%C3%A2ntu-Gheorghe', 'Gheorgheni'),
     'hegyvidek'   => array('Mun%C5%A3ii_Vl%C4%83deasa', 'Retezat')
  );

Időjárási jelenségek szempontjából régiónként egy egyszerű mondat fér a szövegbe, vagyis az idő (derült, változékony, csapadékos, viharos) lesz. A régióhoz az egyes pontokban tapasztalt legkellemetlenebb időjárást rendelem. Ha úgy tetszik, ez egy max függvény.

A hőmérsékleti értékek szempontjából a legalacsonyabb és a legmagasabb hőmérsékleti mutató a hegyvidék kivételével az összes helyi értékből áll össze (min és max függvény). A szél ugyanígy minmax páros, a hegyvidék kivételével tartalmazza az értékeket, de a bemondást csak a legerősebb szélsebesség éri meg.

Természetesen vitatható a módszer, amellyel a  régiók, az időjárási jelenségek és a hőmérsékleti értékek kiválasztását végzem, no meg az egyszerűsítések, de a pontosítása meteorológusra bízandó feladat, és bőven túlmutat a rádiós célkitűzésen, amely Erdély-szerte többnyire érvényes és rövid, befogadható szöveg. Az érvényességhez hozzátartozik még az is, hogy ezek az előrejelzések – származzanak akár az ANM-től, az OMSZ-től, a meteoblue-ról vagy az yr.no-ról – eléggé pontosak, de nem tévedhetetlenek. Ha a forrás téved, a magyar szöveg is tévedni fog.

Az algoritmus pedig a következő. A lekérdezés időpontja szerint a program kiválasztja azt az időintervallumot, amely érdekli. Erre az időre és a kiválasztott földrajzi pontokra adatot kér a szolgáltatótól. Ezeket régiókra egyszerűsíti, az azonosnak talált időjárású régiókat felsorolásba vonja össze, majd ebből szöveget fogalmaz. A szöveghez hozzáteszi a szél- és a hőmérsékleti adatokat. A szöveg Kolozsváron hangzik el, ezért eszakerdely kerül előre, a többi régió pedig ezt kiegészítő mellérendelő mondatként követi. Amennyiben a régiók legalább felében eszakerdely-jel megegyező a várható időjárás (lásd fennebb), akkor a nyitó felsorolást a nagyrészt szó helyettesíti. A hegyvidék valamelyest kitüntetett: ha egyedül szerepel, akkor külön mondatot kap a régió-felsorolások végén. Az állítmányokat opcionális is árnyalja, hogyha a felsorolás előző elemében hasonló időjárás volt – az argumentuma adja meg, mi a hasonlóságot jelentő szó, illetve az %ido% helykitöltő adja meg, hogy hová kerül a ma/holnap szó, amennyiben elöl van a mondat, különben üres. Az angol kulcsszavakból eképpen lesz magyar mondatrész:

function yrmeteo_skyprecip2magyar($a){
 $res = '%ido% <is value="der&uuml;lt" /> t&ouml;bbnyire der&uuml;lt lesz az &eacute;gbolt (def)';
 if (yrmeteo_benne($a, 'clear')) $res = str_replace('(def)', '', $res);
 if (yrmeteo_benne($a, 'partly clear')) $res = str_replace('(def)', '', $res);
 
 if ((yrmeteo_benne($a, 'fair')) OR (yrmeteo_benne($a, 'partly cloudy')) )
 $res = '%ido% <is value="v&aacute;ltoz&eacute;kony" /> v&aacute;ltoz&eacute;kony lesz az &eacute;g <partly />';

 if (yrmeteo_benne($a, 'cloudy') OR yrmeteo_benne($a, 'covered'))
 $res = '%ido% <is value="borong&oacute;s" /> borong&oacute;s lesz az id&#337;, csapad&eacute;k nem v&aacute;rhat&oacute;';

 if ((yrmeteo_benne($a, 'rain')))
 $res = '<is value="es&#337;" /> es&#337;s id&#337; lesz %ido%';

 if ((yrmeteo_benne($a, 'heavy rain')) ){
 $res = '<is value="es&#337;" /> kiad&oacute;s es&#337; v&aacute;rhat&oacute; %ido%, '.
 'felh&#337;szakad&aacute;s is lehets&eacute;ges';
 }; 

 if ((yrmeteo_benne($a, 'snow')) )
 $res = '%ido% <is value="havaz&aacute;s"> havaz&aacute;s v&aacute;rhat&oacute;';

 if ((yrmeteo_benne($a, 'storm')) )
 $res = '%ido% <is value="zivatar"> zivataros id&#337; v&aacute;rhat&oacute;';

 return $res; 
}

Az alábbi kódrész rakja össze a felsorolást szép magyar szöveggé, amit már csak írásjelek, szóismétlések és kis-nagybetű szerint kell kozmetikázni. Ezután következik a szél- és a hőmérséklet-szöveg.

   
   $stringek = array();
   $c = 0;
   if (count($forditva) > 1){ 
     foreach ($forditva as $k => $v){
      // a forditva tomb tartalmazza a regionkenti idojarast ugy, hogy
	  // a tomb elemeinek kulcsa (k) az idojaras-string, 
	  // az erteke (v) pedig az ervenyessegi regiokat tartalmazo tomb
	  
	  // az alfanumerikus azonosito ekezetes magyar szoveg lesz
	  foreach ($v as &$r) $r = yrmeteo_regioraggal($r, 'ban');
	  
	  if (count($v) > 1) $v[count($v)-1] = ' és '.$v[count($v)-1];//kozmetikazas
	  
	  //nagyreszt
	  if ($c==0) if (count($v) >= count($erdekel_regio) / 2) $v = array(' nagyrészt ');
	  
	  $v = implode(', ', $v);
	  $v = str_replace(',  és ', ' és ', $v);//kozmetikazas
      $stringek[] = $v.' '.$k;
	  $c++;
    }
  }else{//count(forditva) <= 1
      $a = array_keys($forditva);
      $stringek[] = $a[0];
	  $c++;
   }

A fennebbi megoldásokat egyszer kell végiggondolni és kivitelezni, utána pedig éveken át gombnyomásra készül a bemondható szöveg, úgy mint ez itt:

===VALUTA 2015.11.20., péntek===
===(lekérve: 2015.11.22., vasárnap 22:36, tárolva: 2015.11.22., 22:36)===érvényes holnap (nov. 23) délig (bnr: 13h)===
A Nemzeti Bank holnap délig érvényes deviza-árfolyamai:

 

  1
euró
4 lej 44 bani
  1
amerikai dollár
4 lej 15 bani
  1
svájci frank
4 lej 9 bani
100
forint
1 lej 43 bani

 

==== METEO ====holnap=2015.11.23. src=yr.no fogalmazva=2015.11.22. 21:55

Nagyrészt esős idő lesz holnap. A Bánságban borongós lesz az ég, csapadék nem valószínű. A hegyvidéken havazás várható. A légmozgás gyenge marad. A levegő 0 fokig hűlhet, a csúcshőmérséklet pedig 8 fok körül alakul.

Kiegészítésképp, az előfizetés útján kapott, de románul és több táblázatként érkező hőmérsékleti értékekből, ugyancsak évek óta szintén saját szoftver fogalmaz, a műsorrend szerint (vagyis a lekérés időpontjához rendelt szabályok alapján) bemondható magyar szöveget, amilyen ez:

Néhány perce
Kolozsváron és Tordán 3,
Aradon, Marosvásárhelyen, Máramarosszigeten, Nagyváradon, Temesváron és Zilahon 4,
Besztercén, Désen, Nagybányán, Nagyszebenben és Szatmárnémetiben 5,
Csíkszeredában 6,
Brassóban, Sepsiszentgyörgyön és Székelyudvarhelyen 7 fok volt.
 
A hegyvidéken
a Vlegyásza csúcson -6,
Biharfüreden -2,
a Bâlea tónál és a Páringon -1,
Păltinişen és a Bucsin-tetőn 1 fokot mértek.
 
======= CSAK MEGYESZÉKHELYEK ===============
Kevéssel ezelőtt
Kolozsváron 3,
Aradon, Marosvásárhelyen, Nagyváradon, Temesváron és Zilahon 4,
Besztercén, Nagybányán, Nagyszebenben és Szatmárnémetiben 5,
Csíkszeredában 6,
Brassóban és Sepsiszentgyörgyön 7 fokot mutatott a hőmérő.

* Az itt leírt szoftvereket a mindenkori szerkesztő felelősségére, munkahelyi támogatás nélkül, hobbiból és saját infrastruktúrán bocsátottam a kollégáim rendelkezésére.

facebooktwittergoogle_plusredditpinterestlinkedinmail