为了账号安全,请及时绑定邮箱和手机立即绑定

WordMap,文字游戏与语义搜索的交汇点

我们都知道或曾经玩过Wordle,我个人非常喜欢它 ❤️。它是一个有趣的游戏,你有六次机会猜出一个五字母的单词。

WordMap,猜猜每日一词

几周之前,在使用语义搜索功能时(关于RAG的更多信息,请参阅我的之前的文章),一个想法浮现在我脑海中。

假设有一个这样的游戏,类似于Wordle,但不是根据字母的位置来猜词,而是根据你猜测的词语与“每日之词”在意义上的接近程度来猜词?你会输入不同的词,游戏会根据它们与“每日之词”的语义相似度打分,也就是说,游戏会根据它们在含义或上下文中的相关性来打分。目标是用最少的尝试次数猜出“每日之词”,你可以根据需要尝试任意多次。

那就是☀️ WorldMap 诞生了!

为了开发这个游戏,我知道我需要使用用户的输入词和当天的结果词,然后计算这两个词在语义上的相似度。接着将这个相似度归一化为0到100的分数,并通过一个直观的用户界面展示给用户。

整个流程的图示

嵌入部分(较为棘手的部分)

RAG系统如今非常流行,用于根据输入查找相关数据。在这种情况下,问题在于我们处理的是单词,而不是整段文字,因此可参考的背景信息相当有限。

根据输入的粒度,存在两种类型的嵌入:词嵌入和句子嵌入。让我们来看看这两种嵌入有什么不同,正如你可能已经猜到的……我们将使用句子嵌入。你可能在想“为什么!?为什么不直接使用词嵌入,它非常适合这种情况呢?”

好吧,我们之后再谈这个。现在让我们来看看每个的主要特点,不过不会深入细节:我之前对这并不精通,所以我稍微研究了研究;再加上来自ChatGPT和其他大型语言模型的帮助。

词级别嵌入

src: https://www.cs.cmu.edu/~dst/WordEmbeddingDemo/figures/fig5.png 或者保持一致性和清晰性,可以翻译为:来源: https://www.cs.cmu.edu/~dst/WordEmbeddingDemo/figures/fig5.png

词级嵌入将单个词作为向量空间中的向量表示。这些嵌入基于这样的理念:含义相似的词出现在相似的上下文中。

关键特性:

🅰️ 粒度级别:每个词都有自己的词向量,。

📀训练数据: 在一个文本语料库中,每个单词都被用作输入。

⚙️ 它是如何工作的:词汇表中的每个词,都有自己的词向量。

  • 在相似上下文中出现的单词往往具有相似的词向量。
  • 例如,可以通过计算词向量之间的距离(如余弦相似度,cosine similarity)来衡量单词的相似性或类比关系。

示例

     –  –  –  –  –  –  –  –  –  –  –  --  –  –  –  –  –  –  –  –  –  –  –  –   
    | 单词.  | 词嵌入(向量表示)     |  
     –  –  –  –  –  –  –  –  –  –  –  --  –  –  –  –  –  –  –  –  –  –  –  –   
    | king.  | [0.21, -0.45, …, 0.12] |  
    | queen. | [0.19, -0.47, …, 0.14] |  
    | apple. | [0.78, 0.24, …, -0.35] |  
    | … | …  |  
     –  –  –  –  –  –  –  –  –  –  –  --  –  –  –  –  –  –  –  –  –  –  –  –

相似性(国王, 女王) ≈ 0.92

一些流行的实例有Word2Vec,这是来自Google的,还有GloVe。

最大弱点

它有一个很大的弱点。它将每个单词孤立地处理。同一个词在不同的上下文中可能具有不同的含义(例如,“bank”作为金融机构和作为河边的含义不同)。

句子级别嵌入表示

src: https://engineering.talkdesk.com/什么是句子嵌入以及它们为何有用-53ed370b3f35

句子嵌入技术将整个句子(或段落)表示为向量。这些嵌入旨在捕捉整个句子的意义,考虑到词序和词间关系。

关键特性

🅰️ 粒度级别:每个句子都有自己的特征向量。

⚙️ 它是这样运作的: 模型不是为单独的单词学习向量,而是为整个句子学习一个向量。

  • 句子嵌入能够捕捉句子的上下文和含义。
  • 这些嵌入通常用于句子相似度、同义句检测和文档分类等任务。

最大的弱点

相比词嵌入,这需要更多的计算资源,较长的句子可能会失去一些细节。

主要区别

嵌入方式的主要区别

你到底为什么要用句子嵌入技术!

简单的答案在于实现的简洁性。如今大多数容易获得的嵌入模型都是句子嵌入模型,如OpenAI的text-embedding-3-large

我稍微调查了一下如何实现Word2Vec,但没有找到一个简单解决方案,该方案不需要加载一个相当大的预训练模型。我看到在Python中有一些简单的方法可以做到这一点,因为Google已经提供了使用Google新闻数据的自己的预训练模型。同样,为了使Word2Vec模型更加精确,它需要使用大量的数据进行训练。

再次,使用句子嵌入得到的结果并非完全错误,它只是有一些我们将在下文中看到的局限性。

我发现了什么限制?

首先,准确性。这是一个没有被训练来嵌入单个单词,而是嵌入特定上下文中句子的模型。

为了提高一点精确性,并为模型提供更多的上下文,我决定将单词与其在词典中的词义一起嵌入,使其更加精准。此外,这也带来了我之前提到的一个限制,即一个单词可能有多个含义(这也是需要改进的地方),但目前我抓取的是词典中列出的第一个含义。

另一个主要限制也与准确性有关。大多数提供的猜测和语义相近的词汇的余弦相似度得分未达到0.45,这在正常情况下是非常低的。我不想让用户看到一个(以之前的例子为例)45/100的得分,这会让用户觉得离正确答案还很远。相反,我调整了API返回的得分,使其更贴近实际情况。为此,我需要稍微调整一下得分的乘数因子。

我明白,这并不是理想的,即使这个不太准确的模型来计算余弦相似度得分,但这可以在未来改进。

以下是最终结果 🎉

你可以在https://wordmap.vercel.app/访问最终结果。

(演示用减速)

📣 特别感谢 v0,我强烈推荐它,用于从头开始构建用户界面并将你的速度提升十倍。

希望你會喜歡!!🙌

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消