Spaces:
Running
Running
import torch | |
import gradio as gr | |
import pandas as pd | |
import numpy as np | |
from transformers import AutoTokenizer, AutoModelForSequenceClassification, pipeline | |
from sklearn.model_selection import train_test_split | |
from sklearn.preprocessing import LabelEncoder | |
import json | |
from datetime import datetime | |
class LegalAISystem: | |
def __init__(self): | |
self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') | |
self.tokenizer = AutoTokenizer.from_pretrained('nlpaueb/legal-bert-base-uncased') | |
self.model = AutoModelForSequenceClassification.from_pretrained('nlpaueb/legal-bert-base-uncased') | |
self.model.to(self.device) | |
self.label_encoder = LabelEncoder() | |
self.case_history = [] | |
def preprocess_data(self, text): | |
# Clean and normalize text | |
text = str(text).lower().strip() | |
# Add more preprocessing steps as needed | |
return text | |
def extract_features(self, text): | |
# Tokenize and prepare features | |
inputs = self.tokenizer( | |
text, | |
padding=True, | |
truncation=True, | |
max_length=512, | |
return_tensors="pt" | |
).to(self.device) | |
return inputs | |
def predict_outcome(self, case_text): | |
# Preprocess input | |
processed_text = self.preprocess_data(case_text) | |
# Extract features | |
features = self.extract_features(processed_text) | |
# Make prediction | |
with torch.no_grad(): | |
outputs = self.model(**features) | |
predictions = torch.nn.functional.softmax(outputs.logits, dim=-1) | |
# Get prediction probabilities | |
probs = predictions.cpu().numpy()[0] | |
# Store in case history | |
self.case_history.append({ | |
'timestamp': datetime.now().strftime("%Y-%m-%d %H:%M:%S"), | |
'case_text': case_text, | |
'prediction_probs': probs.tolist() | |
}) | |
return { | |
'Favorable': float(probs[1]), | |
'Unfavorable': float(probs[0]) | |
} | |
def analyze_precedents(self, case_text): | |
# Implement similarity search for relevant precedents | |
# This is a simplified version | |
return ["Precedent 1: Smith v. Jones (2019)", | |
"Precedent 2: Brown v. State (2020)"] | |
def generate_report(self, case_text, prediction, precedents): | |
report = f""" | |
Legal Case Analysis Report | |
======================== | |
Date: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")} | |
Case Summary: | |
{case_text[:500]}... | |
Prediction: | |
- Favorable Outcome: {prediction['Favorable']:.2%} | |
- Unfavorable Outcome: {prediction['Unfavorable']:.2%} | |
Relevant Precedents: | |
{chr(10).join(precedents)} | |
Note: This is an AI-generated analysis and should be reviewed by legal professionals. | |
""" | |
return report | |
def create_gradio_interface(): | |
legal_ai = LegalAISystem() | |
def process_case(case_text): | |
# Analyze case | |
prediction = legal_ai.predict_outcome(case_text) | |
precedents = legal_ai.analyze_precedents(case_text) | |
report = legal_ai.generate_report(case_text, prediction, precedents) | |
# Create visualization data | |
prob_chart = { | |
"Favorable": prediction['Favorable'], | |
"Unfavorable": prediction['Unfavorable'] | |
} | |
return ( | |
report, | |
prob_chart, | |
f"Confidence: {max(prediction.values()):.2%}" | |
) | |
# Create Gradio interface | |
iface = gr.Interface( | |
fn=process_case, | |
inputs=[ | |
gr.Textbox(label="Enter Case Details", lines=10) | |
], | |
outputs=[ | |
gr.Textbox(label="Analysis Report", lines=10), | |
gr.Label(label="Outcome Probabilities"), | |
gr.Textbox(label="Model Confidence") | |
], | |
title="AI Legal Case Analysis System", | |
description="Enter case details to get real-time analysis and predictions." | |
) | |
return iface | |
# Launch the interface | |
if __name__ == "__main__": | |
interface = create_gradio_interface() | |
interface.launch(share=True, debug=True) |