На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD, nsh
  
> Помогите составить SRGS-грамматику (нужен оператор if)
    Добрый день!

    Я пытаюсь составить грамматику вида : <тип объекта> <уровень> <имя объекта> , но никак не могу понять как))

    Грамматику <тип объекта> <уровень> я сделал:

    ExpandedWrap disabled
      <?xml version="1.0" encoding="utf-8" ?>
      <grammar version="1.0" xml:lang="ru-RU" mode="voice" root="objects"
       xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0">
       
        <rule id="objects">
          <one-of>
            <item>тип1</item>
            <item>тип2</item>
          </one-of>
          <ruleref uri="Levels.grxml"/>
          <item repeat="0-1"> баллов </item>
        </rule>
       
      </grammar>


    ExpandedWrap disabled
      <?xml version="1.0" encoding="utf-8" ?>
      <grammar version="1.0" xml:lang="ru-RU" mode="voice" root="levels"
       xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0">
        <rule id="levels" scope="public">
          <one-of>
           <item>5</item>
            <item>10</item>
            <item>150</item>
            <item>20</item>
          </one-of>
        </rule>
      </grammar>


    Далее, я могу составить список "имен объектов", которые удовлетворяют условиям фильтра : тип1 5, тип1 10, тип2 15 и тд.

    Но как мне эти отфильтрованные грамматики вставить?

    То есть мне нужна проверка- if(тип1 и 10)-то ruleref grType1_10 и тд.

    Как ее сделать?
    Спасибо.
      В грамматиках one-of это и есть if.

      ExpandedWrap disabled
         <rule id="objects">
           <one-of>
             <rule>
                <item>тип1</item>
                <one-of>
                  <item> объект1 </item>
                  <item> объект2 </item>
                  <item> объект3 </item>
                </one-of>
             </rule>
             <rule>
                <item>тип2</item>
                <one-of>
                  <item> объект4 </item>
                  <item> объект5 </item>
                  <item> объект6 </item>
                </one-of>
             </rule>
           </one-of>
           <rule id="levels">
             ...
           </rule>
           <item repeat="0-1"> баллов </item>
         </rule>


      В чём проблема-то?
        Цитата nsh @
        В грамматиках one-of это и есть if.


        Тут фишка в том, что мне нужно как-то отфильтровать по уровню.
        У меня получился только такой вариант: составить список отфильтрованных по правилу слов (тип и уровень 10 , тип1 и уровень 20 и тд)- и запихнуть в грамматику.


        ExpandedWrap disabled
          <rule id="objects">
              <one-of>
                <item>тип1 </item>
                <item>тип2</item>
              </one-of>
              <ruleref uri="Levels.grxml"/>
              <item repeat="0-1">баллов</item>
              <one-of>
                <item>
                  <ruleref uri="тип1_уровень_10.grxml"/>
                </item>
                <item>
                  <ruleref uri="тип1_уровень_20.grxml"/>
                </item>
                  <item>          
                   <ruleref uri="тип2_уровень_10.grxml"/>
                  </item>
                </one-of>
           
            </rule>


        Вопрос такой- как движок будет переходить по таким правилам?

        Например: распознал слово "тип1"- затем "уровень 10" ,затем "слово,которое находится в грамматике тип1_уровень_10" ,а затем он последовательно проходит по грамматикам "тип1_уровень_10", "тип1_уровень_20" и ищет совпадени?Так?

        Я к тому,можно ли сделать так, что при распознавании первых фраз -"тип1 уровень 10"- движок бы заходил сразу в грамматику "тип1_уровень_10"?
        П.С. пользуюсь Microsoft Speech Platform 11.

        Спасибо.
          Цитата
          Я к тому,можно ли сделать так, что при распознавании первых фраз -"тип1 уровень 10"- движок бы заходил сразу в грамматику "тип1_уровень_10"?


          Можно, но для этого сложное правило где сначала идёт "уровень 10" потом "тип1 уровень 10" нужно поместить внутрь one-of, а не после него. one-of можно вложенные делать, как я написал в примере выше.
            Цитата nsh @
            Можно, но для этого сложное правило где сначала идёт "уровень 10" потом "тип1 уровень 10" нужно поместить внутрь one-of, а не после него. one-of можно вложенные делать, как я написал в примере выше.



            Хи.Я тут немного доработал вашу грамматику и у меня такое получилось:

            ExpandedWrap disabled
              <?xml version="1.0" encoding="utf-8" ?>
              <rule id="objects">
              <one-of>
                  <rule>
                         <item>тип1></item>
                            <one-of>
                             <rule>
                                  <item>уровень_10</item>
                                  <one-of> объект1_который_входит_в_тип1_уровень10</one-of> //или ruleref на нужную грамматику со списком подготовленных слов?
                              </rule>
                              <rule>
                                 <item>уровень_20</item>
                                 <one-of>объект1_который_входит_в_тип1_уровень_20</one-of>
                              </rule>
                            </one-of>
                  </rule>
                  <rule>
                      <item>тип2</item>
                          <one-of>
                              <rule>
                                  <item>уровень10</item>
                                  <one-of>объект1_который_входит_в_тип2_уровень10</one-of>//или ruleref?
                               </rule>
                               <rule>
                                  <item>уровень_20</item>
                                  <one-of>объект1_который_входит_в_тип2_уровень20</one-of>
                                </rule>
                          </one-of>
                   </rule>
              </one-of>
              </rule>


            Такую грамматику Вы имели ввиду?

            П.С. - добавил конструкцию one-of в самом начале грамматики.
            То есть мы выбираем один из типов (тип1,тип2).
            Затем когда пользователь сказал тип-мы выбираем из правил тип_уровень_10,тип_уровень_20.
            И уже если пользователь сказал фразу: тип1 уровень 10 - то идем в соответствующий список слов и пытаемся распознать там.
            Сообщение отредактировано: Simplevolk -
              П.С. запустил такую грамматику- микрософтовский движок не принял ее.
              В состав тулов входит GrammarValidator.exe - он мне пишет,что "под элементов one-of не может быть элемента rule@".
                Цитата Simplevolk @
                В состав тулов входит GrammarValidator.exe - он мне пишет,что "под элементов one-of не может быть элемента rule@".


                Поместите item внутри one-of, а внутри item уже сложное правило.


                ExpandedWrap disabled
                  <?xml version="1.0" encoding="utf-8" ?>
                  <rule id="objects">
                  <one-of>
                    <item>
                    <rule>
                           <item>тип1></item>
                               <one-of>
                                <item>
                                <rule>
                                     <item>уровень_10</item>
                                     <one-of> объект1_который_входит_в_тип1_уровень10</one-of>
                                 </rule>
                                 </item>
                   
                               </one-of>
                    </rule>
                    </item>
                  </one-of>
                  </rule>
                  Уф... Пришлось допилить эту грамматику так,чтобы валидатор пропускал ее.
                  У меня получилась такая штука:

                  ExpandedWrap disabled
                    <?xml version="1.0" encoding="utf-8" ?>
                    <grammar version="1.0" xml:lang="ru-RU" mode="voice" root="objects"
                     xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0">
                      <rule id="objects">
                        <one-of>
                          <item>
                            <ruleref uri="#Type1"/>
                          </item>
                          <item>
                            <ruleref uri="#Type2"/>
                          </item>
                        </one-of>
                      </rule>
                     
                     
                      <rule id="Type1">
                        <item>Тип1</item>
                        <one-of>
                          <item>
                            <ruleref uri="#Type1_Level10"/>
                          </item>
                          <item>
                            <ruleref uri="#Type1_Level20"/>
                          </item>
                        </one-of>
                      </rule>
                     
                      <rule id="Type2">
                        <item>тип2</item>
                        <one-of>
                          <item>
                            <ruleref uri="#Type2_Level10"/>
                          </item>
                        </one-of>
                      </rule>
                      
                      
                      <rule id="Type1_Level10">
                        <item>10 уровень</item>
                        <one-of>
                          <item>объект 10-го уровня(и это не ММОРПГ!)</item>
                        </one-of>
                      </rule>
                      
                       <rule id="Type1_Level20">
                        <item>20-й уровень</item>
                        <one-of>
                          <item>объект 20-го уровня</item>
                        </one-of>
                      </rule>
                      
                      <rule id="Type2_Level10">
                        <item>10 уровень</item>
                        <one-of>
                          <item>объект 10-го уровня</item>
                        </one-of>
                      </rule>
                      
                    </grammar>



                  Вопрос- получается, когда пользователь скажет фразу - тип1 уровень10 объект_10го_уровня - то движок зайдет в правило Type1,затем в Type1_Level10 и уже там он пойдет по вариантам?

                  Это мне нужно для того, чтобы в каждой грамматике нижнего уровня - Type1_Level10 - количество элементов было максимальным для данного движка (1500-2000 слов). Соответственно, на каждую грамматику по 2к слов- а нижних грамматик у меня будет достаточное количество.
                  И общая мощность будет вычисляться как 2000слов*N?

                  Такой финт пройдет?
                  П.С. просто надо распознать достаточно большое количество наименований из БД.
                  Спасибо.
                    Цитата
                    Такой финт пройдет?


                    Чего стесняться-то? Попробуйте и узнаем.
                      nsh попробовал. Грамматика работает.
                      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0370 ]   [ 14 queries used ]   [ Generated: 21.05.24, 13:21 GMT ]