我应该如何将 BM25Okapi 对象值保存到文件中?

Ulv*_*ade 5 python information-retrieval artificial-intelligence ranking

我们正在从事信息检索任务,由于查询,我们需要对研究论文进行排名。

清理数据并创建数据框后,我们对纸质文本进行了标记化,需要将结果保存到文件中。

import sys
#tokenized_corpus = [doc.split(" ") for doc in corpus]

corpus = list(df.body_text)

tokenized_corpus1 = [doc.split(" ") for doc in corpus[:20000]]
tokenized_corpus2 = [doc.split(" ") for doc in corpus[20000:40000]]
#tokenized_corpus3 = [doc.split(" ") for doc in corpus[40000:]]

tokenized_corpus = tokenized_corpus1 + tokenized_corpus2 # + tokenized_corpus3 
Run Code Online (Sandbox Code Playgroud)

上面的单元格创建标记化的语料库。

with open('file.csv', 'w', newline='', encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerows(tokenized_corpus)
Run Code Online (Sandbox Code Playgroud)

然后我们将数据保存到 .csv 文件。

之后,我们调用 BM25Okapi 方法

bm25 = BM25Okapi(tokenized_corpus)
Run Code Online (Sandbox Code Playgroud)

由于这一步需要太多时间并消耗千兆字节的内存(导致频繁错误),我们希望保存结果,这样我们就不需要每次都调用函数。

为了检索结果,我们使用了以下步骤。

query = "coronavirus origin"
tokenized_query = query.split(" ")

doc_scores = bm25.get_scores(tokenized_query)
doc_scores
Run Code Online (Sandbox Code Playgroud)

我无法将 BM25 对象值保存到文件中。并且在源代码中没有看到任何方法。我应该怎么做?

Ulv*_*ade 2

问题以错误的方式提出。我们要做的是保存对象,而不是专门保存 BM25Okapi 结果。

所以,解决方案如下:

import pickle

#To save bm25 object
with open('bm25result', 'wb') as bm25result_file:
    pickle.dump(bm25, bm25result_file)
Run Code Online (Sandbox Code Playgroud)

然后,读取对象数据:

#to read bm25 object
with open('bm25result', 'rb') as bm25result_file:
    bm25result = pickle.load(bm25result_file)
Run Code Online (Sandbox Code Playgroud)

详细的说明可以看这篇文章