Spaces:
Running on CPU Upgrade
Running on CPU Upgrade
File size: 5,524 Bytes
61d29fc | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | #!/usr/bin/env python3
"""
Example: Process multiple document formats and save to Parquet.
This demonstrates how to handle PDFs, PowerPoint, Word, Excel, etc.
from government websites and store them efficiently.
"""
import asyncio
import pandas as pd
from pathlib import Path
from extraction.universal_extractor import UniversalDocumentExtractor
from loguru import logger
async def process_jurisdiction_all_formats(jurisdiction_name: str, document_urls: list) -> pd.DataFrame:
"""
Process all document formats from a jurisdiction.
Args:
jurisdiction_name: Name of jurisdiction
document_urls: List of document URLs (any format)
Returns:
DataFrame with extracted text
"""
logger.info(f"Processing {len(document_urls)} documents from {jurisdiction_name}")
extractor = UniversalDocumentExtractor()
results = []
for i, url in enumerate(document_urls, 1):
logger.info(f" [{i}/{len(document_urls)}] Processing {url}")
# Extract text (works for any format!)
result = extractor.extract_from_url(url)
if result['success']:
logger.success(f" ✅ {result['format']}: {result['text_length']} characters")
results.append({
'jurisdiction': jurisdiction_name,
'url': result['url'],
'format': result['format'],
'text': result['text'],
'file_size_kb': result['file_size_kb'],
'text_length': result['text_length']
})
else:
logger.warning(f" ❌ Failed: {result.get('error', 'Unknown error')}")
extractor.close()
return pd.DataFrame(results)
async def example_tuscaloosa():
"""Example: Process Tuscaloosa documents (mixed formats)."""
# Example URLs (these are fictional - replace with real URLs)
document_urls = [
# PDFs (most common)
"https://tuscaloosaal.suiteonemedia.com/agenda_2025_03_15.pdf",
"https://tuscaloosaal.suiteonemedia.com/minutes_2025_03_01.pdf",
# PowerPoint presentations
"https://tuscaloosaal.suiteonemedia.com/budget_presentation.pptx",
# Word documents
"https://tuscaloosaal.suiteonemedia.com/policy_draft.docx",
# Excel spreadsheets
"https://tuscaloosaal.suiteonemedia.com/financial_report.xlsx",
# HTML pages
"https://tuscaloosaal.suiteonemedia.com/public_notice.html",
]
# Process all formats
df = await process_jurisdiction_all_formats("Tuscaloosa, AL", document_urls)
# Save to Parquet (all formats in one file!)
output_file = "data/tuscaloosa_all_formats.parquet"
Path(output_file).parent.mkdir(parents=True, exist_ok=True)
df.to_parquet(output_file, compression='snappy', index=False)
# Show results
logger.success(f"\n✅ Processed {len(df)} documents from Tuscaloosa")
logger.success(f" Saved to: {output_file}")
logger.success(f" File size: {Path(output_file).stat().st_size / 1024:.1f} KB")
# Show format breakdown
format_counts = df['format'].value_counts()
logger.info("\nFormat breakdown:")
for fmt, count in format_counts.items():
logger.info(f" {fmt}: {count} documents")
return df
async def example_multiple_jurisdictions():
"""Example: Process multiple jurisdictions with mixed formats."""
jurisdictions = {
"Tuscaloosa, AL": [
"https://example.com/tuscaloosa_agenda.pdf",
"https://example.com/tuscaloosa_presentation.pptx",
],
"Birmingham, AL": [
"https://example.com/birmingham_minutes.docx",
"https://example.com/birmingham_budget.xlsx",
],
"Mobile, AL": [
"https://example.com/mobile_agenda.pdf",
"https://example.com/mobile_policy.html",
]
}
all_data = []
for jurisdiction, urls in jurisdictions.items():
df = await process_jurisdiction_all_formats(jurisdiction, urls)
all_data.append(df)
# Combine all jurisdictions
combined = pd.concat(all_data, ignore_index=True)
# Save to single Parquet file
output_file = "data/alabama_cities_all_formats.parquet"
combined.to_parquet(output_file, compression='snappy', index=False)
logger.success(f"\n✅ Processed {len(combined)} total documents")
logger.success(f" Jurisdictions: {combined['jurisdiction'].nunique()}")
logger.success(f" Formats: {', '.join(combined['format'].unique())}")
logger.success(f" Saved to: {output_file}")
return combined
if __name__ == "__main__":
import sys
# Choose example
if len(sys.argv) > 1 and sys.argv[1] == "multi":
print("Running multiple jurisdictions example...")
df = asyncio.run(example_multiple_jurisdictions())
else:
print("Running Tuscaloosa example...")
print("(Use 'python examples/process_multiple_formats.py multi' for multiple jurisdictions)")
print()
df = asyncio.run(example_tuscaloosa())
print("\n" + "="*70)
print("SUMMARY")
print("="*70)
print(f"Total documents: {len(df)}")
print(f"Total text: {df['text_length'].sum():,} characters")
print(f"Average per doc: {df['text_length'].mean():.0f} characters")
print()
print("Format distribution:")
print(df['format'].value_counts())
|