在 Google Cloud BigQuery 中存储句子嵌入

Posted

技术标签:

【中文标题】在 Google Cloud BigQuery 中存储句子嵌入【英文标题】:Storing sentence embeddings in Google Cloud BigQuery 【发布时间】:2021-08-22 00:24:45 【问题描述】:

我正在寻找一种在 Google 的 BigQuery 中存储由 (T5) 等语言模型生成的嵌入的方法。

embedding 采用 Numpy 数组或张量的形式。

我找到了 3 种方法:

    TFRecord,将其写入 TFRecord 文件并存储到云存储中 将 numpy 数组转换为字符串并作为字符串列存储在表中 存储到模式为 REPEAT 的列中。 (不确定这样是否可以保留嵌入向量条目的顺序)

希望任何人都可以提出一些建议或其他方法。

非常感谢

【问题讨论】:

将其存储为字符串的序列化或 jsonized 值。 使用哪种方法来序列化数组? np.array2string() 或 np.tobytes() ? 【参考方案1】:

我使用以下方法序列化嵌入:

s = sentence1_embeddings.tobytes()

得到类似的东西:

b'\xd0\x8b0?\xd4\xdf\xae\xbe\xccA\'=\x94\xc53>2\xb3\x14?\xb6\xcb\xac\xbeN\x13\\?AV\xa0\xbe\x07\xb7\x8b\xbf<\xf1\x02?\xc5\x10\x19=u\x8ad\xbf\xd9\x93-

然后我创建一个数据框,并将 df 上传到 BQ:

df = pd.DataFrame('a':[s])
df.to_gbq('ds_test.table_test', project_id='experiment',if_exists='replace')

然后我使用以下方法读回字节:

查询 = """ 选择一个 FROM s_test.table_test

"""

当打印字符串数据['a'][0]

数据['a'][0]

'b\'\\xd0\\x8b0?\\xd4\\xdf\\xae\\xbe\\xccA\\\'=\\x94\\xc53>2\\xb3\\x14?\\xb6\\xcb\\xac\\xbeN\\x13\\\\?AV\\xa0\\xbe\\x07\\xb7\\x8b\\xbf<\\xf1\\x02?\\xc5\\x10\\x19=u\\x8ad\\xbf\\xd9\\x93-\\xbf;q+>\\xa3e\\x92\\xbf\\xcf\\x93\\xcd\\xbd\\xf4\\xa2/>\\x1f2?9p\\xca=\\x8c\\xc66\\xbe4\

看起来与原始字节不同(更多反斜杠)

当试图转换回 numpy 数组时:

np.frombuffer(data['a'][0], dtype=sentence1_embeddings.dtype)

我收到错误:

TypeError: a bytes-like object is required, not 'str'

【讨论】:

【参考方案2】:

数组是 BigQuery 中的一等公民 - 请参阅 https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays

模式REPEATED表示该列是一个数组。

例如STRING 模式下REPEATED 类型的列表示该列只能包含字符串类型的数组。

元素的顺序被保留。所以我猜你只是想直接将你的数组作为数组存储在 BQ 中。

如果您想稍后使用 SQL 对这些数组进行操作,请查看 UNNEST(&lt;array&gt;),它将数组转换为表,以便您可以直接在数组上运行 SQL(使用横向连接或仅使用子查询)。

【讨论】:

您如何在 BigQuery 中实际实现这一点?我认为这是原始海报的问题。

以上是关于在 Google Cloud BigQuery 中存储句子嵌入的主要内容,如果未能解决你的问题,请参考以下文章

在 Google Cloud BigQuery 中存储句子嵌入

如何在 Google Cloud Datalab 中使用 Bigquery JSON 函数

如何在气流中配置 Google Cloud BigQuery

com.google.cloud.bigquery.BigQueryException:读取超时

本地 Google App Engine:ImportError:没有名为 google.cloud.bigquery 的模块

Python,AttributeError:模块'google.cloud.bigquery'在cx_Freeze构建后没有属性'Client'