Как я могу получить key_value из указанного c mapped_value в AIML? - PullRequest
0 голосов
/ 23 февраля 2020

Я начинаю изучать AIML, и в этот момент я совершенно растерялся.

Я работаю с картами, но не могу придумать алгоритм для решения этой проблемы. Допустим, у меня есть карта, на которой я храню цвет волос моих друзей. Что-то вроде Маркуса: коричневый.

Теперь, допустим, я хочу получить все имена, у которых цвет волос коричневый. Что-то вроде:

Человек: Не могли бы вы назвать имена моих друзей, чьи волосы коричневого цвета?

Робот: Маркус Кевин Томас

Редактировать: Я нашел какое-то исследование что многие пользователи создают открытую карту, я имею в виду, лицо: волосы, волосы: человек. Но если бы у меня были разные люди с одинаковым цветом, вернула бы карта первую? Как я могу получить их все?

Как я могу это сделать?

Заранее спасибо.

1 Ответ

1 голос
/ 23 февраля 2020

На самом деле вы не можете сделать это, используя карты, если не настроите карту, подобную этой:

[
    ["brown", "Markus, David, Thomas"], 
    ["black", "Stephen, Paul"], 
    ["blonde", "Simon"]
]

Это может быть много ручной работы и не очень практично. Когда я работаю с такими простыми базами данных, я настраиваю каждую запись в своей собственной категории:

<category>
    <pattern>XFRIEND 1</pattern>
    <template>
        <think>
            <set name="friend">Markus</set>
            <set name="hair">brown</set>
            <set name="eyes">blue</set>
            <set name="likes">pizza</set>
        </think>
    </template>
</category>

<category>
    <pattern>XFRIEND 2</pattern>
    <template>
        <think>
            <set name="friend">Kevin</set>
            <set name="hair">black</set>
            <set name="eyes">brown</set>
            <set name="likes">burgers</set>
        </think>
    </template>
</category>

<category>
    <pattern>XFRIEND 3</pattern>
    <template>
        <think>
            <set name="friend">Thomas</set>
            <set name="hair">brown</set>
            <set name="eyes">green</set>
            <set name="likes">burgers</set>
        </think>
    </template>
</category>

<category>
    <pattern>XFRIEND 4</pattern>
    <template>
        <think>
            <set name="friend">David</set>
            <set name="hair">black</set>
            <set name="eyes">blue</set>
            <set name="likes">burgers</set>
        </think>
    </template>
</category>

, а затем создаю категорию, которая будет сканировать и проверять каждую запись:

<category>
    <pattern>XSCANFRIENDSDATABASE</pattern>
    <template>
        <think>
            <set name="list">Results:<br/></set>
            <srai>XFRIEND 1</srai>
            <srai>XCHECKMATCH</srai>
            <srai>XFRIEND 2</srai>
            <srai>XCHECKMATCH</srai>
            <srai>XFRIEND 3</srai>
            <srai>XCHECKMATCH</srai>
            <srai>XFRIEND 4</srai>
            <srai>XCHECKMATCH</srai>
        </think>
        <get name="list"/>
    </template>
</category>

Теперь у нас есть настроенная база данных, давайте посмотрим, как мы можем ее использовать. Я хочу знать, "Кто имеет (независимо от цвета) волосы". Мы можем сделать это с помощью этой категории:

<category>
    <pattern>WHO HAS * HAIR</pattern>
    <template>
        <think>
            <set name="searchfor"><star/></set>

            <learn> 
            <category>   
            <pattern>XCHECKMATCH</pattern>   
            <template>
                <condition name="hair">
                    <li><value><get name="searchfor"/></value>
                    <set name="list"><get name="list"/><br/><get name="friend"/></set>
                    </li>
                </condition>     
            </template> 
            </category> 
            </learn>

        </think>
        <srai>XSCANFRIENDSDATABASE</srai>
    </template>
</category>

Итак, в вашем запросе «У кого коричневые волосы» предикату «searchfor» присвоено значение «коричневый», поскольку именно это мы и ищем.

Затем мы используем тег , чтобы установить временную категорию под названием «XCHECKMATCH», которая просматривает значение «hair» в каждой записи в нашей базе данных и сравнивает его с «searchfor». Если он совпадает, добавьте его в список.

После настройки мы просканируем базу данных и отобразим результаты.

Человек - у кого каштановые волосы?
Бот - Результаты:
Маркус
Томас

В качестве расширенного использования мы также можем проверить наличие более одного предмета. Например, «Кто имеет черные волосы и любит гамбургеры?»

<category>
    <pattern>WHO HAS * HAIR AND LIKES *</pattern>
    <template>
        <think>
            <set name="searchfor"><star/> <star index="2"/></set>

            <learn> 
            <category>   
            <pattern>XCHECKMATCH</pattern>   
            <template>
                <think><set name="found"><get name="hair"/> <get name="likes"/></set></think>
                <condition name="found">
                    <li><value><get name="searchfor"/></value>
                    <set name="list"><get name="list"/><br/><get name="friend"/></set>
                    </li>
                </condition>     
            </template> 
            </category> 
            </learn>

        </think>
        <srai>XSCANFRIENDSDATABASE</srai>
    </template>
</category>

В этом примере searchfor становится «черными гамбургерами». Мы создали новый предикат под названием «найдено» (то, что база данных нашла). Это состоит из " "и еще раз мы сканируем базу данных, чтобы увидеть, что соответствует:

Человек -" Кто имеет черные волосы и любит гамбургеры? "
Бот - Результаты: Кевин
Дэвид

I регулярно используйте этот метод базы данных для ответов на сумасшедшие вопросы, такие как «Поезд быстрее улитки?». Нет смысла создавать категории для этого примера, поэтому метод базы данных гораздо полезнее и проще в обслуживании.

Если это за пределами того уровня, который вам нужен, вам нужно будет использовать карту и такую ​​категорию, как эта:

[
    ["brown", "Markus, David, Thomas"],
    ["black", "Stephen, Paul"], 
    ["blonde", "Simon"]
]

<category>
    <pattern>WHO HAS * HAIR</pattern>
    <template>
        <map name="hair"><star/></map>
    </template>
</category>

Однако это далеко не так гибко при использовании структуры стиля базы данных.

Человек - у кого каштановые волосы?

Бот - Маркус, Дэвид, Томас

Если вы планируете сделать это, вы можете просто сделать:

<category>
    <pattern>WHO HAS BROWN HAIR</pattern>
    <template>
        Markus, David, Thomas.
    </template>
</category>

Надеюсь, что это имеет смысл. Рад что-нибудь прояснить, если понадоблюсь.

...