语义文本搜索
本文介绍了如何使用OpenAI的文本嵌入来进行语义文本搜索。通过将查询嵌入与文档嵌入进行比较,可以很高效地在数据集中搜索相关文本。本文展示了如何使用余弦相似度计算来搜索文本,并展示了搜索结果。该方法可以大大提高搜索效率并降低成本。
正文
我们可以通过简单地嵌入我们的搜索查询,然后找到最相似的评论,以非常有效的方式以非常低的成本在语义上搜索所有评论。 数据集在 Obtain_dataset Notebook 中创建。
import pandas as pd import numpy as np datafile_path = "data/fine_food_reviews_with_embeddings_1k.csv" df = pd.read_csv(datafile_path) df["embedding"] = df.embedding.apply(eval).apply(np.array)
请记住对文档(在本例中为评论)使用文档嵌入引擎,对查询使用查询嵌入引擎。 请注意,这里我们只是比较查询嵌入和文档嵌入的余弦相似度,并显示 top_n 个最佳匹配项。
from openai.embeddings_utils import get_embedding, cosine_similarity # 搜索特定产品的评论 def search_reviews(df, product_description, n=3, pprint=True): product_embedding = get_embedding( product_description, engine="text-embedding-ada-002" ) df["similarity"] = df.embedding.apply(lambda x: cosine_similarity(x, product_embedding)) results = ( df.sort_values("similarity", ascending=False) .head(n) .combined.str.replace("Title: ", "") .str.replace("; Content:", ": ") ) if pprint: for r in results: print(r[:200]) print() return results results = search_reviews(df, "美味的豆子", n=3)
好买:我喜欢这些豆子。 它们是真空密封的,丰满而湿润。 会推荐它们用于任何用途。 我亲自将它们分开并放入一些伏特加酒中制成香草精。 百胜! 牙买加蓝豆:非常适合烘焙的咖啡豆。 我们家刚刚又买了 5 磅用于更多的烘烤。 烘烤成深褐色的豆子时味道浓郁,酸度适中 美味!:我喜欢这种白豆调味料,它给豆子带来浓郁的味道我就是喜欢它,我的婆婆不知道这个 Zatarain 的品牌,现在她正在托盘不同的调味料
results = search_reviews(df, "全麦面食", n=3)
美味又快捷的意大利面:百味来全麦意大利面配蔬菜卤汁味道鲜美,而且有一种极好的厚实的蔬菜卤汁。 我只希望有更多。 如果你没有挨饿或 sooo good: 味道真好。 物有所值。 我男朋友讨厌小麦面食,但喜欢这个。 厨师快,味道好。我喜欢这个品牌,并开始购买更多他们的意大利面。 散装最好。 方便:喜欢即食意大利面的想法,仅此一点,这款产品就受到了好评。 意大利面是全麦的,所以这是一个很大的优势,而且它实际上是有嚼劲的。 蔬菜海员 我们可以轻松地搜索这些评论。 为了加快计算速度,我们可以使用一种特殊的算法,旨在通过嵌入进行更快的搜索。
results = search_reviews(df, "不良交货", n=1)
很棒的产品,很差的送货:咖啡很棒,我是回头客。 这次的问题是 UPS 递送。 他们把箱子留在车道中间我的车库门前 正如我们所见,这可以立即带来很多价值。 在这个例子中,我们展示了能够快速找到交付失败的例子。
results = search_reviews(df, "被宠坏的", n=1)
非常失望:嗨,我对过去收到的 ONE 椰子水发货感到非常失望。 3 个盒子漏水,椰子水变质了。谢谢。
results = search_reviews(df, "宠物食品", n=2)
美食:我的猫王唯一会吃的干粮。 有助于防止毛球。 良好的包装。 及时到达。 卖宠物食品的朋友推荐的。 猫喜欢它:我的 7 只猫喜欢这种食物,但对人类来说有点难吃。 在深色肉汤中游动的鲭鱼片。 它被标榜为"完整"食物,包含胡萝卜、豌豆和意大利面。
评论 (0)