File size: 7,610 Bytes
877e000 6e3dbdb 877e000 6e3dbdb 877e000 6e3dbdb 877e000 6e3dbdb 877e000 6e3dbdb 877e000 6e3dbdb 877e000 6e3dbdb 877e000 6e3dbdb 877e000 6e3dbdb 877e000 6e3dbdb 877e000 6e3dbdb |
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 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
# models/suggestions.py
from .model_loader import load_model
from .logging_config import logger
def generate_suggestions(text, data=None):
try:
# Ensure text is string
text = str(text) if text is not None else ""
# Safely convert data values
if data:
processed_data = {}
for key, value in data.items():
if isinstance(value, (int, float)):
processed_data[key] = str(value)
else:
processed_data[key] = str(value) if value is not None else ""
data = processed_data
# Initialize suggestions
suggestions = {
'improvements': [],
'warnings': [],
'recommendations': [],
'confidence': 0.0,
'model_used': 'static_fallback'
}
# Load model for analysis
try:
classifier = load_model("zero-shot-classification") # Use standard model instead of typeform
except Exception as e:
logger.error(f"Error loading model in suggestions: {str(e)}")
suggestions['warnings'].append({'type': 'error', 'confidence': 0.0, 'details': {'title': 'Model Error', 'message': f'Model loading error: {str(e)}', 'priority': 'high'}})
return suggestions
# Define suggestion categories
categories = [
"property description improvement",
"price adjustment needed",
"documentation required",
"verification needed",
"legal compliance issue",
"location verification needed",
"property specification update",
"image quality improvement",
"market value adjustment",
"contact information update"
]
# Analyze text with context
context = f"{text} property_data:{str(data) if data else ''}"
try:
result = classifier(context[:1000], categories, multi_label=True)
# Process results and generate suggestions
for label, score in zip(result['labels'], result['scores']):
if score > 0.3: # Only include if confidence is above 30%
suggestion_details = generate_suggestion_details(label, text, data)
if suggestion_details:
if 'improvement' in label.lower():
suggestions['improvements'].append(suggestion_details)
elif 'warning' in label.lower() or 'issue' in label.lower():
suggestions['warnings'].append(suggestion_details)
else:
suggestions['recommendations'].append(suggestion_details)
# Calculate overall confidence
if result['scores']:
suggestions['confidence'] = max(result['scores'])
suggestions['model_used'] = getattr(classifier, 'fallback_model', 'primary_model')
except Exception as e:
logger.error(f"Error in suggestions analysis: {str(e)}")
suggestions['warnings'].append({'type': 'error', 'confidence': 0.0, 'details': {'title': 'Analysis Error', 'message': f'Analysis error: {str(e)}', 'priority': 'medium'}})
return suggestions
except Exception as e:
logger.error(f"Error generating suggestions: {str(e)}")
return {
'improvements': [],
'warnings': [{'type': 'error', 'confidence': 0.0, 'details': {'title': 'System Error', 'message': f'System error: {str(e)}', 'priority': 'high'}}],
'recommendations': [],
'confidence': 0.0,
'model_used': 'static_fallback'
}
def generate_suggestion_details(suggestion_type, text, data):
"""Generate detailed suggestions based on type"""
try:
if 'description improvement' in suggestion_type.lower():
return {
'type': 'description_improvement',
'confidence': 0.8,
'details': {
'title': 'Improve Property Description',
'message': 'Add more details about amenities, location benefits, and unique features.',
'priority': 'medium',
'suggestions': [
'Include nearby landmarks and transportation',
'Describe interior features and finishes',
'Mention parking and security features',
'Add information about neighborhood'
]
}
}
elif 'price adjustment' in suggestion_type.lower():
return {
'type': 'price_adjustment',
'confidence': 0.7,
'details': {
'title': 'Review Property Price',
'message': 'Consider adjusting the price based on market conditions and property features.',
'priority': 'high',
'suggestions': [
'Compare with similar properties in the area',
'Consider current market trends',
'Factor in property condition and age',
'Include all amenities in pricing'
]
}
}
elif 'documentation required' in suggestion_type.lower():
return {
'type': 'documentation_required',
'confidence': 0.9,
'details': {
'title': 'Additional Documentation Needed',
'message': 'Provide more documents to increase property verification.',
'priority': 'high',
'suggestions': [
'Upload property title documents',
'Include recent utility bills',
'Add property tax receipts',
'Provide floor plan or layout'
]
}
}
elif 'verification needed' in suggestion_type.lower():
return {
'type': 'verification_needed',
'confidence': 0.8,
'details': {
'title': 'Property Verification Required',
'message': 'Additional verification steps needed for property authenticity.',
'priority': 'high',
'suggestions': [
'Verify property ownership',
'Check for any legal disputes',
'Confirm property dimensions',
'Validate address details'
]
}
}
else:
return {
'type': 'general_suggestion',
'confidence': 0.6,
'details': {
'title': 'General Improvement',
'message': 'Consider improving overall property listing quality.',
'priority': 'medium',
'suggestions': [
'Add more high-quality images',
'Include detailed specifications',
'Provide contact information',
'Update property status regularly'
]
}
}
except Exception as e:
logger.error(f"Error generating suggestion details: {str(e)}")
return None
|