Sémantická interpretácia

Ak si spomeniete na posledný príklad 12 z predchádzajúceho cvičenia (yes-no gramatika), narazili sme na komplikáciu, že takáto gramatika vracala do VoiceXML dokumentu jeden z nasledujúcich výrazov:

  • yes, yeah, yep, sure ako prejavy súhlasu
  • a no, not a nope ako prejavy nesúhlasu.

Predstavme si napríklad VoiceXML aplikáciu, ktorá sa na začiatku používateľa opýta, či si želá prehrať návod. V prípade, že prejaví súhlas, má mu byť návod prehraný. Ak prejaví nesúhlas, aplikácia má pokračovať inou činnosťou. Poďme sa teda pozrieť, ako by vyzeral VoiceXML kód takejto aplikácie, ak by sme použili gramatiku z príkladu 12 z predošlého cvičenia (nech daná gramatika je v súbore yesno.grxml):

Príklad 1

<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0">
  <form id="moj_druhy_dialog">
    <field name="navod">
      <prompt> Želáte si vypočuť návod? </prompt>
      <grammar src="yesno.grxml" type="application/grammar+xml">

      <filled>
        <if cond="navod=='yes'">
           <goto next="navod.vxml"/>
        </if>   

        <if cond="navod=='yeah'">
           <goto next="navod.vxml"/>
        </if>

        <if cond="navod=='yep'">
           <goto next="navod.vxml"/>
        </if>

        <if cond="navod=='sure'">
           <goto next="navod.vxml"/>
        </if>

        <if cond="navod=='no'">
           <goto next="nextdialog.vxml"/>
        </if>

        <if cond="navod=='not'">
           <goto next="nextdialog.vxml"/>
        </if>

        <if cond="navod=='nope'">
           <goto next="nextdialog.vxml"/>
        </if>

      </filled>
    <field>
  </form> 
</vxml>

Z daného príkladu vidíme, že ošetriť všetky možné vstupy od používateľa môže byť nekomfortné a neprehľadné, niekedy až nemožné. V prvom rade je to ale nelogické, nakoľko používateľ vyjadruje iba dva možné stavy - súhlas a nesúhlas. Ak by sme vedeli združiť všetky vyjadrenia súhlasu pod jeden výraz (napr. YES) a všetky vyjadrenia nesúhlasu pod jeden výraz (napr. NO), VoiceXML kód by bol jednoduchší a prehľadnejší.

Riešenie tejto situácie prináša ďalší z jazykov zo skupiny W3C Speech Interface Framework s názvom Semantic Interpretaion for Speech Recognition - SISR.

W3C Semantic Interpretation for Speech Recognition recommendation

W3C SISR 1.0 odporúčanie definuje elementy a atribúty, ktoré môžu byť vložené do rečových gramatík pre následnú extrakciu sémantického výsledku. Týmto spôsobom je možné efektívnejšie a komplexnejšie extrahovať význam prehovoru používateľa, ktorý je doručený späť do VoiceXML aplikácie.

SISR špecifikácia defakto definuje iba jeden element <tag> a atribúty, ktoré môžu byť pridané do rečových gramatík vo formáte definovanom vo W3C SRGS. Taktiež definuje mechanizmy extrakcie významu a jeho reprezentácie vo forme premenných (objektov), ktoré sú doručené do VoiceXML aplikácie.

Sémantická interpretácia - ako na to?

Problematika sémantickej interpretácie je pomerne zložitá a komplexná. Aby sme však porozumeli aspoň základom, vráťme sa k nášmu prvému príkladu a ku gramatike z predchádzajúceho cvičenia. Pridanie SISR elementu <tag> do yes-no gramatiky nám pomôže združiť súhlasy a nesúhlasy pod spoločný vystup, ktorý bude reprezentovať výsledok sémantickej analýzy. S takýmto ujednoteným výsledkom sa nám bude následne oveľa lepšie pracovať vo VoiceXML aplikácii.

Príklad 2 Yes-no gramatika so sémantickými značkami

