Имена собственные с определителями в GF

Я пытаюсь создать в GF следующее предложение: Jack wants to listen to a Taylor song Но как я вижу в RGL PN -> NPэто единственное решение получить имя собственное. Как заставить GF выводить имя собственное с определителем и объектом.

Также мне интересно, почему в RGL PN называется имя собственное, а не имя собственное?

1 ответ

Решение

Синтаксическая функция слова «Тейлор» в этом предложении - модификатор слова «песня» . Таким образом, группировка - это не «Тейлор», а «песня» с Тейлором в качестве модификатора:

  • песня
  • хорошая песня
  • песня Тейлора

Этот ответ не обязательно работает на других языках, кроме английского. Но есть много других структур, которые можно использовать прямо из RGL, например, "песня NP".

Ограниченный набор художников

Если у вас есть фиксированный набор художников, вероятно, проще всего обмануть и превратить их в прилагательные на английском языке. Вот пример:

      abstract Song = {
  flags startcat = Sentence ;
  cat
    Sentence ;
    Person ;
    Artist ;

  fun
    wantToListen : Person -> Artist -> Sentence ;
    Jack : Person ;
    Taylor, Ariana : Artist ;
}

Для английской версии мы делаем линкат в AP. Это работает на английском языке, потому что прилагательные не перегибаются, поэтому это будет просто одна строка.

      concrete SongEng of Song = open SyntaxEng, ParadigmsEng, LexiconEng in {

  lincat
    Sentence = Utt ;
    Person = NP ;
    Artist = AP ; -- cheat in English

  lin
    -- : Person -> Artist -> Sentence ;
    wantToListen person artist =
      let artistsSong : CN = mkCN artist song_N ;
          listenToSong : VP = mkVP listen_V2 (mkNP a_Det artistsSong) ;
       in mkUtt (mkS (mkCl person want_VV listenToSong)) ;

    -- : Person
    Jack = mkNP (mkPN "Jack") ;

    -- : Artist
    Taylor = mkAP (mkA "Taylor") ;
    Ariana = mkAP (mkA "Ariana") ;
}

Работает по назначению:

      $ gf SongEng.gf
…
Song> gt | l -treebank
Song: wantToListen Jack Ariana
SongEng: Jack wants to listen to an Ariana song

Song: wantToListen Jack Taylor
SongEng: Jack wants to listen to a Taylor song

Обратите внимание: если у ваших групп есть собственная статья, вы увидите, что Джек хочет послушать песню The Beatles.

Художник как модификатор против субъекта

Вы всегда можете сделать более сложный линкат для, вот пример. Мы добавим TheBeatlesкак в абстрактном синтаксисе. Я также добавляю еще одну функцию, где художник - это не просто модификатор, а субъект.

      abstract Song2 = Song ** {
  flags startcat = Sentence ;
  fun
    TheBeatles : Artist ;
    isGood : Artist -> Sentence ;
}

А вот и бетон. Я не использую повторно оригинальный SongEng, потому что мне нужно изменить линкат Artist.

      concrete Song2Eng of Song2 = open SyntaxEng, ParadigmsEng, LexiconEng in {

  lincat
    Sentence = Utt ;
    Person = NP ;
    Artist = LinArtist ; -- {independent : NP ; modifier : AP}

  lin
    -- : Person -> Artist -> Sentence ;
    wantToListen person artist =
      let artistsSong : CN = mkCN artist.modifier song_N ;
          listenToSong : VP = mkVP listen_V2 (mkNP a_Det artistsSong) ;
       in mkUtt (mkS (mkCl person want_VV listenToSong)) ;

    -- : Artist -> Sentence
    isGood artist = mkUtt (mkS (mkCl artist.independent good_A)) ;

    -- : Person
    Jack = mkNP (mkPN "Jack") ;

    -- : Artist
    Taylor = mkArtist "Taylor" ;
    Ariana = mkArtist "Ariana" ;
    TheBeatles = mkArtist "The Beatles" "Beatles" ;

  oper
    LinArtist : Type = {independent : NP ; modifier : AP} ;
    mkArtist = overload {
      mkArtist : Str -> Str -> LinArtist = \thebeatles, beatles -> {
        independent = mkNP (mkPN thebeatles) ;
        modifier = mkAP (mkA beatles)
        } ;
      mkArtist : Str -> LinArtist = \taylor -> {
        independent = mkNP (mkN taylor) ;
        modifier = mkAP (mkA taylor)
        }
      } ;
}

И вот результат.

      Song2> gt | l
Ariana is good
Taylor is good
The Beatles is good
Jack wants to listen to an Ariana song
Jack wants to listen to a Taylor song
Jack wants to listen to a Beatles song

Если вы хотите превратить "Битлз" во множественное число, мы можем это сделать. Добавьте еще один экземпляр перегрузки mkArtist, где вы даете ему уже построенный NP. Затем вы можете указать, что «Битлз», на самом деле, во множественном числе.

        oper
    mkArtist = overload {
      mkArtist : Str -> Str -> LinArtist = … ; -- same as before
      mkArtist : Str -> LinArtist = … ; -- same as before
      mkArtist : NP -> AP -> LinArtist = \thebeatles,beatles -> {
        independent = thebeatles ;
        modifier = beatles
        }
  lin
    TheBeatles =
      mkArtist
        (mkNP aPl_Det (mkN "The Beatles" "The Beatles"))
        (mkAP (mkA "Beatles")) ;
      } ;

И это дает вам следующий результат:

      Song2> l isGood TheBeatles 
The Beatles are good

Произвольные струны как художники

Наконец, если вы хотите использовать произвольные строки в качестве художников, вы можете использовать строковые литералы. Для independentполе, он отлично работает: в модуле Symbolic есть функции, которые принимают строковый литерал в NP.

Однако для modifierполе, вам нужно выйти за пределы API---вот инструкции, как сделать это немного менее небезопасным способом, но все еще не гарантируется стабильность, если внутреннее устройство RGL когда-либо изменится.

Не говоря уже об отказе от ответственности, вот последнее расширение.

      abstract Song3 = Song2 ** {
  flags startcat = Sentence ;
  fun
    StringArtist : String -> Artist ;
}

И бетон. На этот раз мы расширяем Song2Eng, потому что нет необходимости менять линкаты.

      concrete Song3Eng of Song3 = Song2Eng ** open SyntaxEng, LexiconEng, SymbolicEng in {
  lin
    -- : String -> Artist ;
    StringArtist string = {
      independent = symb string ; -- symb : String -> NP, from SymbolicEng
      modifier = <mkAP good_A : AP> ** {s = \\_ => string.s} -- hack
      } ;
}

Посмотрим, как это работает:

      Song3> p "Jack wants to listen to a skhdgdjgfhjkdfhjsdf song"
wantToListen Jack (StringArtist "skhdgdjgfhjkdfhjsdf")

Song3> p "9ortge94yhjerh90fpersk is good"
isGood (StringArtist "9ortge94yhjerh90fpersk")

Просто предупреждение: он отлично работает для линеаризации строк с пробелами, так что это нормально:

      Song3> l isGood (StringArtist "Spice Girls")
Spice Girls is good

Но вы не можете разбирать строковые литералы с пробелами.

      Song3> p "Backstreet Boys is good"
The parser failed at token 2: "Boys"
Другие вопросы по тегам