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

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

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

我找到了 3 种方法:

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

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

非常感谢

【问题讨论】:

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

标签: google-cloud-platform google-bigquery embedding huggingface-transformers


【解决方案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/>\\x1f{2?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 中实际实现这一点?我认为这是原始海报的问题。
    猜你喜欢
    • 2015-10-31
    • 1970-01-01
    • 2017-01-24
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多