financebench-viewer / scripts /build_corpus_text.py
timchen0618's picture
Add E2E structures, corrected c6, and corpus text
cfbbab4 verified
Raw
History Blame Contribute Delete
3.02 kB
#!/usr/bin/env python3
"""Build lazy compressed text shards for the FinanceBench Corpus tab."""
from __future__ import annotations
import argparse
import base64
import gzip
import json
import shutil
from collections import defaultdict
from pathlib import Path
from typing import Any, Iterator
ROOT = Path(__file__).resolve().parent.parent
DEFAULT_CORPUS = Path(
"/mnt/ramdisk/blobstore/timchen0618/data/eval/financebench/"
"unified/corpus.unified.jsonl"
)
def iter_jsonl(path: Path) -> Iterator[dict[str, Any]]:
with path.open(encoding="utf-8") as handle:
for line in handle:
if line.strip():
yield json.loads(line)
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--corpus", type=Path, default=DEFAULT_CORPUS)
parser.add_argument("--out", type=Path, default=ROOT / "corpus_text")
args = parser.parse_args()
grouped: dict[str, list[dict[str, Any]]] = defaultdict(list)
metadata: dict[str, dict[str, Any]] = {}
for row in iter_jsonl(args.corpus):
meta = row.get("meta") or {}
doc_name = str(meta["doc_name"])
metadata.setdefault(doc_name, dict(meta))
grouped[doc_name].append(
{
"id": str(row["id"]),
"page_start": meta.get("page_start"),
"page_end": meta.get("page_end"),
"contents": str(row.get("contents") or ""),
}
)
records_dir = args.out / "records"
if records_dir.exists():
shutil.rmtree(records_dir)
records_dir.mkdir(parents=True, exist_ok=True)
index_rows = []
for doc_name in sorted(grouped):
chunks = sorted(grouped[doc_name], key=lambda row: row["page_start"] or 0)
record = {
"doc_name": doc_name,
"meta": metadata[doc_name],
"chunks": chunks,
}
raw = json.dumps(record, ensure_ascii=False, separators=(",", ":")).encode()
encoded = base64.b64encode(gzip.compress(raw, compresslevel=9)).decode("ascii")
path = f"records/{doc_name}.json.gzip.b64"
(args.out / path).write_text(encoded, encoding="ascii")
index_rows.append(
{
"doc_name": doc_name,
"n_chunks": len(chunks),
"n_pages": max(chunk["page_end"] or 0 for chunk in chunks),
"path": path,
}
)
args.out.mkdir(parents=True, exist_ok=True)
(args.out / "index.json").write_text(
json.dumps(
{
"meta": {
"n_documents": len(index_rows),
"n_chunks": sum(row["n_chunks"] for row in index_rows),
"source": str(args.corpus),
},
"rows": index_rows,
},
ensure_ascii=False,
),
encoding="utf-8",
)
print(f"Wrote {len(index_rows)} documents to {args.out}")
if __name__ == "__main__":
main()