| """
|
| Competitor analysis for investor relations.
|
| Uses free HuggingFace models with rule-based fallback.
|
| """
|
| import re
|
| from transformers import pipeline
|
|
|
| _analyzer = None
|
|
|
|
|
| def get_analyzer(model_name="google/flan-t5-base"):
|
| """Load text2text generation pipeline with fallback."""
|
| global _analyzer
|
| if _analyzer is None:
|
| try:
|
| _analyzer = pipeline(
|
| "text2text-generation",
|
| model=model_name,
|
| device=-1
|
| )
|
| except Exception:
|
| _analyzer = None
|
| return _analyzer
|
|
|
|
|
| def extract_competitor_info(competitors_data):
|
| """Parse competitor data into structured format."""
|
| lines = [l.strip() for l in competitors_data.split('\n') if l.strip()]
|
|
|
| competitors = []
|
| for line in lines:
|
|
|
| if ':' in line:
|
| parts = line.split(':', 1)
|
| name = parts[0].strip()
|
| details = parts[1].strip()
|
| competitors.append({'name': name, 'details': details})
|
| else:
|
| competitors.append({'name': f"Competitor {len(competitors)+1}", 'details': line})
|
|
|
| return competitors
|
|
|
|
|
| def rule_based_analysis(company_name, competitors_data, market_context):
|
| """Fallback: Structure competitor analysis using rules."""
|
| competitors = extract_competitor_info(competitors_data)
|
|
|
| analysis_parts = [f"## Competitive Landscape Analysis for {company_name}\n"]
|
|
|
|
|
| analysis_parts.append("### Market Context\n")
|
| analysis_parts.append(f"{market_context}\n")
|
|
|
|
|
| analysis_parts.append("\n### Competitive Position\n")
|
|
|
| for comp in competitors:
|
| analysis_parts.append(f"\n**{comp['name']}**")
|
| analysis_parts.append(f"- {comp['details']}")
|
|
|
|
|
| details_lower = comp['details'].lower()
|
|
|
| if any(word in details_lower for word in ['launch', 'new', 'expand', 'grow', 'acqui']):
|
| analysis_parts.append(f"- *Threat Level*: Active expansion and innovation")
|
|
|
| if any(word in details_lower for word in ['revenue', 'billion', 'million', '$']):
|
|
|
| import re
|
| revenue_match = re.search(r'\$?(\d+(?:\.\d+)?)\s*([BM])', comp['details'], re.I)
|
| if revenue_match:
|
| val = revenue_match.group(1)
|
| unit = revenue_match.group(2).upper()
|
| analysis_parts.append(f"- *Scale*: ${val}{unit} revenue")
|
|
|
|
|
| analysis_parts.append("\n### Strategic Implications for " + company_name + "\n")
|
|
|
| if 'ai' in competitors_data.lower() or 'ml' in competitors_data.lower():
|
| analysis_parts.append("- **Technology Focus**: Multiple competitors investing in AI/ML capabilities - maintain competitive technology roadmap")
|
|
|
| if 'expansion' in competitors_data.lower() or 'market' in competitors_data.lower():
|
| analysis_parts.append("- **Market Expansion**: Competitive pressure in geographic/market segment expansion")
|
|
|
| if 'acqui' in competitors_data.lower():
|
| analysis_parts.append("- **M&A Activity**: Active acquisition landscape - identify strategic targets")
|
|
|
| if 'pricing' in competitors_data.lower() or 'price' in competitors_data.lower():
|
| analysis_parts.append("- **Pricing Pressure**: Monitor competitive pricing dynamics and value proposition")
|
|
|
|
|
| analysis_parts.append("\n### Recommendations\n")
|
| analysis_parts.append(f"- Maintain differentiation through unique value propositions")
|
| analysis_parts.append(f"- Monitor competitor product launches and market positioning")
|
| analysis_parts.append(f"- Leverage strengths in areas where competitors show weakness")
|
| analysis_parts.append(f"- Consider strategic partnerships or acquisitions to strengthen market position")
|
|
|
| return "\n".join(analysis_parts)
|
|
|
|
|
| def analyze_competitors(company_name, competitors_data, market_context, model_name="google/flan-t5-base"):
|
| """
|
| Analyze competitive landscape for investor communications.
|
|
|
| Args:
|
| company_name: Name of the company
|
| competitors_data: Text containing competitor information
|
| market_context: Industry trends and market conditions
|
| model_name: HuggingFace model to use
|
|
|
| Returns:
|
| Formatted competitive analysis report
|
| """
|
| analyzer = get_analyzer(model_name)
|
|
|
| if analyzer is None:
|
|
|
| return rule_based_analysis(company_name, competitors_data, market_context)
|
|
|
|
|
| prompt = f"""Analyze the competitive landscape for {company_name}.
|
|
|
| Market Context:
|
| {market_context}
|
|
|
| Competitor Information:
|
| {competitors_data[:1500]}
|
|
|
| Provide a competitive analysis with:
|
| 1. Market positioning overview
|
| 2. Key competitor strengths and threats
|
| 3. Strategic implications for {company_name}
|
| 4. Recommendations for maintaining competitive advantage
|
|
|
| Analysis:"""
|
|
|
| try:
|
| result = analyzer(
|
| prompt,
|
| max_length=512,
|
| min_length=150,
|
| do_sample=False,
|
| temperature=0.7
|
| )
|
| analysis = result[0]['generated_text']
|
|
|
|
|
| formatted = f"""## Competitive Landscape Analysis for {company_name}
|
|
|
| ### Market Context
|
| {market_context}
|
|
|
| ### Competitive Analysis
|
| {analysis}
|
|
|
| ### Competitor Overview
|
| {competitors_data}
|
|
|
| ---
|
| *Note: This analysis should be supplemented with detailed market research and verified competitive intelligence.*
|
| """
|
| return formatted
|
|
|
| except Exception as e:
|
|
|
| return rule_based_analysis(company_name, competitors_data, market_context)
|
|
|