gpt4 book ai didi

python - 什么是存储 NLP 嵌入的好方法(nparrays 加信息)

转载 作者:行者123 更新时间:2023-12-02 09:47:10 27 4
gpt4 key购买 nike

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

11 个月前关闭。




Improve this question




我有巨大的文本数据集(500.000+ 文档),我想为文档中的所有句子或段落存储嵌入。嵌入是一个包含 768 个条目的 numpy 数组。

我知道可以轻松地将 numpy 数组写入磁盘,但我还需要为这些嵌入存储附加信息,即它们代表哪个句子/段落以及该句子出现在哪个文档中。
我考虑将所有这些信息存储在(PostgreSQL)数据库中,但是我担心搜索向量/嵌入可能会很慢。该应用程序是相似性搜索,因此可以找到与查询最相似的向量。
存储这些向量及其相应信息的最佳方法是什么?在这种情况下(document_ID、sentence_as_string、sentence_embedding)存储 python 元组是否有效? postgres 数据库可以完成这项工作吗?
我还考虑过将所有嵌入存储为 .npy 文件中的 numpy 矩阵并仅存储
嵌入数据库的行号。这意味着将所有嵌入加载到内存中,但我觉得这可能是性能最好的。是“乱”吗?是否有关于存储 numpy 数组和附加信息的最佳实践?

编辑(附加信息):
我有几个数据集,比如 Enron Corpus ,我想将其拆分为句子或段落。我们称它们为单位。对于每个单位,我想计算一个 sentence embedding .这些向量有 768 维。因为我想搜索最相似的向量,所以我需要计算所有向量之间的余弦相似度。我还想计算所有向量和搜索查询嵌入之间的余弦相似度,这使得所有向量之间的比较成为必要。
现在我的问题是如何有效地存储这些信息。该应用程序似乎适合经典的关系数据库方案。一个文档由几个单元组成,每个单元有一个文本域。我想还可以将 768 维向量作为条目存储在数据库中,因此一个单元也可以存储其嵌入。但是,我担心在数据库中计算余弦相似度可能会比将所有嵌入都存储在内存中非常慢。但是当我将所有嵌入存储为一个 numpy 数组并将它们加载到内存中时,我丢失了关于哪个单元产生哪个嵌入的信息。所以我的问题是,如何最好地存储如此大量的 768 维向量及其相应的信息。
计算嵌入是昂贵的。我只想做一次。所以工作流程是:

  • 将所有文档拆分为单元(文本,元信息为文本)
  • 计算所有单元的嵌入(Numpy-Arrays)
  • 存储它们
  • 能够搜索它们

  • 存储它们让我头疼。

    进一步的努力:
    我已经设置了没有嵌入的数据库。之后我研究了如何在 postgres-DB 中存储一个 numpy 数组。显然,必须将其序列化为 JSON。这使得计算数据库内的余弦相似度几乎不可能(或至少慢得不可能)AFAIK。我不认为现在将我所有的嵌入放入 postgresDB 是值得的。似乎也有一些关于使用嵌入的谷歌类(class),我会检查一下。

    最佳答案

    [对于 Python] 在运行时将所有嵌入存储在内存中并不是一个好主意。相反,在计算嵌入后,将它们保存到文件中,每当您想搜索“最相似的短语”时,一次遍历文件一行,计算余弦相似度分数,并跟踪最大分数以及与该嵌入对应的句子(您可以将文件构建为 json)。以这种方式这样做应该允许程序能够搜索所有嵌入,而无需将每个嵌入都加载到内存中。

    关于python - 什么是存储 NLP 嵌入的好方法(nparrays 加信息),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59027867/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com