用神经符号 AI 革新 Mocktail 创作:构建个性化系统

195 阅读38分钟

神经符号人工智能是一项强大的技术,它结合了机器学习和符号推理来创建能够进行决策和推理的智能系统。当应用于制作无酒精鸡尾酒时,神经符号 AI 系统可以考虑用于制作无酒精鸡尾酒的所有成分,并确定符合用户偏好的最佳口味组合。使用神经网络,系统可以从以前的选择中学习,并根据他们的口味提出建议。符号推理组件通过从可能的组合列表中删除任何不良或不相容的成分来发挥作用,确保只向用户提供最佳选择。构建用于创建无酒精鸡尾酒的神经符号 AI 系统涉及使用风味组合数据集训练神经网络,并教会系统从用户生成的组合中选择最佳组合。通过正确的方法,神经符号人工智能系统可以帮助用户创建个性化的无酒精鸡尾酒食谱,完全符合他们的口味偏好。

神经符号 AI 是一种人工智能的混合方法,它将机器学习的力量与符号 AI 的类人推理能力相结合。通过使用这种方法,我们可以创建一个系统,它不仅可以从数据中学习,还可以结合人类知识和领域专业知识。本文将提供有关如何使用 Keras 库和基于规则的系统设计和实现神经符号 AI 系统的分步指南。目的是让读者更容易理解和应用这种方法来使用人工智能创建他们的无酒精鸡尾酒食谱。

  1. 深度学习: 这是机器学习的一个子领域,涉及用大量数据训练神经网络以做出准确的预测或分类。
  2. 神经网络: 这是一种机器学习算法,它模仿人脑的结构和功能。
  3. 符号人工智能: 这是指使用逻辑推理和符号表示来解决问题。
  4. 知识表示: 这是将知识编码成计算机可以使用的格式的过程。
  5. 基于规则的系统: 这些系统使用一组 if-then 规则来做出决定或得出结论。
  6. Keras: 这是一个用 Python 编写的高级神经网络 API,旨在实现深度神经网络的快速实验。

神经符号 AI 系统的简单解释

神经符号 AI 系统有两个关键组件:符号推理组件神经网络组件。该系统可以访问包含 100 多种无酒精鸡尾酒配方及其相关成分和风味特征的数据库。当用户请求具有特定风味特征的无酒精鸡尾酒时,系统会从与请求的风味特征相匹配的可用成分中生成三种成分的组合。

这就是符号推理组件发挥作用的地方。该系统使用规则和逻辑来消除不太可能产生好的无酒精鸡尾酒的成分组合。例如,系统可能会删除黑樱桃和酸橙汁的组合,因为它们不太可能相互补充。一旦系统消除了所有不良组合,神经网络就会根据剩余的良好和兼容组合进行训练,以确定最佳的无酒精鸡尾酒配方。通过这种方式,神经符号 AI 系统结合了符号推理和神经网络技术,创建了一个复杂而准确的 mocktail 推荐系统。

想象一下一名侦探试图破案。他们可以获得有关案件的大量证据、证人陈述和其他信息。为了破案,侦探需要同时运用逻辑和直觉。他们需要使用逻辑来排除可能的嫌疑人和没有意义的场景,并使用直觉在看似无关的证据之间建立联系。

同样,神经符号系统结合了两种不同的解决问题的方法——符号推理和神经网络。符号推理组件有助于消除基于规则和逻辑的不太可能的解决方案,而神经网络组件可以使用机器学习技术来查找数据中的模式和连接。通过结合这两种方法,神经符号系统可以为复杂问题创建更准确、更有效的解决方案。

借助用于创建无酒精鸡尾酒的神经符号 AI 系统,您现在可以告别混合成分以制作完美无酒精鸡尾酒所涉及的猜测。再也不会因为没有得到您想要的味道而感到沮丧和失望。相反,准备好享受适合您味蕾的完美混合口味。神经符号系统就像您自己的无酒精鸡尾酒私人助理,可帮助您根据自己的口味偏好制作完美的饮品。所以请坐下来,放松一下,享受您的个性化无酒精鸡尾酒和完美融合的口味!

神经符号 AI 方法的类型(维基百科):

  • Symbolic Neural symbolism是一种在自然语言处理中使用大型语言模型的方法,例如 BERT、RoBERTa 和 GPT-3,其中词或子词标记既是输入又是输出。
  • Symbolic[Neural] 是 AlphaGo 中使用的符号和神经技术的结合,其中象征性地使用蒙特卡洛树搜索,并使用神经技术来评估棋局。
  • Neural|Symbolic使用神经架构将感知数据解释为符号和关系,然后对其进行符号推理。神经概念学习器就是一个例子。
  • Neural:Symbolic → Neural依靠符号推理来创建或标记训练数据,然后由深度学习模型学习。例如,类似 Macsyma 的符号数学系统可用于创建或标记示例,以训练用于符号计算的神经模型。
  • Neural_{Symbolic} 使用从符号规则生成的神经网络。Neural Theorem Prover 是一个示例,它从知识库规则和术语生成的 AND-OR 证明树构建神经网络。逻辑张量网络也属于这一类。
  • Neural[Symbolic] 允许神经模型直接调用符号推理引擎,例如执行动作或评估状态。

在这里,我使用这种方法:Neural:Symbolic → Neural, 我在其中使用符号推理和神经网络生成了良好的组合,以预测最佳组合。

脚步:

  1. 数据收集和用户输入
  2. 过滤匹配成分并生成可能的组合
  3. 符号推理
  4. 神经网络训练与预测
  5. 建议的命名和介绍

所用技术的讨论

神经 AI: 神经符号 AI 系统的神经 AI 部分涉及使用深度学习技术(例如神经网络)来处理和分析数据。该组件负责特征提取、模式识别和预测等任务,通常从大量标记数据中学习。它旨在处理复杂的高维数据,并可以进行高精度的预测或分类。

符号人工智能: 符号人工智能,也称为基于规则的人工智能或专家系统,是人工智能的一个分支,以形式化和逻辑化的方式处理知识的表示和操作。它涉及使用逻辑和符号推理来根据一组规则或知识库做出决策并得出结论。符号人工智能通常用于需要人类专业知识和知识的领域,例如医学诊断或法律推理。

神经网络: 一种以人脑的结构和功能为模型的机器学习算法。它用于模式识别和预测等任务。

第 1 步:数据收集和用户输入

用于创建 mocktail 的神经符号系统的数据集由几列组成:鸡尾酒名称、成分 1、成分 2、成分 3、风味概况 1、风味概况 2 和用户评分。鸡尾酒名称列包含无酒精鸡尾酒的名称,而成分 1、成分 2 和成分 3 列包含用于制作无酒精鸡尾酒的成分的名称。风味概况 1 和风味概况 2 列代表无酒精鸡尾酒的主要和次要风味概况。最后,用户评分列包含尝试过 mocktail 的用户给出的平均评分。

该数据集由 ChatGPT 生成,ChatGPT 是 OpenAI 训练的大型语言模型,基于 GPT-3.5 架构。ChatGPT 基于来自互联网的大量文本数据进行训练,可以生成高质量的自然语言文本。对于这个特定的数据集,ChatGPT 使用其在鸡尾酒配方和风味概况方面的知识来生成无酒精鸡尾酒及其相应成分和评级的列表。

