Spaces:
Sleeping
Sleeping
| """ | |
| CLI Interface for Healthcare Reason Classification | |
| This provides a command-line interface for testing and using the | |
| healthcare reason classifier system with real healthcare data. | |
| """ | |
| import argparse | |
| import json | |
| import sys | |
| from pathlib import Path | |
| # Add project root to path | |
| REPO_ROOT = Path(__file__).resolve().parents[1] | |
| if str(REPO_ROOT) not in sys.path: | |
| sys.path.insert(0, str(REPO_ROOT)) | |
| def classify_single_query(query: str): | |
| """Classify a single healthcare reason query and display results.""" | |
| print(f"Query: {query}") | |
| print("-" * 50) | |
| try: | |
| # Import the reason inference module | |
| sys.path.append('classifier') | |
| from classifier.reason.infer_reason import predict_single_reason | |
| # Get prediction | |
| result = predict_single_reason(query) | |
| print(f"Primary Classification: {result['category']}") | |
| print(f"Confidence: {result['confidence']:.4f}") | |
| # Show all category probabilities | |
| print(f"\nAll Category Probabilities:") | |
| # Sort by probability | |
| sorted_probs = sorted(result['probabilities'].items(), | |
| key=lambda x: x[1], reverse=True) | |
| for category, prob in sorted_probs: | |
| print(f" {category}: {prob:.4f}") | |
| except Exception as e: | |
| print(f"Error: {e}") | |
| print("Note: Make sure the reason classifier is trained") | |
| return False | |
| return True | |
| def classify_batch_queries(queries_file: str, output_file: str = None): | |
| """Classify multiple queries from a file.""" | |
| try: | |
| # Read queries | |
| with open(queries_file, 'r') as f: | |
| if queries_file.endswith('.json'): | |
| data = json.load(f) | |
| if isinstance(data, list): | |
| queries = data | |
| else: | |
| queries = data.get('queries', []) | |
| else: | |
| queries = [line.strip() for line in f if line.strip()] | |
| print(f"Processing {len(queries)} healthcare reason queries...") | |
| # Import the reason inference module | |
| sys.path.append('classifier') | |
| from classifier.reason.infer_reason import predict_single_reason | |
| results = [] | |
| for i, query in enumerate(queries, 1): | |
| print(f"\n{i}. Query: {query}") | |
| result = predict_single_reason(query) | |
| results.append(result) | |
| print(f" Category: {result['category']} (confidence: {result['confidence']:.3f})") | |
| # Save results if output file specified | |
| if output_file: | |
| output_data = { | |
| 'queries': queries, | |
| 'predictions': results, | |
| 'summary': { | |
| 'total_queries': len(queries), | |
| 'categories': {} | |
| } | |
| } | |
| # Count categories | |
| for result in results: | |
| cat = result['category'] | |
| output_data['summary']['categories'][cat] = output_data['summary']['categories'].get(cat, 0) + 1 | |
| with open(output_file, 'w') as f: | |
| json.dump(output_data, f, indent=2) | |
| print(f"\nResults saved to {output_file}") | |
| # Show summary | |
| category_counts = {} | |
| for result in results: | |
| cat = result['category'] | |
| category_counts[cat] = category_counts.get(cat, 0) + 1 | |
| print(f"\nSummary:") | |
| for category, count in sorted(category_counts.items()): | |
| percentage = (count / len(queries)) * 100 | |
| print(f" {category}: {count} queries ({percentage:.1f}%)") | |
| except Exception as e: | |
| print(f"Error processing batch queries: {e}") | |
| return False | |
| return True | |
| def interactive_mode(): | |
| """Interactive mode for testing healthcare reason queries.""" | |
| print("Healthcare Reason Classifier - Interactive Mode") | |
| print("=" * 50) | |
| print("Enter healthcare reason queries to classify (type 'quit' to exit)") | |
| print() | |
| print("Example queries to try:") | |
| print(" • 'I have heel pain when I walk'") | |
| print(" • 'My toenail is ingrown and infected'") | |
| print(" • 'I need routine foot care'") | |
| print(" • 'I sprained my ankle playing basketball'") | |
| print(" • 'I have plantar fasciitis'") | |
| print(" • 'I need a cortisone injection'") | |
| print() | |
| while True: | |
| try: | |
| user_input = input(">>> ").strip() | |
| if user_input.lower() == 'quit': | |
| break | |
| if user_input: | |
| classify_single_query(user_input) | |
| print() | |
| except KeyboardInterrupt: | |
| break | |
| except Exception as e: | |
| print(f"Error: {e}") | |
| print() | |
| def main(): | |
| parser = argparse.ArgumentParser( | |
| description='Healthcare Reason Classification CLI', | |
| formatter_class=argparse.RawDescriptionHelpFormatter, | |
| epilog=""" | |
| Examples: | |
| # Classify a single healthcare reason query | |
| python cli/reason_classifier_cli_new.py "I have heel pain" | |
| # Batch process queries from file | |
| python cli/reason_classifier_cli_new.py --batch reason_queries.txt --output results.json | |
| # Interactive mode | |
| python cli/reason_classifier_cli_new.py --interactive | |
| """ | |
| ) | |
| parser.add_argument('query', nargs='?', help='Healthcare reason query to classify') | |
| parser.add_argument('--batch', type=str, help='File containing queries to process') | |
| parser.add_argument('--output', type=str, help='Output file for batch results') | |
| parser.add_argument('--interactive', action='store_true', | |
| help='Start interactive mode') | |
| args = parser.parse_args() | |
| # Interactive mode | |
| if args.interactive: | |
| interactive_mode() | |
| return 0 | |
| # Batch processing | |
| if args.batch: | |
| if not Path(args.batch).exists(): | |
| print(f"Error: Batch file does not exist: {args.batch}") | |
| return 1 | |
| success = classify_batch_queries(args.batch, args.output) | |
| return 0 if success else 1 | |
| # Single query processing | |
| if args.query: | |
| success = classify_single_query(args.query) | |
| return 0 if success else 1 | |
| # No arguments provided | |
| parser.print_help() | |
| return 1 | |
| if __name__ == "__main__": | |
| sys.exit(main()) |