如何从 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>
希望这是有道理的。如果您需要我,很乐意澄清任何事情。
我开始学习一些 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",因为这就是我们正在搜索的内容。
然后我们使用
设置完成后,我们将扫描数据库并显示结果。
人类 - 谁有棕色头发?
机器人 - 结果:
马库斯
托马斯
作为对此的高级使用,我们还可以检查多个项目。例如,"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>
希望这是有道理的。如果您需要我,很乐意澄清任何事情。