如何从 AIML 中的特定 mapped_value 获取 key_value?

How can I get a key_value from a specific mapped_value in AIML?

我开始学习一些 AIML,但我现在很迷茫。

我正在使用地图,但我想不出解决这个问题的算法。 假设我有一张地图,其中存储了我朋友的头发颜色。类似于 Markus:brown.

现在假设我想获取所有头发颜色为棕色的名字。类似于:

人类:你能告诉我头发颜色是棕色的朋友的名字吗?

机器人:马库斯·凯文·托马斯

编辑:做一些研究我发现许多用户创建了对面地图,我的意思是,person:hair、hair:person。但是如果我有相同颜色的不同人,地图 return 会是第一个吗?我怎样才能得到所有这些?

我该怎么做?

提前致谢。

除非像这样设置地图,否则您无法使用地图真正做到这一点:

[
    ["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>

现在我们已经设置了数据库,让我们看看如何使用它。我想知道,"Who has (whatever coloured) hair"。我们可以用这个类别来做到这一点:

<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>

所以在您的查询 "Who has brown hair" 中,谓词 "searchfor" 设置为 "brown",因为这就是我们正在搜索的内容。

然后我们使用 标签设置一个名为 "XCHECKMATCH" 的临时类别,它查看数据库中每个条目中 "hair" 的值并将其与 "searchfor"。如果匹配,将其添加到列表中。

设置完成后,我们将扫描数据库并显示结果。

人类 - 谁有棕色头发?
机器人 - 结果:
马库斯
托马斯

作为对此的高级使用,我们还可以检查多个项目。例如,"Who has black hair and likes burgers?"

<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" 变为 "black burgers"。我们设置了一个名为 "found" 的新谓词(数据库已找到)。这由“ ”组成,我们再次扫描数据库以查看匹配项:

人类 - "Who has black hair and likes burgers?"
机器人 - 结果:Kevin
大卫

我经常使用这种数据库方法来回答像 "Is a train faster than a snail?" 这样疯狂的问题。为这个例子创建类别没有意义,因此数据库方法更有用且更易于维护。

如果这超出了您的需要,您将需要使用这样的地图和类别:

[
    ["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>

希望这是有道理的。如果您需要我,很乐意澄清任何事情。