voxforge-world / cogcore /datasets /disk_cache.py
peiti's picture
Upload folder using huggingface_hub
0d20347 verified
Raw
History Blame Contribute Delete
2.51 kB
"""English implementation note."""
from __future__ import annotations
import gzip
import json
from pathlib import Path
from typing import Iterator, List, Optional, Union
from .loader import StreamingCorpusLoader, BundleStreamingLoader
from .registry import DatasetSpec
DOC_SEPARATOR = '\n\n\n---DOC---\n\n\n'
def cache_to_disk(loader: Union[StreamingCorpusLoader, BundleStreamingLoader], output_path: Union[str, Path], compress: bool=True, overwrite: bool=False, progress_every: int=1000) -> dict:
"""English implementation note."""
output_path = Path(output_path)
if compress and output_path.suffix != '.gz':
output_path = output_path.with_suffix(output_path.suffix + '.gz')
if output_path.exists() and (not overwrite):
raise FileExistsError(f'{output_path} already exists. Use overwrite=True.')
output_path.parent.mkdir(parents=True, exist_ok=True)
open_fn = gzip.open if compress else open
n_docs = 0
total_chars = 0
with open_fn(output_path, 'wt', encoding='utf-8') as f:
for doc in loader:
if n_docs > 0:
f.write(DOC_SEPARATOR)
f.write(doc)
n_docs += 1
total_chars += len(doc)
if progress_every > 0 and n_docs % progress_every == 0:
print(f' cached {n_docs:,} docs, {total_chars:,} chars', flush=True)
metadata = {'n_documents': n_docs, 'total_chars': total_chars, 'compress': compress, 'separator': DOC_SEPARATOR, 'output_path': str(output_path)}
meta_path = output_path.with_suffix(output_path.suffix + '.meta.json')
with open(meta_path, 'w', encoding='utf-8') as f:
json.dump(metadata, f, indent=2, ensure_ascii=False)
return metadata
def iter_cached_corpus(path: Union[str, Path]) -> Iterator[str]:
"""English implementation note."""
path = Path(path)
if not path.exists():
raise FileNotFoundError(f'Cache file not found: {path}')
open_fn = gzip.open if path.suffix == '.gz' else open
with open_fn(path, 'rt', encoding='utf-8') as f:
text = f.read()
for doc in text.split(DOC_SEPARATOR):
doc = doc.strip()
if doc:
yield doc
def load_cached_corpus(path: Union[str, Path], max_documents: Optional[int]=None) -> List[str]:
"""English implementation note."""
out: List[str] = []
for doc in iter_cached_corpus(path):
out.append(doc)
if max_documents is not None and len(out) >= max_documents:
break
return out