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