我有一个pandas数据框,其中包含大量文本文档的元数据:
meta_df = pd.read_csv(
"./mdenny_copy_early2015/Metadata/Metadata/Bill_Metadata_1993-2014.csv",
low_memory=False,
parse_dates=['time'],
infer_datetime_format=True,
dayfirst=True,
)
对于其中的每一行,都有JSON文件,其中包含完整的标记化文本。 JSON文件的文件名是它对应的行的索引。我无法一次将所有JSON文件加载到内存中,但能够使用dask.dataframe.from_delayed
将它们放入dask数据框中。这会将每个文档放入其自己的分区中:
def doc_paths():
p = Path('./mdenny_copy_early2015/bills/POS_Tagged_Bills_1993_2014/')
return p.glob("*.anno")
paths = list(doc_paths())
def load_doc(path):
with open(str(path.resolve())) as f:
doc = json.load(f)
id_ = int(path.stem[4:])
sentences = [s['tokens'] for s in doc['sentences']]
print(id_)
return pd.DataFrame({
'sentences': [sentences]
}, index=[id_])
dfs = list(map(delayed(load_doc, pure=True), paths))
df = dask.dataframe.from_delayed(dfs)
然后我可以将它们连接在一起以获得与元数据相关的句子:
joined_df = df.join(meta_df)
但是,如果我执行joined_df[joined_df['author'] == 'Saul'].compute()
之类的操作,它会将所有文件加载到内存中。有没有办法我可以设置它只读取它需要的文件?看起来这应该是可能的,因为它已经拥有了内存中的所有元数据,然后可以从中找到所需的ID并在磁盘上查找它们。