代码:

1.安装和导入必要的库:

该代码导入了几个库来支持这个神经符号 AI mocktail 创建系统的实现。这些库包括 pandas、numpy、TensorFlow、itertools、random 和来自 tensorflow.keras 模型的几个模型。

!pip 安装 tensorflow-gpu== 2.4 .1
# 导入所需的库
import numpy as np # 线性代数
import tensorflow as tf 
import pandas as pd 
import itertools 
import random 
from tensorflow.keras.models import Sequential 
from tensorflow.keras.layers import Dense, Dropout, BatchNormalization 
from keras.callbacks import EarlyStopping 

#输入数据文件位于只读“../input/”目录中
# 例如,运行它(通过单击运行或按 Shift+Enter)将列出输入目录下的所有文件

import os 
for dirname, _, filenames in os.walk( '/kaggle/input' ): 
    for filename in filenames:
        打印(os.path.join(目录名,文件名))

2.导入数据

我有不同版本的数据集,我使用的最终版本是“Mocktail data v5.csv”

# 加载数据集
df = pd.read_csv( '/kaggle/input/mocktail-dataset/Mocktail data v5.csv' ) 
df.head()
  • Mocktail 数据 v5.csv:此数据集包含 mocktails 的名称、使用的三种成分以及两种风味特征(主要和次要)

3.预处理数据

由于这个数据集是由 ChatGPT 生成的,因此这里不需要做很多预处理步骤。但是,有一些重要的检查需要完成,比如检查是否有任何空值、检查是否有重复值等。

#检查任何 空 值
df.isna()。求和()
# 检查重复项
duplicates = df.duplicated() 

# 打印布尔系列的重复项
print (duplicates)

4. 根据用户输入定义风味配置文件

此代码是一个 Python 程序,可帮助用户从选项列表中选择他们喜欢的风味配置文件。该程序向用户显示选项并提示他们通过输入数字来选择他们喜欢的选项。然后,该程序通过根据所选选项分配两个风味配置文件来处理用户的选择。为了让事情变得有点有趣,我将 Python 程序所说的所有语句都与Ryan Reynolds(由 ChatGPT 提供)的语句相似,这看起来很有趣。

如果用户选择选项 4,程序会提示用户输入他们喜欢的口味配置文件。如果输入的风味概况无效,程序会提示用户输入有效的风味概况。如果用户只选择了一种风味概况,则程序会打印所选的风味概况。否则,该程序会推荐互补的风味配置文件并提示用户确认他们是否愿意接受这些推荐。该程序然后打印出首选的风味配置文件和一条确认用户选择的消息。

# 定义可能的风味配置文件
flavors = [ 'Sweet' , 'Sour' , 'Bitter' , 'Refreshing' , 'Creamy' ] 

# Set complimentary flavors
 complementary_flavors={ 
    'Sweet' : 'Sour' , 
    'Sour' : 'Sweet' , 
    'Bitter' : 'Refreshing' , 
    'Refreshing' : 'Bitter' , 
    'Creamy' : 'Refreshing'
 } 

# 向用户显示选项
print (“嘿,那里!我们有一些很棒的选项供您选择。看看这些选项:”)
打印(“1.糖醋-适合那些喜欢经典的人”)
打印(“2.奶油和令人耳目一新——因为生命太短暂了” ) 
print ( “3. 苦涩而令人耳目一新——适合那些喜欢冒险的人” ) 
print ( “4. 风俗——因为你是一个叛逆者,我们喜欢这样!” ) 

# 获取用户的选择
choice = input ( "\n好吧,让我们开始吧。你的毒药是什么?输入你喜欢的选项的编号:") 

# 处理用户的
选择choice == "1" : 
    flavour_1 = "Sweet"
     flavour_2 = "Sour" 
    print ( "啊,经典的酸甜组合。你的味觉很精致!" ) 
    preferred_flavors = [flavour_1, flavour_2] 
elif choice == "2 " : 
    flavor_1 = "Creamy"
     flavor_2 = "Refreshing" 
    print ( "奶油味清爽?你绝对是一个懂得保持凉爽的人!" ) 
    preferred_flavors = [flavour_1, flavor_2] 
elif choice == "3" :
    flavor_1 = "苦"
     flavour_2 ="Refreshing" 
    print ( "又苦又爽?你喜欢危险的生活,不是吗?" ) 
    preferred_flavors = [flavour_1, flavour_2] 
