News-Search-Engine / scripts /build_index.py
1xMezoo's picture
Deploy News Search Engine to Hugging Face Spaces
39ff835
Raw
History Blame Contribute Delete
1.98 kB
"""Build (and persist) the inverted index from a dataset file.
Usage
-----
# Build from the committed sample (default) -> artifacts/index.pkl
python scripts/build_index.py
# Build from the full dataset
python scripts/build_index.py --data data/News_Category_Dataset_v3.json
# Also build dense BERT document embeddings (heavy, optional)
python scripts/build_index.py --data data/News_Category_Dataset_v3.json --bert
"""
from __future__ import annotations
import argparse
import pickle
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "src"))
from news_search import build_index, load_corpus # noqa: E402
from news_search.dense import DenseRetriever # noqa: E402
def main() -> int:
ap = argparse.ArgumentParser(description="Build the search index.")
ap.add_argument("--data", default=str(ROOT / "data" / "sample_news.jsonl"),
help="Path to the dataset (JSON lines).")
ap.add_argument("--out", default=str(ROOT / "artifacts" / "index.pkl"),
help="Where to write the pickled index.")
ap.add_argument("--limit", type=int, default=None, help="Cap number of documents.")
ap.add_argument("--bert", action="store_true",
help="Also build dense BERT document embeddings (saved as dense.pkl).")
args = ap.parse_args()
print(f"Loading corpus from {args.data} ...")
docs = load_corpus(args.data, limit=args.limit)
print(f"Loaded {len(docs):,} documents.")
index = build_index(docs)
index.save(args.out)
print(f"Saved index -> {args.out}")
if args.bert:
dense = DenseRetriever().fit(docs)
dense_path = Path(args.out).with_name("dense.pkl")
with dense_path.open("wb") as fh:
pickle.dump(dense, fh, protocol=pickle.HIGHEST_PROTOCOL)
print(f"Saved dense retriever -> {dense_path}")
return 0
if __name__ == "__main__":
sys.exit(main())