v1shal's picture
first_commit
b396e94
import json
from collections import Counter
def comparative_sentiment_analysis(company, articles, max_comparisons=10, chunk_size=5):
"""
Perform a comparative sentiment analysis on multiple articles.
"""
overall_sentiment_counts = Counter()
overall_coverage_differences = []
all_topics = []
if not articles:
print("No articles found for analysis.")
return {
"Company": company,
"Articles": [],
"Comparative Sentiment Score": {
"Sentiment Distribution": {},
"Coverage Differences": [],
"Topic Overlap": {"Common Topics": [], "Unique Topics Per Article": []}
},
"Final Sentiment Analysis": "No data available."
}
# Process articles in chunks
for start in range(0, len(articles), chunk_size):
chunk = articles[start:start + chunk_size]
# Count sentiment distribution
sentiment_counts = Counter(article["Sentiment"] for article in chunk)
overall_sentiment_counts.update(sentiment_counts)
# Identify coverage differences
for i in range(len(chunk) - 1):
for j in range(i + 1, len(chunk)):
if len(overall_coverage_differences) >= max_comparisons:
break
article1, article2 = chunk[i], chunk[j]
comparison = {
"Comparison": f"'{article1.get('Title', 'Article 1')}' vs '{article2.get('Title', 'Article 2')}'",
"Impact": f"{article1.get('Topics', [])} vs {article2.get('Topics', [])}"
}
overall_coverage_differences.append(comparison)
# Extract topics ensuring valid lists
topics = [set(article.get("Topics", [])) for article in chunk if isinstance(article.get("Topics", list), list) and article.get("Topics", [])]
all_topics.extend(topics)
# Debugging Output
print("All Topics Extracted:", all_topics)
# Determine common and unique topics
if len(all_topics) == 0:
common_topics = set() # No topics found
elif len(all_topics) == 1:
common_topics = all_topics[0] # Only one article, take its topics as common
else:
common_topics = set.intersection(*all_topics) # Find intersection normally
unique_topics = [{"Article": i + 1, "Unique Topics": list(topics - common_topics)}
for i, topics in enumerate(all_topics)]
# Convert to list for JSON output
common_topics = list(common_topics)
print("Common Topics:", common_topics)
# Final sentiment summary
final_analysis = "The news coverage is mostly "
if overall_sentiment_counts["Positive"] > overall_sentiment_counts["Negative"]:
final_analysis += "positive, indicating potential growth."
elif overall_sentiment_counts["Negative"] > overall_sentiment_counts["Positive"]:
final_analysis += "negative, suggesting challenges ahead."
else:
final_analysis += "balanced, with mixed reactions."
# Final JSON structure
return {
"Comparative Sentiment Score": {
"Sentiment Distribution": dict(overall_sentiment_counts),
"Coverage Differences": overall_coverage_differences,
"Topic Overlap": {
"Common Topics": common_topics,
"Unique Topics Per Article": unique_topics
}
},
"Final Sentiment Analysis": final_analysis
}
# if __name__ == "__main__":
# articles = [
# {
# "Title": "Agentic AI startup AMT aims to be 'Google Adwords for influencers,' raises seed round",
# "Summary": "Agentic Marketing Technologies (AMT) has raised $3.5 million in a seed funding round led by San Francisco-based VC NFX .<n>AMT works by getting its AI agent, dubbed Lyra, to talk to influencers using natural language .<n>The company claims Lyra can also autonomously find influencers that match a campaign’s goals .",
# "Sentiment": "neutral",
# "Topics": [
# "influencer",
# "marketing"
# ]
# },
# {
# "Title": "Google Seals $32 Billion Deal for Cyber Start-Up Wiz",
# "Summary": "Google agreed to buy Wiz, a fast-growing cybersecurity start-up, for $32 billion .<n>The all-cash deal would be Google's largest, easily surpassing its $12.5 billion purchase of Motorola Mobility in 2012 .<n>In July, Wiz rejected Google’s $23 billion takeover offer, saying it wanted to pursue an initial public offering .",
# "Sentiment": "neutral",
# "Topics": [
# "wiz",
# "google"
# ]
# },
# {
# "Title": "Google's new Severance Easter egg is one only innies will understand",
# "Summary": "Just search for Severance and Google will pepper your screen with blue balloons .<n>Severance producer and frequent director Ben Stiller shared his show’s new Easter egg on X last night .<n>Severance’s season two finale airs this Friday on Apple TV Plus .",
# "Sentiment": "positive",
# "Topics": [
# "severance"
# ]
# }
# ]
# result = comparative_sentiment_analysis(articles)
# print(json.dumps(result, indent=4))