<?xml version="1.0" encoding="UTF-8"?>
<grammar root="main" tag-format="semantics/1.0-literals" version="1.0" xml:lang="en">

  <rule id="main" scope="public">
    <one-of>
      <item> <ruleref uri="#yes"/> </item>
      <item> <ruleref uri="#no"/> </item>
    </one-of>
  </rule>

  <rule id="yes">
    <one-of>
      <item>yes</item>
      <item>yeah <tag> yes </tag> </item>
      <item>yep <tag> yes </tag> </item>
      <item>sure <tag> yes </tag> </item>
    </one-of>
  </rule>

  <rule id="no">
    <one-of>
      <item>no </item>
      <item>not <tag> no </tag> </item>
      <item>nope <tag> no </tag> </item>
    </one-of>
  </rule>
</grammar>

Ako je vidieť z uvedeného príkladu, ku všetkým alternatívam, ktoré boli iné ako "yes" sme vložili sémantickú značku <tag> yes </tag>, ktorá zabezpečí, že do hlavného pravidla a tiež aj do VoiceXML aplikácie sa pri rozpoznaní týchto alternatív vráti práve "yes". Obdobne sme to urobili pre pravidlo no, kde sa pre všetky alternatívy vráti vždy výraz "no".

Teraz teda môžeme zjednodušiť aj vetvenie v našej VoiceXML aplikácií:

Príklad 3

<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0">
  <form id="moj_druhy_dialog">
    <field name="navod">
      <prompt> Želáte si vypočuť návod? </prompt>
      <grammar src="yesno.grxml" type="application/grammar+xml">

      <filled>
        <if cond="navod=='yes'">
           <goto next="navod.vxml"/>
        </if>   

        <if cond="navod=='no'">
           <goto next="nextdialog.vxml"/>
        </if>

      </filled>
    <field>
  </form> 
</vxml>

Teda výsledkom je zjednodušenie vetvenia nášho programu, ktoré sme zúžili na dvojicu <if> elementov.

Samozrejme, element <tag> a W3C SISR špecifikácia dokáže aj oveľa väčšie veci ako je toto :). Na to však potrebujeme spoznať aj ďalšie detaily SISR. Poďme teda na to!

<tag> syntax

Ak sa bližšie pozrieme na Príklad 2, kde sme upravili pôvodnú yes-no gramatiku, môžeme si všimnúť, že v <grammar> elemente nám pribudol nový atribút tag-format. Tento atribút definuje syntax <tag> elementov, ktorý bude použitý v danej gramatike.

Podľa SISR špecifikácie, <tag> elementy vložené do gramatík na zabezpečenie sémantickej intepretácie môžu mať jeden z dvoch druhov syntaxe:

  • skript tag syntax (the Script tag syntax) definuje, že obsah <tag> elementov vložených v danej gramatike bude mať podobu ECMAScript výrazov. Pre použitie tejto syntaxe je potrebné nastaviť atribút tag-format <grammar> elementu na "semantics/1.0".
  • String Literal tag syntax (the String Literal tag syntax) definuje, že obsah <tag> elementov vložených v danej gramatike bude mať podobu jednoduchých textových reťazcov. V tomto prípade sa atribút tag-format <grammar> elementu nastaví na "semantics/1.0-literals".

V gramatike v Príklade 2 sme použili druhý, jednoduchší syntax sémantických tagov (String Literal syntax), kde sémantický výsledok má vždy podobu jednoduchých reťazcov znakov. Nie vždy je však táto možnosť postačujúca, nakoľko výsledok rozpoznávania reči môže mať aj zložitejšiu štruktúru.

Predstavme si situáciu, že potrebujeme pripraviť gramatiku pre zadávanie dátumov. Je jasné, že dátum sa skladá z troch častí - dňa, mesiaca a roku. Ak by sme interpretáciu významu v takejto gramatike riešili iba pomocou jednoduchšej String Literal syntaxe, výsledok ktorý by sme dostali by bol jedným reťazcom znakov, ktorý by bolo nutné pre ďalšie spracovanie zložito parsovať vo VoiceXML kóde. Našťastie ale, špecifikácia W3C SISR nám prináša elegantné riešenie v podobe Script tag syntaxe, ktorý umožňuje vrátiť do VoiceXML namiesto jednej premennej obsahujúcej iba text, rovno celý ECMAScriptový objekt, ktorý môže niesť ľubovoľné množstvo vlastností (premenných).

