在 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(<array>)
,它将数组转换为表,以便您可以直接在数组上运行 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'