elif choice == "4" : 
    flavour_1 = input ( '第一个风味配置文件是什么你喜欢?(甜、酸、苦、清爽、奶油)' ) 
    if flavor_1不在 口味中: 
        print ( "这不是有效的口味配置文件(至少根据我的程序" ) 
        flavour_1 = input ( "请输入有效的口味配置文件 - 甜、酸、苦、清爽、奶油”)

    flavour_2 = input ( '你想要第二种口味是什么?(甜、酸、苦、清爽、奶油)(如果你只想要一种口味,请留空)' ) if flavour_2 
    : if 
        flavor_2 not in  flavors : 
            print ( "这是一个无效的风味配置文件" ) 
            flavour_2 = input ( "请输入有效的风味配置文件" ) 


        if flavor_1 == flavour_2: 
            print ( "两种口味不能相同。请重试。" ) 
            flavor_2 = input ('Press Enter if you only want one' ) # 如果flavor_1 in [ 'Sweet' , 'Sour' ]而flavor_2不在[ 'Sweet' , 'Sour' ]中,如果

        只有一种口味是甜味或酸味,则推荐互补的风味配置文件:打印( f“您选择了{flavour_1}作为您的第一个口味配置文件。我们建议您将{complementary_flavors[flavour_1]}作为您的第二个口味配置文件。” )             ans = input (
         
            
“如果您想要这个新组合 - 糖醋,请输入‘是’,或者如果您输入任何其他内容,我们将继续您的选择”) if (ans.lower() == 'yes' ) 
            : flavor_2 = complementary_flavors 
                [ flavor_1] 
            else : 
                flavour_2 = flavour_2 
        elif flavour_2 in [ 'Sweet' , 'Sour' ]和flavor_1 not  in [ 'Sweet' , 'Sour' ]: 
            print ( f"You choose {flavour_2}作为你的第二个风味配置文件。我们建议{complementary_flavors[flavour_2]}作为您的第一个口味配置文件。”)
            ans = input( “如果您想要这个新组合 - 糖醋,请输入“是”,或者如果您输入其他任何内容,我们将继续您的选择“)
             if (ans.lower() == 'yes' ):
                flavour_1 = complementary_flavors[flavour_2]
             else :
                flavor_1 = flavour_1
         elif flavor_1 in [ 'Bitter' , 'Refreshing' ]和flavor_2 not  in [ 'Bitter' , '清爽']: 
            print ( f"你选择了{flavour_1}作为你的第一个口味配置文件。我们推荐{complementary_flavors[flavour_1]}作为你的第二个口味配置文件。" ) 
            ans = input ( "如果你想要这个新组合,请输入'是' - Bitter & Refreshing 或如果您键入其他任何内容,我们将继续您的选择" ) 
            if (ans.lower() == 'yes' ): 
                flavor_2 = complementary_flavors[flavour_2] 
            else : 
                flavor_2 = flavour_2 
        elif flavor_2 in [ 'Bitter ' , '令人耳目一新']和flavour_1不在 [ 'Bitter' , 'Refreshing' ]: print ( f"You choose {flavour_2}作为你的第二个口味。我们推荐{complementary_flavors[flavour_2]}作为你的第一个口味。" )             ans = input ( “如果您想要这个新组合 - Bitter & Resfreshing,请输入‘Yes’,或者如果您输入任何其他内容,我们将继续您的选择”) if ( ans.lower ( ) == 'yes' ):                 flavour_1 = complementary_flavors[ flavour_2]否则:
            

            

            
                flavour_1 = flavor_1 
        elif flavour_2 in [ 'Creamy' , 'Refreshing' ]和flavour_1 not  in [ 'Creamy' , 'Refreshing' ]: 
            print ( f"You choose {flavour_2} as your second flavor profile.We recommend {complementary_flavors[flavour_2 ]}作为您的第一个口味配置文件。”)
            ans = input(“如果您想要这个新组合 - 奶油和清爽,请输入“是”,或者如果您输入其他任何内容,我们将继续您的选择“)
            如果(ans.lower() == 'yes' ): 
                flavor_1 = complementary_flavors[flavour_2] 
            else : 
                flavour_1 = flavour_1 

        # Print preferred flavor profiles 
        print ( f"Your preferred flavor profiles are: {flavour_1} and {flavour_2} " ) 
        print ( “定制,嗯?你是喜欢冒险的类型,我喜欢它!” ) 

        preferred_flavors = [flavour_1, flavour_2] 
    else : 
        print ( f"You have chosen only {flavour_1} flavor profile." ) 
        preferred_flavors = [flavour_1]

输出示例:

image.png

(可选)5. 要求用户评价一些无酒精鸡尾酒: 在之前的项目中,该程序使用用户评分作为生成电影推荐的主要输入。但是,对于当前项目,方法有所不同。该程序不会要求用户对无酒精鸡尾酒进行评分,而只会询问他们喜欢的风味概况。这意味着该程序不仅仅依靠用户偏好来生成推荐。相反,它利用 100 多种无酒精鸡尾酒配方的数据集及其各自的风味特征和成分来创建符合用户偏好的组合。这种方法有助于为用户生成更多样化和更准确的无酒精鸡尾酒推荐,因为除了用户的偏好之外,它还考虑了不同成分和口味配置文件之间的兼容性。

第 2 步:过滤匹配成分并生成可能的组合

在完成加载数据集和接受用户偏好的风味概况的初始步骤后,该过程的下一个关键步骤是找到与所选风味概况相匹配的成分,并生成符合用户偏好的无酒精鸡尾酒组合。

为实现这一点,我们首先创建一个列表,列出属于用户选择的一种风味配置文件的无酒精鸡尾酒中存在的所有成分。该列表是通过分析属于所选风味特征的每种无酒精鸡尾酒中使用的成分而编制的。

一旦我们有了完整的成分列表,我们就可以继续生成包含三种成分的所有可能的无酒精鸡尾酒组合。这是通过考虑已编制成分列表中三种成分的每种可能组合来完成的。以这种方式生成无酒精鸡尾酒组合可确保我们探索与所选风味配置文件相匹配的所有可能组合,从而为用户提供广泛的选择范围。

代码

1. 过滤成分以获得首选口味

此代码定义了两个函数,用于根据用户偏好的口味配置文件过滤成分数据集。

has_flavor()函数采用三个参数:(ingredient一个表示成分名称的字符串)、flavor_profiles(一个表示用户首选风味配置文件的字符串列表)和df(一个包含成分数据的 pandas DataFrame)。该函数首先通过检查 的列是否包含来检查 是否ingredient在数据集中。如果成分不在数据集中,则函数返回。如果该成分在数据集中,该函数会计算它在的列中出现的次数。对于出现在列中的每一行,该函数检查该行是否在或df``Ingredient 1``df``ingredient``False``Ingredient 1``df``ingredient``Ingredient 1``Flavor Profile 1``Flavor Profile 2列。如果任何行具有所需的风味配置文件,则该函数返回True。如果没有任何行具有所需的风味配置文件,则该函数返回False

filter_by_flavor()函数有两个参数:(df一个包含成分数据的 pandas DataFrame)和preferred_flavors(一个代表用户首选口味配置文件的字符串列表)。该函数初始化一个空集matching_ingredients来存储与用户偏好口味相匹配的成分。然后,该函数循环遍历每个首选口味preferred_flavors并过滤数据集df,以使用该函数查找具有所需口味的成分has_flavor()。过滤后的数据集存储在变量中filtered_df。然后,该函数matching_ingredients通过使用unique()获取Ingredient 1Ingredient 2Ingredient 3筛选数据集中的列,并使用集合并集 ( |=) 运算符将这些唯一值添加到集合中matching_ingredients。最后,函数返回集合matching_ingredients,其中包含符合用户偏好口味的所有成分。

# 检查成分是否是用户首选风味配置文件的一部分
def  has_flavor ( ingredient, flavor_profiles, df ): 
    # 检查成分是否在数据集中
    if  not df[ 'Ingredient 1' ].isin([ingredient] ). any (): 
        return  False 
    
    # 获取行中成分的数量
    num_ingredients = df.loc[df[ 'Ingredient 1' ] == ingredient].shape[ 0 ] 
    
    # 检查成分是否具有所需的风味特征它
    的列在范围内 ( num_ingredients ): 
        row = df.loc[df['Ingredient 1' ] == ingredient].iloc[i] 
        if  any (flavor in [row[ 'Flavor Profile 1' ], row[ 'Flavor Profile 2' ]] for flavor in flavor_profiles): 
            return  True 
    
    # 如果没有配料具有所需的风味特征,return False 
    return  False 
    
# 返回所有具有用户首选口味的配料
def  filter_by_flavor ( df, preferred_flavors ): 
    matching_ingredients = set () 
    for flavor in preferred_flavors:
        #
        过滤数据集以找到具有所需风味特征的                                   成分, [flavor], df)或                                   has_flavor(x[ 'Ingredient 3' ], [flavor], df) if len (x) > 0 else False , axis= 1 ))]         matching_ingredients |= set (filtered_df[ 'Ingredient 1 ' ].unique()) | 设置(filtered_df[ 
 
   
'成分 2' ].unique()) | 设置(filtered_df[ '成分 3' ].unique())
    返回matching_ingredients

2. 显示具有所需风味特征之一的成分

此代码按首选口味过滤所有可能成分的数据框,然后选择前 60 种匹配成分以用于无酒精鸡尾酒创建过程。不幸的是,由于计算资源紧张,我们不得不将配料的数量限制在 100 种中的 60 种。谁知道制作无酒精鸡尾酒的计算量会如此之大?但不要害怕,借助我们的神经符号 AI 系统,我们仍然能够使用这组有限的原料来制作美味而独特的无酒精鸡尾酒!

#按首选口味过滤数据框,并获取任一口味配置
文件的所有配料匹配成分”,len(matching_ingredients))

示例输出:

image.png

3. 为 mocktail 生成 3 种成分的所有可能组合

此代码从匹配成分集中生成 3 种成分的所有可能组合。它首先初始化一个名为“possible_combinations”的空列表来存储所有组合。然后,它使用嵌套循环迭代匹配成分中 3 种成分的所有可能组合。

生成每个组合后,它会检查它是否已经存在于列表“possible_combinations”中。如果不存在,则将组合附加到列表中。

接下来,它创建一个名为“new_list”的新列表来存储所有唯一组合。它使用 for 循环迭代“possible_combinations”中的每个组合。对于每个组合,它按字母顺序对成分进行排序并将它们转换为元组,然后检查排序后的组合是否已存在于“new_list”中。如果不存在,它将排序后的组合附加到“new_list”。

然后代码打印出所有可能的组合以及所有可能组合的总数。值得注意的是,由于计算资源有限,代码仅使用 60 种成分生成组合。

# 从集合中生成 3 种成分的所有可能组合
possible_combinations = [] 

for i in  range ( len (matching_ingredients)): 
    for j in  range (i+ 1 , len (matching_ingredients)): 
        for k in  range (j+ 1 , len ( matching_ingredients)): 
            combination = [matching_ingredients[i], matching_ingredients[j], matching_ingredients[k]]
            如果组合不在possible_combinations 中:
                possible_combinations.append(combination) 
new_list = [] 
for combination in possible_combinations: 
    sorted_combination = tuple ( sorted (combination))
    如果sorted_combination不在 new_list中
:         new_list.append(sorted_combination) 
        
print () 
print ( "All possible combinations" ) 
print ( "所有可能组合的总数" , len (new_list)) 
print ()

示例输出:

image.png

总共有 34220 种可能的无酒精鸡尾酒组合!

第三步:符号推理

神经符号 AI 系统的符号推理组件包含一组逻辑规则,可根据指定的风味特征检查给定成分组合的可行性。该功能使用一组规则,这些规则结合了有关风味配对和成分之间不相容性的特定领域知识,以及对某些风味特征的约束。通过应用这些规则,该函数可以确定成分的组合是否满足给定的标准。这种类型的符号推理对于需要特定领域知识来执行任务的 AI 系统非常有用,例如食品和饮料推荐系统。

代码

1. 删除所有不良和不兼容的 mocktails 组合的功能

这段代码定义了一个名为is_feasible根据一组规则检查给定的成分组合是否可行。该函数接受两个输入:成分的组合和饮料的风味特征。该函数首先检查组合中的任何成分是否彼此不相容或与给定的风味特征不相容。如果违反任何规则,函数返回 False;否则,函数返回 True。这些规则包括避免可能会在味道上发生冲突的成分组合,避免可能会导致令人不快的质地或凝结的成分组合,以及避免可能导致过度甜味的成分组合。该功能还检查成分组合是否包含与某些风味特征不兼容的特定成分,例如“Jalapeno”

#这是一个根据一组规则检查给定成分组合是否可行的函数。
#该函数有两个输入:成分的组合和饮料的风味特征。
#该函数检查组合中的任何成分是否相互不相容或与给定的风味特征不相容。
#如果违反任何规则,函数返回 False。
#否则函数返回True。

