WARNING: DOCUMENT STILL BEING WRITTEN!

Introduction

This document formaly introduces and defines version 2 of the Emu Query Language (EQL).

Extended Backus–Naur Form (EBNF)

most of the EBNF was adapted from (John 2012)

Terminal symbols of EQL2 (operators) and their meaning.

Sorted descending by their bining priority

Operator Meaning
# Result modifier (projection)
, Parameter list separator
== Equality
!= Unequality
=~ Regular expression match
!~ Regular expression not match
= Equality
> Greater than
>= Equal or greater than
< Less than
>= Equal or less than
| Alternatives separator
& Conjunction of equal rank
^ Dominanceconjunction
-> Sequenceoperator

Terminal symbols of EQL2 (brackets) and their meaning.

Bracket Meaning
Quotes literal string
( Function parameter list begin
) Function parameter list end
[ Sequence or dominance enclosing begin bracket
] Sequence or dominance enclosing end bracketr

Terminal symbols of EQL2 (functions) and their meaning

Function Meaning
Start Start
Medial Medial
End Final
Num Count

Nearly complete formal description of EMU query language EQL2

X Y
EQL = KONJA | SEQA | DOMA;
DOMA =‘[’,(KONJA|DOMA|SEQA),’ˆ’,(KONJA|DOMA|SEQA),’]’; (Ebenen müssen hierarchisch oder autosegmentell assoziert sein)
SEQA =‘[’,(KONJA|SEQA|DOMA),’->’,(KONJA|SEQA|DOMA),’]’; (Ebenen müssen linear assoziert sein)
KONJA = {‘[’},EA,{’&’,EA},{’]’}; (Ebenen müssen linear assoziert sein)
EA = ETIKETTA | FUNKA;
ETIKETTA = [‘#’],EBENE,(‘=’ | ‘==’ | ‘!=’ | ‘=~’ | ‘!~’),ETIKETTALTERNATIVEN;
FUNKA = POSA | NUMA;
POSA = POSFKT, ‘(’,EBENE,‘,’,EBENE,‘)’,‘=’,‘0’| ‘1’; (Ebenen müssen hierarchisch oder autosegmentell assoziiert sein) (zweite Ebene gibt Semantik vor)
NUMA = ‘Num’,‘(’,EBENE,‘,’,EBENE,‘)’,VOP,INTPN; (Ebenen müssen hierarchisch oder autosegmentell assoziiert sein) (erste Ebene gibt Semantik vor)
ETIKETTALTERNATIVEN = ETIKETT , {‘|’,ETIKETT};
ETIKETT = ETIKETTIERUNG | (“’“,ETIKETTIERUNG,“’“); (EBENE sind Ebenen aus der Etikettierungsstruktur der Datenbank) (ETIKETTIERUNG ist eine freiwählbare Zeichenkette bzw. eine legal labels Klasse aus dem Etikettierungsschema.)

POSFKT = | ‘Start’|‘Medial’|‘End’; |
VOP = | ‘=’ | ‘==’ | ‘!=’ | ‘>’ | ‘<’ | ‘<=’ | ‘>=’; |
INTPN = | ‘0’ | INTP; |
INTP = | DIGIT-‘0’,{DIGIT}; |
DIGIT = | ‘0’|‘1’|‘2’|‘3’|‘4’|‘5’|‘6’|‘7’|‘8’|‘9’; |

Limitations

One query can only contain one result modifier ‘#’ (hashtag)

Examples

examples adapted from emuquery.pdf

Simple queries (one argument)

  • All m elements on level Phonetic: [Phonetic = m]
  • m or n elements on level Phonetic: [Phonetic = m | n]
  • All elements except m oder n: [Phonetic != m | n]
  • All syllables (Assuming that no syllable x exists): [Syllable !=x ]
  • All syllables: [Syllable =~.* ]
  • All Text level elements beginning with ‘fi’: [Text=~fi.*]

Sequence queries ->

Simple sequences

Hier werden die Argumente mit -> (folgt) verbunden.

  • Syntax: [L = a -> L = b]
  • Semantik: Die a Einheit von Level L kommt vor der b Einheit von Level L Bedingung: Die Argumente muessen von der gleichen, oder parallelen Ebenen sein

  • Eine Reihenfolge von m I Segmenten auf der Phonetic-Ebene [#Phonetic = m -> #Phonetic = I] [Phonetic = m -> Phonetic = I] (Die Segment-Liste hat die Startzeit von m und die Endzeit von I) Wie oben – aber hier wollen wir nur den m Segment haben [#Phonetic = m -> Phonetic = I] (Startzeit von m, Endzeit von m) Wie oben – aber hier wollen wir nur den I Segment [Phonetic = m -> # Phonetic = I]

2.2. Mehrfache Reihenfolgen Hier handelt es sich um eine Reihenfolge von Argumenten, a1, a2, a3, a4, … Das muss so geklammert werden: [[[[a1-> a2] ->a3]->a4] ->a5] Alle Reihenfolgen von [m I n][[Phonetic = m -> Phonetic = I] -> Phonetic = n] alle Reihenfolgen von ‘john could lend’ (aus der Text-Ebene) [ [Text = john -> Text = could ] -> Text = lend] ‘the’, dann beliebige zwei Woerter, dann ‘managed’ (alle aus der Text-Ebene) [ [ [Text = the -> Text != x ] -> Text !=x ] -> Text = managed]

  1. Boolean & Syntax: Semantik: Bedingungen: [L1=a &L2=b&L3=c&L4=d&…Ln=n] alle a Einheiten aus Level 1 die auch die b, c, d..n Eigenschaften besitzten Die Argumente muessen aus der gleichen, oder parallelen, Ebenen sein. S Silben die auch mit L+H* etikettiert worden sind [Syllable = S & Pitch_Accent=L+H*] Der Text aller Funktionswoerter [Text !=x & Word = F] Der Text aller Inhalts-Woerter die auch akzentuiert (S) sind (oder: alle akzentuierten Inhalts-Woerter) [Text!=x & Word=C & Accent=S]
  2. Domination Syntax: Semantik: Bedingung: [L1=a^ L2=b] a wird von b dominiert oder a dominiert b L1 dominiert L2 oder L2 dominiert L1 4.1 Einfache Domination Alle /p/ Phoneme in S Silben [Phoneme = p ^ Syllable = S] Alle Silben, die einen /p/ Phonem enthalten [Syllable !=x ^ Phoneme = p] oder [Phoneme = p ^ #Syllable !=x] Alle Silben, die weder /k/ noch /p/ noch /t/ enthalten [Syllable!=x ^ Phoneme != p | t | k] oder [Phoneme != p | t | k ^ # Syllable !=x ] 4.2 Mehrfache Domination Hier handelt es sich um eine Reihenfolge von Argumenten, a1, a2, a3, a4, … Das muss so geklammert werden: [[[[a1^ a2] ^a3]^a4] ^a5] H* Silben die einen /p/ Phonem enthalten, und die von den Woertern ‘price’ oder ‘space’ dominiert sind [[Pitch_Accent=H* ^ Phoneme=p] ^ Text = price|space] Das selbe – wir wollen aber die entsprechenden Woerter haben [[Pitch_Accent=H* ^ Phoneme=p] ^ #Text = price|space]
  3. Position 5.1 Einfache Verwendung Syntax: Semantik: Bedingung: Hinweis: Start(La, Lb) = 1 Lb kommt am Anfang von La vor La dominiert Lb Die einfache Verwendung erzeugt die Segment-Liste von Lb zB: Wort-anfangs-Silben [Start(Word, Syllable)=1] Wort-anfangs-phoneme [Start(Word, Phoneme)=1] Silben, die nicht am Anfang des Wortes sind [Start(Word, Syllable)=0] Es gibt auch Medial(La, Lb) und End(La, Lb) Wort-finale-silben [End(Word, Syllable)=1] usw. 5.2 Position und Boolean & Syntax: Semantik: Bedingung: L = e & Start(La, Lb) = 1 Die Einheit e aus Ebene L kommt am Anfang von La vor La dominiert Lb (L und Lb sind aus der selben Ebene oder sie sind parallel zueinander). Die L und Lb Ebenen, die mit & verbunden sind, sind in diesen Beispielen unterstrichen zB: alle /p/ Phoneme am Anfang einer Syllable [Phoneme = p & Start(Syllable, Phoneme)=1] Alle wort-finalen /m/ Phoneme [Phoneme = m & End(Word, Phoneme)=1] Alle nicht-wort-finalen S-Silben die auch mit einem L+H* Tonakzent etikettiert worden sind [Syllable =S & Pitch_Accent=L+H* & (Word, Syllable)=0] 5.3 Position und Boolean ^ Syntax/Semantik wie bei 5.2, nur: Wenn L und Lb verschiedener Ebenen sind (L dominiert Lb, oder Lb dominiert L) muss ^ statt & verwendet werden: /p/ Phoneme, die in der ersten Silbe des Wortes vorkommen [Phoneme = p ^ Start(Word, Syllable)=1] Alle Phoneme, die nicht in der letzten Silbe des Wortes vorkommen [Phoneme !=x ^ End(Word, Syllable)=0]
  4. Anzahl 6.1 Einfache Verwendung Syntax: Semantik: Bedingung: Hinweis: Position) Num(La, Lb) = n La enthaelt n Lb Einheiten La dominiert Lb. n ist eine Zahl Die einfache Verwendung erzeugt die Segment-Liste von La (nicht von Lb, wie bei 4-silbige Woerter [Num(Word, Syllable)=4] Es gibt auch > (mehr als), < (weniger als) != gleicht nicht Silben, die mehr als 6 Phoneme haben [Num(Syllable, Phoneme)>6] usw. 6.2 Anzahl und Boolean & Syntax: Semantik: Bedingung: L = e & Num(La, Lb) = n Die Einheit e aus Ebene L wird von La dominiert; und La enthaelt n Lb Einheiten La dominiert Lb (L und La (nicht Lb!) sind aus der selben Ebene oder sie sind parallel zueeinander). Die L und La Ebenen, die mit & verbunden sind, sind in diesen Beispielen unterstrichen Der Text aller Woerter, die aus mehr als 11 Phonemen bestehen: [Text!=x & Num(Text, Phoneme) > 11 ] = [Text!=x & Num(Word, Phoneme) > 11 ] Die H* Ton-Akzente in Silben von 5 Phonemen: [Pitch_Accent = H* & Num(Syllable, Phoneme) = 5] 6.3 Anzahl und ^ Syntax/Semantik wie bei 6.2, nur: Wenn L und La verschiedener Ebenen sind (L dominiert La, oder La dominiert L) muss ^ statt & verwendet werden: alle m Phoneme in 4-silbigen Woertern [Phoneme=m ^ Num(Word, Syllable)=4] alle W-Silben in Woertern von 3 oder weniger Silben [Syllable = W ^ Num(Word, Syllable) < 3] Alle Woerter, die Silben mit 4 Phonemen enthalten [Text!=x ^ Num(Syllable, Phoneme) = 4]
  5. Kombinationen 7.1 ^ und -> (Domination und Nachfolge) Bedingung Die Reihenfolge -> darf nur parallele (oder die selben) Ebenen verbinden! (Siehe 2.) (Diese sind in den Beispielen unterstrichen) a1-> a2 [[a1 ^ a2] -> a3] [a1 -> [a2 ^ a3]] m kommt vor I und m ist in einer S-Silbe [[Phoneme = m -> Phoneme = I] ^ Syllable=S] s kommt vor p und p ist in einer W-Silbe [Phoneme = s -> [Phoneme = p ^ Syllable = W]] alle S-Silben, die einen p enthalten, und die vor einer S-Silben vorkommen [[Syllable = S ^ Phoneme = p] -> Syllable = S] aber jetzt wir wollen den p also: p ist in einer S-Silbe und diese S-Silbe kommt vor einer S-Silbe [[Phoneme = p ^ Syllable = S] -> Syllable = S] ist verboten! weil Phoneme = p und Syllable = S nicht aus der selben/parallelen Ebene sind daher: [[Syllable = S ^ #Phoneme=p] -> Syllable = S] 7.2 ^ und -> und & (Domination und Nachfolge und Boolean &) Woerter, die mit einem Schwa beginnen: [Text!=x ^ Phoneme = @ & Start(Text, Phoneme)=1] Ein wortanfangs m in einer starken Silbe, der vor einem I kommt [[Phoneme = m & Start(Word, Phoneme)=1 -> Phoneme=I] ^ Syllable=S] das selbe aber wir moechten dessen Text haben: [[[Phoneme = m & Start(Word, Phoneme)=1 -> Phoneme=I] ^ Syllable=S] ^ #Text!=x] Der Text aller dreisilbigen Woerter, die ein schwa in der ersten Silbe enthaelten; diese dreisilbigen Woerter muessen auch vor ‘the’ kommen Der Text aller dreisilbigen Woerter
  6. Text!=x & Num(Text, Syllable)=3 Schwa kommt in der ersten Silbe vor
  7. Phoneme=@ ^ Start(Word, Syllable)=1 Der Text ist ‘the’
  8. Text = the [1 ^ 2][[1 ^ 2] -> 3] [[Text!=x & Num(Text, Syllable) =3 ^ [Phoneme=@ ^ Start(Word, Syllable)=1]] -> Text=the ] Fragen
  9. m oder n Phoneme die in der Mitte des Wortes vorkommen.
  10. [H] phonetische Segmente, dann irgendein Segment, dann entweder [I] oder [U]. 3. Silben, die nicht in der Mitte des Wortes vorkommen.
  11. Der Text aller Woerter, die zwei Silben enthalten.
  12. Der Text aller akzentuierten Woerter, die ‘the’ folgen
  13. S-Silben die aus 5 Phonemen bestehen
  14. W-Silben, die ein /@/ Phonem enthalten.
  15. Der Text von Woertern, die entweder ein L* oder L+H* Ton-Akzent enthalten.
  16. H* Ton-Akzente von wortfinalen Silben, die in Woertern von drei Silben vorkommen .
  17. Alle Phoneme, die die Phonetic-Einheit [H] dominieren, die in der Silbenanfangsposition vorkommen; und die sich in akzentuierten (S) Woerten befinden. b Antworten
  18. m oder n Phoneme die in der Mitte des Wortes vorkommen. [Phoneme = m | n & Medial(Word, Phoneme)=1]
  19. [H] phonetische Segmente, dann irgendein Segment, dann entweder [I] oder [U]. [ [Phonetic = H -> Phonetic !=x ] -> Phonetic = I | U ]
  20. Silben, die nicht in der Mitte des Wortes vorkommen. [Syllable!=x & Medial(Word, Syllable)=0]
  21. Der Text aller Woerter, die zwei Silben enthalten. [Text!=x & Num(Text, Syllable)=2]
  22. Der Text aller akzentuierte Woerter, die ‘the’ folgen [Text = the -> #Text!=x & Accent = S]
  23. S-Silben die aus 5 Phonemen bestehen [Syllable = S ^ Num(Word, Phoneme)=5]
  24. W-Silben, die ein /@/ Phonem enthalten. [Syllable = W ^ Phoneme=@]
  25. Der Text von Woertern, die entweder ein L* oder L+H* Ton-Akzent enthalten. [Text!=x ^ Pitch_Accent = L* | L+H*]
  26. H* Ton-Akzente von wortfinalen Silben, die in Woertern von drei Silben vorkommen [Pitch_Accent = H* & End(Word, Syllable)=1 ^ Num(Word, Syllable) =3] .
  27. Alle Phoneme, die die Phonetic-Einheit [H] dominieren, die in der Silbenanfangsposition vorkommen; und die sich in akzentuierten (S) Woerten befinden. [[[Phoneme!=x ^ Phonetic = H] ^ Start(Word, Syllable)=1] ^ Accent = S]

Differences and incompatibilities to legacy EMU query language (R package version 4.2)

Function call syntax and result type

TODO

Bundle (utterance) names

emuR package arranges bundles (utterances) in sessions. Converted legacy EMU databases have one default session ‘0000’ containing all bundles. Therefore the ‘utts’ column of all segment lists is prefixed by the session name and starts with ‘0000:’ for example ‘0000:msajc003’.

Interpretation of the hash character ‘#’ in logical AND combined terms

emu

> emu.query('andosl','*','[Text=spring & #Accent=S]')
moving data from Tcl to R
Read 1 records
segment  list from database:  andosl 
query was:  [Text=spring & #Accent=S] 
  labels    start      end     utts
1 spring 2288.959 2704.466 msajc094

> emu.query('andosl','*','[#Text=spring & #Accent=S]')
moving data from Tcl to R
Read 1 records
segment  list from database:  andosl 
query was:  [#Text=spring & #Accent=S] 
  labels    start      end     utts
1 spring 2288.959 2704.466 msajc094

The hash character has no effect to both queries

emuR

> query(andosl,"[Text=spring & #Accent=S]",resultType='emusegs')
segment  list from database:  andosl 
query was:  [Text=spring & #Accent=S] 
  labels    start      end          utts
1      S 2288.975 2704.475 0000:msajc094

Returns the same segment (same item), but with the label of the hashed attribute name

> query(andosl,"[#Text=spring & #Accent=S]",resultType='emusegs')
 Error in query.database.eql.KONJA(database, qTrim) : 
  Only one hashtag allowed in linear query term: #Text=spring & #Accent=S 

EQL2 throws an error here, because to fulfill the request it would be necessary to return each item doubled to get both Text and Accent labels

Probable bugs in legacy EMU EQL

Alternative labels in not equal conditional query

(legacy) emu

> emu.query('ae','*',"[Text!=beautiful|futile ^ Phoneme=u:]")
moving data from Tcl to R
Read 4 records
segment  list from database:  ae 
query was:  [Text!=beautiful|futile ^ Phoneme=u:] 
     labels    start      end     utts
1       new  475.802  666.743 msajc057
2    futile  571.999 1091.000 msajc010
3        to 1091.000 1222.389 msajc010
4 beautiful 2033.739 2604.489 msajc003

I assume that the OR operator ‘|’ is ignored in connection with the not equal operator ‘!=’

emuR

> query(ae,"[Text!=beautiful|futile ^ Phoneme=u:]",resultType='emusegs')
segment  list from database:  ae 
query was:  [Text!=beautiful|futile ^ Phoneme=u:] 
  labels    start      end          utts
1     to 1091.025 1222.375 0000:msajc010
2    new  475.825  666.725 0000:msajc057

Crashes and compiler errors

> emu.query("andosl","*","[[Syllable=W -> Syllable=W] ^ [Phoneme=n-> Phoneme=S]]")
*** stack smashing detected ***: /usr/lib/R/bin/exec/R terminated

 *** caught segfault ***
address 0x726f66ff, cause 'memory not mapped'
> emu.query("andosl","*","[[Syllable=W -> Syllable=W] ^ [Phoneme=n->Phoneme=S]]")
Error in structure(.External("dotTcl", ..., PACKAGE = "tcltk"), class = "tclObj") :
  [tcl] Error in constructor: error compiling query: Expected closing bracket.

The errors are caused by missing blanks around the ‘->’ operator. This query string works well: ‘[[Syllable=W -> Syllable=W] ^ [Phoneme=n -> Phoneme=S]]’

emuR accepts these queries without blanks.

Additional features

emuR accepts also the double equal character string ‘==’ as equal operator.

emuR EQL2 has the capability to query labels by matching regular expressions using the ‘=~’ (match) and ‘!~’ (not match) operators. #### Example

> query(andosl,"Text=~.*tz.*",resultType='emusegs')
segment  list from database:  andosl 
query was:  Text=~.*tz.* 
   labels    start      end          utts
1 blitzed 1586.875 2112.475 0000:msadb081
2 blitzed 1540.225 2022.475 0000:msajc081

John, Tina. 2012. “Emu Speech Database System.” PhD thesis, LMU-Munich.