介绍
如果您喜欢在旅行时外出就餐或尝试新食物,找到合适的餐厅可能是一项艰巨的任务。无论是饮食限制还是仅仅是偏好,人们发现自己从一家餐馆到另一家餐馆都没有成功。我们开发了一种神经网络,可以仅根据餐厅名称对餐厅的菜系进行分类。从语言学的角度来看,该网络是一个有趣的例子,说明算法如何找到名称及其潜在含义之间的模式。该博客深入探讨了我们的模型如何工作的技术细节以及我们获得的结果。无论您是美食爱好者还是寻求新餐饮选择的旅行者,该神经网络都可以为常见问题提供独特的解决方案。
数据
我们使用的数据集来自 Kaggle,一个允许用户查找和发布数据集的网站。我们使用的数据集是通过抓取著名旅游网站 TripAdvisor 获得的,其中包含 31 个欧洲城市的餐厅信息。爬虫是一个 Python 脚本,它遍历了餐厅的列表页面并完成了一个原始数据集,然后将其整理用于进一步分析目的。它包括 125,433 家餐厅,每家餐厅都有各种信息。我们只关注餐厅的名称和菜肴类型。
工艺流程
数据提取和清理
我们通过从数据集中提取必要的信息来开始我们的技术流程。这涉及从 Kaggle 数据集中提取餐馆的名称和菜肴类型。任何没有包括菜系类型的餐厅都被删除了。删除所有包含非 ASCII 字符的行,删除标点符号和停用词,然后将单词转换为小写。此外,我们决定过滤掉除 18 种美食类型之外的所有美食描述符。我们排除了出现在大多数餐厅美食类型中的描述符,例如“素食友好”和“欧洲”。我们只考虑了每家餐厅的美食类型描述符中的第一个值。这使我们在最初的 125,433 家餐厅中剩下 28,215 家。
18种精选菜系
Word2Vec
Word2Vec 由用于生成词嵌入的模型组成,这是一种语言建模技术,用于将词映射到实数向量,这些实数向量表示具有多个维度的向量空间中的词或短语。我们使用 Word2Vec 将数据集中的单词转换为向量形式。在创建我们自己的 Word2Vec 模型时,我们遇到了一个问题,即该模型只能向量化我们给它的单词。为了解决这个问题,我们决定使用谷歌预训练的 Word2Vec 模型。该模型已在 Google News 上进行过训练,包含 300 维向量,用于 300 万个单词和短语。
在使用这个预训练模型对我们的数据进行矢量化后,我们对数据值进行了平均。这意味着对于具有多个单词名称的餐厅,名称的值将是单词的平均值。对于美食类型,这不会产生差异,因为无论如何我们只考虑描述符中的第一个值。
Word2Vec 图(Nikhil Birajdar)
分类模型
我们使用了一个顺序模型,它适用于简单的层堆栈,其中每一层都有一个输入张量和一个输出张量。我们使用 Sigmoid 和 ReLU 激活函数测试了我们的模型,发现使用 ReLU 激活函数提高了模型的准确性。这可能与我们最初不适合我们的模型这一事实有关。我们还尝试使用长短期记忆 (LSTM) 网络,但这并没有提高我们的准确性。我们目前的模型由五层 ReLU 激活函数组成,训练准确率为 18.98%。
Logistic Sigmoid 与 ReLU(SAGAR SHARMA)
我们的分类模型
结果
“加州比萨厨房”试验
我们用一个特定的餐厅名称测试了我们训练有素的模型:“California Pizza Kitchen”。我们选择这家餐厅是因为它在欧洲没有分店,迫使模型使用新的输入,并且它有一个相当简单的理想输出:披萨。
在将原始数据输入保存的模型之前,我们以与处理原始数据相同的方式处理该餐厅名称。最初的试验产生了诸如“pesce”、“comida”、“fresca”之类的结果,以及其他看似西班牙语或意大利语以及无关的结果。对于我们的第二次试验,我们决定改变模型中的层数和这些层的大小,使中间层更大。这导致了实际食物的英语单词,如“veggie_pita”和“Spaghetti Bolognese”。
“加州比萨厨房”试验 1 结果
“加州披萨厨房”试验 2 结果
有了这些结果,我们改变了在模型中寻找相似词的方式。我们不是简单地在 Word2Vec 模型中找到与向量“美食”相似的词,而是在找到 Word2Vec 比较之前找到矩阵 Y 的行之间的余弦相似度,该矩阵由我们选择的 18 种美食类型和美食组成。幸运的是,这似乎将我们的结果标准化为披萨类型。不幸的是,对于我们输入的大多数其他餐厅,它似乎导致“披萨”或“寿司”。
“加州比萨厨房”试验 3 结果
进一步发展
通过添加更多节点和层继续调整我们的模型后,我们能够达到大约 20% 的准确度。我们对这个结果感到满意,因为它比仅仅为所有条目猜测一种美食(平均准确率约为 5%)要高。训练完模型后,我们在欧洲和美国的多家餐厅测试了结果,看看出现了什么模式。该模型非常擅长对名称中包含食物描述符的餐厅进行分类,例如“Frankie's Pizza”和“Democratic Coffee”:
该模型似乎还将某些词(例如“Tavern”和“Diner”)标记为英国或美国,这通常是准确的:
我们还有其他一些成功的例子,如下所示:
但是,我们也有一些完全错误地分类:
Moto 是田纳西州纳什维尔的一家意大利餐厅
Saloniki Greek 是一家希腊连锁餐厅,位于马萨诸塞州波士顿
Taste of India 是一家位于佛蒙特州米德尔伯里的印度餐厅
我们认为这可能与餐厅名称的主观性有关。通常,这些名称不一定与所提供的食物相关,尤其是在欧洲各地的语言各不相同的情况下。还有一些没有经常出现在预测中的美食类型,包括“快餐”、“酒吧”和“中东”。这可能是因为这些标签很难与我们包含的其他一些标签区分开来。例如,酒吧和酒馆的名称可能相似,并且由于印度位于亚洲,因此印度食品可以归类为亚洲食品。在处理我们的数据时,我们也只考虑列出的第一个标签来简化我们的模型。这可能会使这些结果变得复杂,因为一些餐馆可能被标记为“酒吧”和“酒馆”或“亚洲”和“印度”。
我们遇到的另一个问题是 Word2Vec 模型本身。尽管该模型是在 300 万个单词上训练的,但仍有餐厅名称不在模型中,对于这些,我们无法进行预测。
不包含在 Word2Vec 模型中的名称示例
结论
虽然我们模型的准确性并不完全符合我们的期望,但这个项目让我们对许多城市、美食和语言的餐厅名称的复杂性有了一些了解。不幸的是,仅仅根据名称来确定餐厅可以提供什么服务并不容易,因为这些可能受到许多因素的影响,包括文化传统、历史参考,甚至流行趋势。所以现在我们仍然坚持检查菜单来决定去哪里吃饭。虽然我们可以将这个结论归咎于我们的模型,但我们相信它更像是对人类创造力的证明。