def  is_feasible ( combination, flavor_profile ): 
    # 基于 flavor profiles 
    if ( len (flavor_profile)== 1 ): 
        flavor_1 = flavor_profile[ 0 ] 
    else: 
        flavor_1 = flavor_profile[ 0 ] 
        flavor_2 = flavor_profile[ 1 ] 
        
    creamc = 0     
    
    if ( len (flavor_profile)== 1 ) : 
        if ( flavor_1 == "Creamy" ):
            如果 'Jalapeno' 组合或 'Soda Water' 组合: 
                return  False
             cream = [ 'Yogurt' , 'Coconut Milk' , ' Milk' , 'Coconut Cream' ]成分
            组合:
                if creamc =                     creamc + 1 if (creamc< 1 or creamc> 1 ): return False elif (flavor_1== "Sour" ) :如果' Coconut Cream'组合:return False             notsour = [ 'Yogurt' , “肉桂棒”、“橙皮”、“苹果酒”、“酒浸樱桃”、“八角茴香”、“伍斯特郡酱”、'胡萝卜汁'

             
                     
        
              
                 
, '甜菜根汁' , '百香果汁' , '菠菜' , '可乐' , '覆盆子' , '香草精' , '樱桃糖浆' , '塔巴斯科酱' , '芹菜汁' , '蜂蜜' , '石榴汁' , 'Mango' ]
            对于组合成分:
                    如果成分在notsour 中:如果' Lime Juice'则
                        返回 False不组合或“柠檬汁”不
                  组合或'Grapefruit juice'不组合或'Pomegranate juice'不 组合:如果flavor_profile中'Sweet'返回False :如果' Jalapeno'组合或' Grapefruit Juice'组合或' Lime Juice '组合:返回False if (flavor_1 == "Creamy" or flavor_2 == 'Creamy' ): if 'Jalapeno'在     
                 
        
            
      
              
             
    
     
              组合或组合 中的“苏打水” :返回False             cream = [ 'Yogurt' , 'Coconut Milk' , 'Milk' , 'Coconut Cream' ]对于组合成分:如果成分在奶油中:creamc                     = creamc + 1 if (creamc < 1或creamc> 1 ):返回False if ( len (flavor_profile)== 2 ): #Sweet and Sour if
                 

            
                

             
                 
            
    
        
        ( [ "Sweet" , "Sour" ]中的flavor_1和[ "Sweet" , "Sour" ]中的flavor_2):如果'牛奶'组合或'椰子奶油'组合:返回False如果([ " Creamy"中的flavor_1 , "Refreshing" ] and flavor_2 in [ "Creamy, Refreshing" ]): if 'Grenadine'在组合和“牛奶”中
                
                 
        
                combination: 
                return  False
             cream = [ 'Yogurt' , 'Coconut Milk' , 'Coconut Cream' ]
            成分组合:
                if creaming in cream : 
                    creamc = creamc + 1 
            if (creamc< 1  or creamc> 1 ): 
                return  False 
                
    #去除所有含有无效成分的组合
    # 避免同时使用香蕉和蓝莓,因为它们的味道可能会发生冲突/它们可能会产生令人倒胃口的质地。
    如果 “香蕉” 在combination and ( 'Blueberries'  in combination or  'Raspberries'  in combination): 
        return  False   
    
    # 避免将酒浸樱桃与酸橙汁结合使用,因为它们可能无法很好地互补。
    if  'Maraschino Cherry' 和( ' Lime Juice '组合或' Cola '组合):返回False凝固。如果'牛奶'   
           
    
    
      和('Lime Juice' 组合或 'Pineapple Juice' 组合):
        return  False   # 避免同时使用椰子奶油和
    
    可乐,因为椰子的甜味和奶油味可能不适合可乐的碳酸化。
    if  'Coconut Cream' 组合和('Cola' 组合或 'Simple Syrup' 组合):
        返回 False  
    
    # 避免同时使用菠萝汁或蓝莓和酸橙汁,因为它们的味道可能会发生冲突。
    如果('菠萝汁' 在组合或 “Blueberries” 组合)和 “Lime Juice” 组合:
        return  False   
    
    # 不要同时使用蓝莓和酒浸樱桃或椰子奶油,因为它们的味道可能会发生冲突。
    if  'Blueberries' 组合和( ' Maraschino Cherry' 组合或 'Coconut Cream' 组合):返回False # 避免将简单的糖浆和糖与椰子奶油一起使用,因为甜味可能会变得过于强烈。如果'椰子奶油'
           
    
    
      和(“简单糖浆” 组合或 “糖 ”组合):
        返回 错误  if ( 'Blueberries'组合或'Maraschino Cherry'组合或r'Simple Syrup'组合)和'Sugar'组合:return False #避免同时使用可乐和酸橙汁,因为它们的味道可能会发生冲突。如果( '
    
    
          
           

    
     组合或 'Lemon' 组合)和 'Lime Juice' 组合: return 
        False  #
    
    删除任何同时包含菠萝汁和蔓越莓汁的组合,因为它们具有强烈而独特的味道,当组合时可能会发生冲突并且过于强烈。
    如果 'Pineapple Juice''Cranberry Juice'组合:返回False #Remove 任何包含雪碧和糖的组合,因为雪碧已经变甜了,添加更多的糖可能会使饮料太甜。如果'Sprite '组合  
         
    
    
      和(“Club Soda” 组合或 “Sugar” 组合):
        return  False # 删除包含奇异果汁和
    
    葡萄柚片的任何组合,因为口味可能无法相互补充。
    如果('Kiwi Juice' 组合或 'Banana' 组合或 'Mango' 组合)和'Grapefruit Slice'组合:return False #删除包含芒果和薄荷叶/蓝莓的任何组合,因为味道可能会发生冲突. 如果  
         
    
    
     'Mango' 组合和('Mint Leaves' 组合或  'Blackberries' 组合):
        返回 False # 删除任何
    
    包含苹果酒和椰奶的组合,因为味道可能会发生冲突。
    如果(“Apple Cider” 组合或 “Raspberry” 组合或 “Cinnamon Stick” 组合)和“ Coconut Milk”组合:返回False  
         
    
    # 去除包含柑橘和奶制品的组合,因为它们会凝结。
    如果(' Grapefruit' 组合或 'Lemon' 组合或'  Lime' 组合或 'Orange' 组合或'  Tangerine' 组合)和(' Milk'组合或' Yogurt'组合):返回False #去除同时包含薄荷和肉桂棒的组合,因为它们的味道会发生冲突/它们可能会产生奇怪的余味。   
         
    
    
     'Mint Leaves' 的组合和('Cinnamon Stick' 的组合或 'Star Anise' 的组合):
        返回 False 
    
    # 删除包含奇异果汁和苹果酒的组合,因为它们可能会产生粗糙的质地。
    如果 'Kiwi Juice''Apple Cider'组合在一起:返回False # 任何组合都不应包含鼠尾草叶和黑樱桃。如果' Sage Leaves'与( ' Maraschino Cherry'  
         
    
    
       combination or  'Tonic Water'  in combination): 
        return  False 
    
    # 避免混合 Lime Juice 和 Simple Syrup, Lime。
    如果 'Lime juice'' Simple Syrup, Lime'组合:返回False # 任何组合都不应包含墨西哥胡椒和覆盆子。如果'Jalapeno'与' Raspberries'组合:返回False # 避免将 Maraschino Cherry或Grenadine 与 Lime Juice 或 Mint Leaves 组合。如果('马拉奇诺樱桃'  
         
    
    
        
         
    
    
     组合或'Grenadine'组合)和('Lime Juice'组合或' Mint  Leaves'组合):返回False # 避免将菠萝汁或椰子奶油与苏打水或柠檬水混合。如果(“菠萝汁”组合或“椰子奶油”组合)和(“苏打水”组合或“柠檬水”组合):返回False    
         
    
    
          
         
    
    # 避免将番茄汁与菠萝汁、椰子奶油、柠檬水、伍斯特沙司、塔巴斯科辣酱油、樱桃糖浆或可乐混合。
    如果“ 番茄汁” 组合和(“菠萝汁”组合或“椰子奶油”组合或“柠檬水”组合或“伍斯特沙司”组合或“塔巴斯科酱”组合或“樱桃糖浆”组合或'可乐'组合:             
         错误
    
    # 避免将伍斯特郡辣酱油、塔巴斯科辣酱油、樱桃糖浆或可乐与菠萝汁、椰子奶油或柠檬水混合。
    如果(“伍斯特沙司” 组合或 “塔巴斯科酱” 组合或 “樱桃糖浆” 组合或“可乐 ” 组合)和(“菠萝汁”组合或“椰子奶油”组合或“柠檬水”组合):返回假     
         
    
    # 不要将柠檬水与葡萄柚汁、橙汁或蔓越莓汁混合。
    如果 'Lemonade' 组合和(' Grapefruit Juice' 组合或 ' Orange Juice' 组合或 'Cranberry Juice' 组合):
        返回 False 
    
    # 不要将橙汁与葡萄柚汁、菠萝汁或蔓越莓汁组合。
    如果 '橙汁' 组合和('葡萄柚汁' 组合或 '菠萝汁''Cranberry Juice' 的组合):
        返回 False 
    
    # 避免将芒果或糖与任何其他成分混合。
    if ( 'Mango' 组合或 'Sugar' 组合) and  len (combination) > 1 : 
        return  False 
    
    # 不要将薰衣草与果汁或苏打混合。
    如果 ' Lavender' 组合和('Juice' 组合或 'Soda' 组合):
        返回 False
    
    # 不要将墨西哥胡椒与葡萄柚汁、菠萝汁或柠檬水混合。
    如果 'Jalapeno' 组合和(' Grapefruit Juice' 组合或 ' Pineapple Juice' 组合或 'Lemonade' 组合):
        返回 False # 不要将鼠尾草
    
    叶与菠萝汁、葡萄柚汁或柠檬水组合。
    如果(' Sage Leaves' 组合)和('Pineapple Juice' 组合或 'Grapefruit Juice''Lemonade' 的组合):
        返回 False 
    
    # 不要将肉桂棒或八角茴香与果汁或苏打水混合。
    if ( 'Cinnamon Stick' 的组合或 'Star Anise' 的 组合)和( 'Juice' 的组合或 'Soda' 的组合): 
        return  False 
    
    # 检查组合是否包含葡萄柚汁和苏打水或百香果汁。
    如果 'Grapefruit Juice' 和('Club Soda'在组合中 combination or  'Passionfruit Juice'  in combination): 
        return  False 
    
    # 检查组合是否包含 Apple Cider 和 Cherry。
    if  'Apple Cider''Cherry'的组合:返回False # 避免同时使用香蕉和蓝莓或覆盆子。如果“香蕉”组合和(“蓝莓”组合或“覆盆子”组合):返回False  
         
    
    
         
         
    
    # 不要在没有青柠汁的情况下混合墨西哥胡椒糖浆或苏打水。
    如果(“Jalapeno Syrup” 组合或 “Club Soda” 组合)和 “Lime Juice” 不 组合:
        return  False #
    
    任何组合都不应包含以下成分中的一种以上。
    ingredients_to_check = [ 'Ginger Ale' , 'Passionfruit Juice' , 'Sage Leaves' , 'Maraschino Cherry' , 
                            'Jalapeno' , 'Raspberries' , 'Simple Syrup' ,, 
                            'Soda Water' , 'Vanilla Extract' ] 
    found_ingredients = [ingr for ingr in ingredients_to_check if ingr in combination] 
    if  len (found_ingredients) > 1 : 
        return  False 
    
    # 检查互斥成分
    mutually_exclusive_pairs = [( "Honey" , "Mint叶子”),(“蜂蜜”,“橙皮”),(“蜂蜜”,“菠菜”),
                                (“薄荷叶" ,"橙皮" ), ( "薄荷叶" , "菠菜" ), ( "薄荷叶" , "龙舌兰糖浆" ), 
                                ( "甜菜根汁" , "苏打水" ), ( "苏打水" , "椰子水" ), ( "香蕉" , "橙皮" ), 
                                ( "橙皮" , "菠菜" ), ( "菠菜" , "香蕉" ),( '龙舌兰糖浆' ,'糖' ), ( '龙舌兰糖浆' , '雪碧' ),
                                ( '龙舌兰糖浆' , '蜂蜜' ),( '龙舌兰糖浆' , '简单糖浆, 青柠' ), ( '菠萝汁' , '雪碧' ), 
                                ( '菠萝汁' , '简单糖浆, 青柠' ), ( '葡萄柚汁' , '雪碧' ), 
                                ( '葡萄柚汁' , '简易糖浆, 酸橙' ), ( '牛奶' , '椰子奶油' ),
                                ( '青柠汁' , '苏打水'), ( '酸橙汁' , '汤力水' ), 
                                ( '鼠尾草叶' , '苏打水' ), ( '鼠尾草叶' , '汤力水' ), 
                                ( '菠菜' , '苏打水' ), ( '菠菜' , '滋补水' ), ( '墨西哥胡椒糖浆' , '蜂蜜' ), 
                                ( '墨西哥胡椒糖浆' , '蒲公英根茶' ),( '蜂蜜' , '蒲公英根茶' ),
                                ( '草莓' , '蒲公英根茶' ),( '牛奶' , '柠檬水' ), ( '牛奶' , '柠檬汽水' ), 
                                ( '牛奶' , '苏打水' ), ( '牛奶' , '雪碧' ), ( '牛奶' , '汤力水' ), 
                                ( '椰奶' , '柠檬水' ), ( '椰奶' , '柠檬酸橙汽水' ),( “椰奶”,“苏打水”),
                                ( '椰奶' , '雪碧' ), ( '椰奶' , '汤力水' ), ( '菠萝汁' , '柠檬水' ), 
                                ( '菠萝汁' , '柠檬酸橙汽水' ), ( '菠萝果汁' , '苏打水' ), ( '菠萝汁' , '雪碧' ), 
                                ( '菠萝汁' , '汤力水' ), ( '橙汁' ,'牛奶' ), ( '橙汁' ,'椰奶' ), 
                                ( '橙汁' , '柠檬水' ), ( '橙汁' , '柠檬酸橙汽水' ), ( '橙汁' , '苏打水' ), 
                                ( '橙汁' , '雪碧' ), ( '橙汁' , '汤力水' ), ( '柠檬青柠汽水' , '牛奶' ), 
                                ( '柠檬青柠汽水' , '椰奶' ), ( '柠檬酸橙苏打水''菠萝汁'),('柠檬水' , '牛奶' ), 
                                ( '柠檬水' , '椰奶' ), ( '柠檬水' , '菠萝汁' ), ( '汽水' , '牛奶' ), 
                                ( '汽水' , '椰子牛奶' ), ( '苏打水' , '菠萝汁' ), ( '雪碧' , '牛奶' ), 
                                ( '雪碧' , '椰奶' ),( '雪碧''菠萝汁'),('Tonic Water' , 'Milk' ), 
                                ( 'Tonic Water' , 'Coconut Milk' ), ( 'Tonic Water' , 'Pineapple Juice' )] 
    for pair in mutually_exclusive_pairs: 
        if pair[ 0 ] in combination and pair[ 1 ]组合:如果('Cucumber Juice'组合和' 
            Grapefruit  Juice '组合)或\
    
       
           (“黄瓜汁” 组合和“ 柠檬汁” 组合)或\            (“葡萄柚汁”组合和“葡萄柚片”组合)或\            (“葡萄柚汁”组合和“柠檬汁”组合)或\            ( 'Grapefruit Juice''Orange Juice'的组合组合)或\
   
   
   
           (“柠檬汁” 组合和 “橙汁” 组合)或\            (“柠檬汁”组合和“桃茶”组合)或\(           “柠檬汁”组合和“酸橙汁”组合)或\            (“柠檬汁”组合和“西瓜汁”组合):返回False
   
   
   
             
    
    # 如果以上条件都不满足,则组合可行
    return  True 

def  get_feasible_combinations ( possible_combinations, preferred_flavors ): 
    feasible_combinations = [] 
    for combination in possible_combinations: 
        if is_feasible(combination, preferred_flavors): 
            feasible_combinations.append(combination) 
    return feasible_combinations 


possible_combinations = get_feasible_combinations(new_list, preferred_flavors) 
print () 
print ( "可行组合" ) 
print ("所有可能组合的总数" , len (possible_combinations)) 
print ()

示例输出:

image.png

所以我们最终从总共 34220 种组合中得到了 3787 种可能的无酒精鸡尾酒。这是可能的,因为只有某些成分(如椰子奶油、椰奶、牛奶和酸奶)可以用来制作奶油无酒精鸡尾酒。对于没有奶油味的其他组合,这个数字肯定会更高。但是,可以使用更多规则甚至使用高级知识图来进一步改进和简化此过程。

第 4 步:神经人工智能

我们的神经符号 AI 系统的神经部分是使用在 Keras 中实施的深度学习模型构建的。我们使用顺序 API 定义模型架构,并添加几个具有不同数量神经元和激活函数的密集连接层。第一层有 256 个具有整流线性单元 (ReLU) 激活函数的神经元,并将我们训练数据的形状作为输入。然后我们添加一个比率为 0.3 的 dropout 层来减少过度拟合。我们对另外三层重复此模式,减少神经元数量,直到我们到达输出层,该层具有单个神经元和线性激活函数。

为了防止训练过程中的过度拟合,我们使用耐心为 10 的提前停止技术。这意味着如果我们的模型的验证损失连续 10 个时期没有改善,训练将提前停止。

最后,我们使用均方误差损失函数、Adam 优化器和平均绝对误差度量来编译我们的模型。然后,我们在我们的训练数据上训练我们的模型,批量大小为 32,最多 100 个时期,同时监控早期停止的验证损失。

代码

1.将数据集转换成神经网络需要的格式

此代码用于为神经网络准备数据,该神经网络可根据食材和风味概况预测用户对食物食谱的评分。这里有一个详细的解释:

前几行代码创建了数据集中存在的所有成分的列表。df是一个 pandas 数据框,包含有关各种食谱的信息。ingredients_1ingredients_2ingredients_3分别是每个食谱中的第一、第二和第三种成分的列表。循环for使用列表理解从数据框中提取这些值。这三个列表连接成all_ingredients,它被转换为一个集合以删除重复项。然后代码定义了一个可能的风味特征列表,包括“酸味”、“甜味”、“苦味”、“奶油味”和“清爽味”。

row_to_input()函数被定义为将一行数据帧转换为可以输入神经网络的输入格式。该函数采用单个参数,row它是一个包含有关单个食谱信息的 pandas 系列。该函数首先初始化两个空列表ingredientsflavors,其中将填充食谱的成分及其相应的风味配置文件。

然后该函数循环遍历食谱中的前三种成分(如果存在),提取每种成分并使用检查它是否不是 NaN pd.notna()。如果存在该成分,则将其添加到列表中ingredients。该函数然后检查该成分是否存在于 中all_ingredients。如果是,该函数将创建一个新数据框ingredient_df,其中仅包含成分出现在三个成分列之一中的那些行。然后该函数提取第一个匹配行的风味概况ingredient_df,并将其转换为单热编码(一个二进制向量,指示成分中存在哪些可能的风味概况)。此单热编码附加到flavors列表中。如果该成分不存在于中all_ingredients,则flavors列表附加了一个零向量(表示不存在任何可能的风味特征)。

最后,该函数检查是否有任何成分被添加到列表中ingredients。如果没有添加成分,函数返回None。否则,flavors列表被展平为一维 numpy 数组并返回。

然后,代码使用df.sample()和将数据集拆分为训练集和测试集df.drop()。训练集包含原始数据集中 80% 的行,使用固定种子随机选择以实现可重复性。

train_inputs变量是通过row_to_input()使用列表理解应用于训练集的每一行来创建的。然后将生成的 numpy 数组列表垂直堆叠成一个二维数组。该train_targets变量是通过从训练数据框中提取User Rating列作为 numpy 数组来创建的。

# 获取所有成分的列表    
ingredients_1 = [i for i in df[ 'Ingredient 1' ]] 
ingredients_2 = [j for j in df[ 'Ingredient 2' ]] 
ingredients_3 = [k for k in df[ 'Ingredient 3' ]] 
all_ingredients = ingredients_1 + ingredients_2 + ingredients_3 
all_ingredients = set (all_ingredients) 

# 定义口味列表 flavors_list
 = [ 'Sour' , 'Sweet' , 'Bitter' , 'Creamy' , '清爽'] 

# 将数据集输入转换为神经网络格式
def  row_to_input ( row ): 
    ingredients = [] 
    flavors = [] 
    for i in  range ( 1 , 4 ): 
        ingredient = row[ f'Ingredient {i} ' ] 
        if pd. notna(ingredient): 
            ingredients.append(ingredient)
            如果成分在all_ingredients 中:
                ingredient_df = df[df[[ 'Ingredient 1' , 'Ingredient 2' , 'Ingredient 3']].eq(成分)。any ( 1 )] 
                flavor = ingredient_df[ 'Flavor Profile 1' ].values[ 0 ] 
                flavors.append([ 1  if f in flavor else  0  for f in flavors_list]) 
            else : 
                flavors.append([ 0 ] * len ( flavors_list))
    如果 len (ingredients) == 0 : 
        return  None 
    else : 
        return np.array(flavors).flatten()

# 将数据拆分为训练和测试数据集
train_df = df.sample(frac= 0.8 , random_state= 123 ) 
test_df = df.drop(train_df.index) 

# 将训练和测试数据帧转换为 TensorFlow 输入
train_inputs = [row_to_input(row ) for _, row in train_df.iterrows() if row_to_input(row) is  not  None ] 
train_inputs = np.vstack(train_inputs) 
train_targets = np.array(train_df[ 'User Rating' ])

2. 创建一个神经网络模型来预测 mocktails 的用户评分

此代码正在实施一个神经网络模型,以根据其成分和风味概况预测无酒精鸡尾酒的用户评分。

首先,代码使用 Keras Sequential 模型定义模型架构。该模型由几个具有 ReLU 激活函数的 Dense 层和后面的 Dropout 层组成,以防止过度拟合。最终输出层有一个线性激活函数,因为目标是预测一个连续的数值(用户评分)。

然后代码编译模型,将损失函数指定为均方误差,将优化器指定为 Adam。该模型使用提前停止在训练数据上进行训练,以防止过度拟合。

接下来,代码评估训练模型在测试数据上的性能,计算测试损失。

然后代码提示用户输入新鸡尾酒的风味特征。神经网络模型用于预测用户对三种成分的每种可能组合的评分,这些组合与用户提供的风味特征相匹配。最高预测评级连同产生它的成分组合一起保存。最后,代码打印出最佳成分组合及其相应的评级。

# 定义模型架构
model = Sequential() 
model.add(Dense( 256 , activation= 'relu' , input_dim=train_inputs.shape[ 1 ])) 
model.add(Dropout( 0.3 )) 
model.add(Dense( 128) , activation= 'relu' )) 
model.add(Dropout( 0.3 )) 
model.add(Dense( 64 , activation= 'relu' )) 
model.add(Dropout( 0.3 )) 
model.add(Dense( 32 , 激活= 'relu' )) 
model.add(Dense( 1 , activation= 'linear' ))
# 定义提前停止
early_stopping = EarlyStopping(monitor= 'val_loss' , patience= 10 ) 
# 编译模型
model. compile (loss= 'mean_squared_error' , optimizer= 'adam' , metrics=[ 'mae' ]) 
# 使用提前停止训练模型
model.fit(train_inputs, train_targets, epochs= 100 , batch_size= 32 , validation_split= 0.2 , callbacks =[early_stopping]) 

# 评估模型在测试数据上的性能
test_inputs = [row_to_input(row) for _, row in test_df.iterrows()如果row_to_input(row)不是 None  ]
 test_inputs = np.vstack(test_inputs) 
test_targets = np.array(test_df[ 'User Rating' ]) 
test_loss = model.evaluate(test_inputs, test_targets) 
print ( ' Test loss:' , test_loss ) 

# 从用户那里获取新鸡尾酒的风味概况
new_flavors = [flavour_1,flavour_2] 

# 使用神经网络预测每个可能的 mocktail 的用户评分
best_rating = 0
 best_combination = possible_combinations[ 0 ] 
for combination in possible_combinations:
    # 将风味概况转换为与训练数据相同的格式
    new_input = row_to_input({ 'Ingredient 1' : combination[ 0 ], 'Ingredient 2' : combination[ 1 ], 'Ingredient 3' : combination[ 2 ], 'Flavor Profile 1' : new_flavors[ 0 ], 'Flavor Profile 2' : new_flavors[ 1 ]}) 
    # 将转换后的输入传递给训练好的模型
    rating = model.predict(np.array([new_input]))[ 0 ][ 0 ] 
    if rating > best_rating: 
        best_rating = rating
        打印(评级)
        best_combination = combination 
        print(组合)
        
print(“最佳组合:”,best_combination)
print(“最佳评级:”,best_rating)

示例输出:

image.png

image.png

第 5 步:提出建议

此代码正在创建一个无酒精鸡尾酒配方生成器,它根据用户的首选口味和可用成分生成一个随机的无酒精鸡尾酒名称。它具有三个单词词典:flavor_profile_adjectives、flavor_nouns 和 ingredient_nouns。

flavor_profile_adjectives 是一个有五个键的字典,每个键代表一种风味特征——甜、酸、苦、清爽和奶油。这些值是描述风味特征的形容词列表。

flavor_nouns 也是一个字典,有五个代表风味特征的键。这些值是与风味概况相关联的名词列表。

ingredient_nouns 是一个字典,其中成分名称作为键,相关名词列表作为值。

该程序从作为输入提供的口味列表中获取用户的首选口味,以及可用于制作无酒精鸡尾酒的成分。对于每种成分,它会检查 ingredient_nouns 字典中是否有任何相关名词用于相应的风味特征。如果有,它会将这些名词添加到该风味概况的 flavor_nouns 字典中。

然后,它从 flavor_profile_adjectives 和 flavor_nouns 词典中的适当列表中随机选择一个形容词和名词来创建 mocktail 名称。最后,它打印无酒精鸡尾酒名称和制作它所需的成分。

# 命名无酒精鸡尾酒
flavor_profile_adjectives = { 
    "Sweet" : [ 'Delicious' , 'Divine' , 'Heavenly' , 'Luscious' , 'Yummy' , 'Scrumptious' , 'Tasty' , 'Delectable' ], 
    "Sour" : [ 'Tangy' , 'Zesty' , 'Sour' , 'Puckery' , 'Sharp' , 'Lively' , 'Fresh' ], 
    "Bitter" : [ 'Bold', '强劲' , '强烈' ,'Earthy' , 'Smokey' , 'Complex' , 'Strong' ], 
    "Refreshing" : [ 'Cool' , 'Crisp' , 'Invigorating' , 'Refreshing' , 'Revitalizing' , 'Soothing' ], 
    "Creamy" : [ 'Creamy' , 'Smooth' , 'Silky' , 'Luscious' , 'Velvety' , 'Rich' ] 
} 

flavor_nouns = { 
    "Sweet" :[ '极乐' , '暗恋' , '梦想' ,'Delight' , 'Sweetheart' ], 
    "Sour" : [ 'Lemonade' , 'Patch' , 'Spark' , 'Sensation' , 'Tingle' ], 
    "Bitter" : [ 'Bite' , 'Kick' , 'Symphony ' ], 
    "清新" : [ '微风' , '飞溅' , '寒冷' , '清爽' , '复苏' , '回春' , '雾' ],
    “奶油”:[ '梦想''诱惑''Refresher' ] 
} 

ingredient_nouns = { 
  “酸橙汁”:[ “Tang”,“Zest”,“Citrus”,“Limeade” ],
  “橙汁”:[ “Citrus”,“Orange Blossom”,“Sunny Delight”,“果汁” ],
  “龙舌兰糖浆”:[ “甜味剂”,“花蜜”,“仙人掌糖浆”,“蜂蜜” ],
  “柠檬酸橙苏打水”:[ “嘶嘶声”, “柑橘泡泡” , “雪碧” , “碳酸水”], 
  "Grenadine" : [ "Pomegranate Syrup" , "Sweet Red" , "Ruby" , "Red Syrup" ], 
  "Maraschino Cherry" : [ "Red Cherry" , "Sweet Cherry" , "Luxardo" , "Cherry Bomb " ], 
  "菠萝汁" : [ "热带" , "菠萝天堂" , "多汁菠萝" , "菠萝快车" ], 
  "椰子奶油" : [ "椰子奶油" ,《椰奶》、《椰子天堂》、《椰梦》],
  “菠萝片”:[ “菠萝矛”,“菠萝角”,“菠萝圈”,“菠萝装饰” ],
  “薄荷叶”:[ “新鲜薄荷”,“凉薄荷”,“薄荷枝”,"Minty" ], 
  "Soda Water" : [ "Sparkling Water" , "Bubbly" , "Fizzy" , "Carbonated Water" ], 
  "Strawberries" : [ "Berry" , "甜心” 、“草莓园”、“红美味” ]、
  “简单糖浆”:[ “甜糖浆”,“糖浆”,“透明糖浆”,“甜味剂” ],
  “番茄汁”:[ “Tomatoey”,“咸味果汁”,“血腥玛丽混合”,“Spicy V8 " ], 
  "Worcestershire Sauce" : [ "Worcestershire" , "Savory Sauce" , "Umami Sauce" , "Bold Sauce" ], 
  "Tabasco Sauce" : [ "Hot Sauce" , "麻辣酱" , "胡椒酱" , "辣酱" ],
  “樱桃糖浆”:[ “樱桃汁”,“甜樱桃”,“樱桃可乐”,“樱桃炸弹” ],
  “可乐”:[ “苏打水”,“可乐”,“经典”,“碳酸饮料” ],
  “柠檬水”:[ “柠檬汁”,“柠檬清新剂”,“柑橘冷却器”,“柠檬飞溅” ],
  “苏打水”:[ “苏打水”,“起泡”,“汽水”,“碳酸水” ],
  “桃子糖浆”:[“桃子汁”、“甜桃子”、“桃子绒毛”、“桃子” ]、
  “桃子片”:[ “桃子楔”、“桃子配菜”、“桃子热”、“完美桃子” ]、
  “黑莓” : [ "Berry" , "Blackberry Bliss" , "Sweetheart" , "Dark Delight" ], 
  "Blueberries" : [ "Berry" , "Blueberry Burst" , "Sweetheart", "Blue Crush" ], 
  "香蕉" : [ "香蕉奶油" ,“Banana Split”、“Banana Blast”、“Sweetheart” ]、
  “Yogurt”:[ “Creamy”、“Smoothie”、“Yogurt Delight”、“Yogurt Parfait” ]、
  “Honey”:[ “Sweetener”、“Nectar ” " , "液体黄金" , "蜂巢" ], 
  "菠菜" : [ "绿叶蔬菜" , "绿色善良" , "大力水手的最爱" , "健康蔬菜"],
  “蔓越莓汁”:[ “酸果汁”,“蔓越莓爆破”,"Cranberry Splash" , "Ruby Red" ], 
} 

flavor_profile = preferred_flavors[ 0 ] 
ingredients = best_combination 

adjectives = flavor_profile_adjectives[flavor_profile] 
for ingredient in ingredients: 
    if ingredient in ingredient_nouns: 
        nouns = ingredient_nouns[ingredient] 
        flavor_nouns[flavor_profile].extend(名词)

形容词= random.choice(形容词)
名词= random.choice(flavor_nouns [flavor_profile])

mocktail_name = f“ {adjective}  {noun} Mocktail”
        
如果best_combination是 not  None : 
    print ( f"I suggest {mocktail_name}。这是由{best_combination[ 0 ]}、{best_combination[ 1 ]}和{best_combination[ 2 ]}组成的。享受吧!" ) 
else : 
    print ( "Sorry,我们找不到满足您喜好的无酒精鸡尾酒。” )

输出示例:

image.png

结论

总之,开发用于预测最佳无酒精鸡尾酒组合的神经符号 AI 系统是人工智能领域的一项重大成就。通过将神经网络与符号推理相结合,该系统可以过滤掉不良组合,并为用户提供最兼容、最美味的 mocktail 组合。这项创新有可能彻底改变饮料行业,并激发神经符号人工智能领域的进一步研究和发展。总的来说,这个系统的创建代表了朝着更先进、更高效的人工智能系统迈出的有希望的一步,这些系统可以做出复杂的决策和判断,同时仍然考虑到人类的偏好和品味。