Script tag syntax alebo ako pravidlá vracajú hodnoty..

Premenné pravidiel (Rule variables)

Každé pravidlo gramatiky (<rule> element) má asociovanú svoju premennú, ktorú budeme nazývať premenná pravidla. Táto premenná, podobne ako je to u premenných vstupných polí v jazyku VoiceXML, nesie výsledok svojho vykonania. V prípade, že je tag-formát nastavená na "semantics/1.0" syntax, táto premenná pravidla sa nazýva out. Táto premenná je implicitne definovaná ako prázdny objekt.

Takýto prázdny ECMASCriptový objekt môže byť naplnený <tag> elementmi dvoma spôsobmi:

  • <tag> element mu priradí jednoduchú hodnotu, napríklad číslo alebo reťazec (napr.:, out="november";). V tomto prípade sa premenná out prekonvertuje z objektu na obyčajnú premennú.
  • <tag> element objektu out priradí vlastnosť (property), napríklad: out.day="22";

V prípade, že dané pravidlo neobsahuje žiadnen element, pravidlo jednoducho vráti text slov, ktoré boli rozpoznané.

V nasledujúcom príklade číslo 4. sme použili tag syntax "semantics/1.0", ktorý umožňuje premenným pravidiel byť ECMAScriptovými objektmi. V prípade vyššie spomínanej gramatiky na zadávanie dátumu, nám to umožňuje do VoiceXML dokumentu vrátiť tri nezávislé premenné - day, month a year.

Príklad 4: dates.grxml

<?xml version="1.0" encoding="utf-8"?>
<grammar root="top" tag-format="semantics/1.0" version="1.0" xml:lang="en-US">

 <rule id="top" scope="public">
   <item> <ruleref uri="#day"/> <tag> out.day = rules.day; </tag> </item>
   <item> <ruleref uri="#month"/> <tag> out.mounth = rules.month; </tag> </item>
   <item> <ruleref uri="#year"/> <tag> out.year = rules.year; </tag> </item>  
 </rule>

 <rule id="day" scope="private">
  <one-of>
    <item>01</item>
    <item>02</item>
    <item>03</item>
    ...
    <item>31</item>
  </one-of>
 </rule>

 <rule id="month" scope="private">
  <one-of>
    <item>January</item>
    <item>February</item>
    <item>March</item>
    ...
    <item>December</item>
  </one-of>
 </rule>

 <rule id="year" scope="private">
  <one-of>
    <item>2017</item>
    <item>2018</item>
    <item>2019</item>
    ...
    <item>2035</item>
  </one-of>
 </rule>

</grammar>

Ako sme spomenuli vyššie, do VoiceXML sa nám vrátia tri nezávislé premenné, s ktorými môžeme jednoduchšie pracovať, napr. overiť, či používateľ zadal dátum, ktorý eštelen nastane:

Príklad 5

<field name="date">

  <prompt> Zadajte dátum, pre ktorý si želáte vyhľadať spojenie.</prompt>  
  <grammar src="dates.grxml" type="application/grammar+xml"/>

  <filled> 
    <if cond="date.day &gt; actual_day && date.month &gt; actual_month && date.year &gt; actual_year>
       <goto next="#obtain_destination"/>
    <else/>
       <prompt> Zadali ste dátum, ktorý nezodpovedá dátumom v budúcnosti. </prompt>     
       <clear namelist="date"/>
    </if>
  </filled>

</field>
...

Uvedený príklad ukazuje ako rozdelenie dátumu na tri samostatné hodnoty umožňuje ľahko overiť, či sa jedná o dátum z minulosti alebo z budúcnosti a teda, či môže byť pre neho vyhľadaný spoj, pre ktorý si chce klient zarezervovať miestenku.

Jazyk SISR umožňuje samozrejme aj ďalšie možnosti práce so sémantickou interpretáciou. Viac sa dozviete na na nasledujúcich odkazoch: