Spaces:
Running
Running
from flask import Flask, render_template, jsonify, request | |
import json | |
import re | |
import os | |
app = Flask(__name__) | |
def load_schemes(): | |
with open('schemes.json', 'r') as f: | |
data = json.load(f) | |
schemes = {} | |
for scheme in data['schemes']: | |
scheme_id = scheme['name'].lower().replace(' ', '-').replace('(', '').replace(')', '').replace('.', '') | |
# Handle Exclusions formatting | |
if isinstance(scheme['Eligibility Criteria'], dict): | |
exclusions = scheme['Eligibility Criteria'].get('Exclusions', []) | |
if isinstance(exclusions, str): | |
# Convert string to list if it's a single string | |
exclusions = [exclusions] | |
scheme['Eligibility Criteria']['Exclusions'] = exclusions | |
# Generate keywords for filtering | |
keywords = [] | |
# Extract keyword categories | |
if 'income' in scheme['Introduction'].lower(): | |
keywords.append('income') | |
if 'insurance' in scheme['Introduction'].lower(): | |
keywords.append('insurance') | |
if 'infrastructure' in scheme['Introduction'].lower(): | |
keywords.append('infrastructure') | |
if 'irrigation' in scheme['Introduction'].lower() or 'water' in scheme['Introduction'].lower(): | |
keywords.append('irrigation') | |
if 'organic' in scheme['Introduction'].lower(): | |
keywords.append('organic') | |
if 'credit' in scheme['Introduction'].lower() or 'loan' in scheme['Introduction'].lower(): | |
keywords.append('credit') | |
if 'market' in scheme['Introduction'].lower(): | |
keywords.append('market') | |
if 'soil' in scheme['Introduction'].lower(): | |
keywords.append('soil') | |
# Extract beneficiary types | |
beneficiary_text = "" | |
if isinstance(scheme['Eligibility Criteria'], dict): | |
if isinstance(scheme['Eligibility Criteria']['Eligible Beneficiaries'], list): | |
beneficiary_text = " ".join(scheme['Eligibility Criteria']['Eligible Beneficiaries']) | |
else: | |
beneficiary_text = scheme['Eligibility Criteria']['Eligible Beneficiaries'] | |
else: | |
beneficiary_text = str(scheme['Eligibility Criteria']) | |
if 'all farmers' in beneficiary_text.lower(): | |
keywords.append('all farmers') | |
if 'small' in beneficiary_text.lower() or 'marginal' in beneficiary_text.lower(): | |
keywords.append('small') | |
if 'tenant' in beneficiary_text.lower(): | |
keywords.append('tenant') | |
if 'sharecropper' in beneficiary_text.lower(): | |
keywords.append('sharecroppers') | |
if 'fpo' in beneficiary_text.lower() or 'farmer producer' in beneficiary_text.lower(): | |
keywords.append('fpo') | |
if 'landholding' in beneficiary_text.lower(): | |
keywords.append('landholding') | |
# Extract benefit types | |
benefits_text = " ".join(scheme['Benefits']) if isinstance(scheme['Benefits'], list) else scheme['Benefits'] | |
if 'financial' in benefits_text.lower(): | |
keywords.append('financial') | |
if 'subsidy' in benefits_text.lower(): | |
keywords.append('subsidy') | |
if 'insurance' in benefits_text.lower(): | |
keywords.append('insurance') | |
if 'credit' in benefits_text.lower() or 'loan' in benefits_text.lower(): | |
keywords.append('credit') | |
if 'income' in benefits_text.lower(): | |
keywords.append('income') | |
if 'infrastructure' in benefits_text.lower(): | |
keywords.append('infrastructure') | |
if 'training' in benefits_text.lower() or 'education' in benefits_text.lower(): | |
keywords.append('training') | |
schemes[scheme_id] = { | |
'name': scheme['name'], | |
'introduction': scheme['Introduction'], | |
'objective': scheme['Objective'], | |
'benefits': scheme['Benefits'], | |
'eligibility': { | |
'eligible': ( | |
[scheme['Eligibility Criteria']['Eligible Beneficiaries']] | |
if isinstance(scheme['Eligibility Criteria'], dict) and isinstance(scheme['Eligibility Criteria']['Eligible Beneficiaries'], str) | |
else scheme['Eligibility Criteria']['Eligible Beneficiaries'] | |
if isinstance(scheme['Eligibility Criteria'], dict) | |
else [str(scheme['Eligibility Criteria'])] | |
), | |
'exclusions': ( | |
scheme['Eligibility Criteria']['Exclusions'] | |
if isinstance(scheme['Eligibility Criteria'], dict) | |
else [] | |
) | |
}, | |
'application_process': scheme['Application Process & Required Documents']['Application Process'], | |
'documents_required': scheme['Application Process & Required Documents']['Documents Required'], | |
'contact': { | |
'helpline': str(scheme['Helpline & Website'].get('Helpline Number', '')), | |
'email': str(scheme['Helpline & Website'].get('Email', '')), | |
'website': str(scheme['Helpline & Website'].get('Official Website', '')) | |
}, | |
'keywords': ' '.join(keywords) | |
} | |
return schemes | |
schemes = load_schemes() | |
def index(): | |
return render_template('index.html', schemes=schemes) | |
# Add this new route for the chatbot | |
def chatbot(): | |
return render_template('chatbot.html') | |
# Add this new API endpoint to process chatbot queries | |
def recommend_schemes(): | |
data = request.json | |
answers = data.get('answers', {}) | |
# Get farmer type | |
farmer_type = answers.get('farmer_type', '') | |
# Get farming interests | |
interests = answers.get('interests', []) | |
# Get financial needs | |
financial_needs = answers.get('financial_needs', []) | |
# Get region/state | |
region = answers.get('region', '') | |
# Get land area | |
land_area = answers.get('land_area', '') | |
# Algorithm to find matching schemes | |
recommended_schemes = [] | |
for scheme_id, scheme in schemes.items(): | |
score = 0 | |
keywords = scheme['keywords'].lower() | |
# Check farmer type match | |
if farmer_type == 'small' and 'small' in keywords: | |
score += 3 | |
elif farmer_type == 'tenant' and 'tenant' in keywords: | |
score += 3 | |
elif farmer_type == 'fpo' and 'fpo' in keywords: | |
score += 3 | |
elif farmer_type == 'all' and 'all farmers' in keywords: | |
score += 1 | |
# Check interests | |
for interest in interests: | |
if interest in keywords: | |
score += 2 | |
# Check financial needs | |
for need in financial_needs: | |
if need in keywords: | |
score += 2 | |
# Only include schemes with a score of 2 or higher | |
if score >= 2: | |
recommended_schemes.append({ | |
'id': scheme_id, | |
'name': scheme['name'], | |
'introduction': scheme['introduction'], | |
'score': score | |
}) | |
# Sort schemes by score (highest first) | |
recommended_schemes.sort(key=lambda x: x['score'], reverse=True) | |
# Limit to top 5 schemes | |
recommended_schemes = recommended_schemes[:5] | |
return jsonify({ | |
'schemes': recommended_schemes | |
}) | |
def scheme_details(scheme_id): | |
scheme = schemes.get(scheme_id) | |
if scheme: | |
return render_template('scheme_details.html', scheme=scheme) | |
return 'Scheme not found', 404 | |
if __name__ == '__main__': | |
# Use the port defined by Hugging Face Spaces or default to 7860 | |
port = int(os.environ.get('PORT', 7860)) | |
# Set host to 0.0.0.0 to make it accessible externally | |
app.run(host='0.0.0.0', port=port) |