[{"data":1,"prerenderedAt":4072},["ShallowReactive",2],{"blog-news-sentiment-analysis":3},{"id":4,"title":5,"author":6,"body":7,"date":4060,"description":4061,"draft":4062,"extension":4063,"image":4064,"meta":4065,"navigation":194,"path":4066,"seo":4067,"sitemap":4068,"stem":4069,"tags":4070,"__hash__":4071},"blog\u002Fblog\u002Fnews-sentiment-analysis.md","Using Built-in Sentiment Analysis with AllNewsAPI","AllNewsAPI Team",{"type":8,"value":9,"toc":4039},"minimark",[10,14,19,22,38,42,45,61,168,171,175,178,305,309,312,392,396,399,476,480,483,876,880,883,3017,3021,3024,3363,3367,3371,3374,3482,3485,3489,3492,3689,3693,3696,3885,3889,3933,3937,3940,3966,3969,3994,3998,4001,4009,4013,4035],[11,12,13],"p",{},"Great news! AllNewsAPI includes built-in AI-powered sentiment analysis for every article. This tutorial shows you how to leverage this feature to build sentiment-aware news applications without any additional machine learning setup.",[15,16,18],"h2",{"id":17},"what-is-sentiment-analysis","What is Sentiment Analysis?",[11,20,21],{},"Sentiment analysis (also called opinion mining) uses machine learning to determine whether text expresses positive, negative, or neutral sentiment. For news applications, this helps users:",[23,24,25,29,32,35],"ul",{},[26,27,28],"li",{},"Quickly gauge article tone",[26,30,31],{},"Filter news by sentiment",[26,33,34],{},"Track sentiment trends over time",[26,36,37],{},"Identify controversial topics",[15,39,41],{"id":40},"allnewsapis-built-in-sentiment-feature","AllNewsAPI's Built-in Sentiment Feature",[11,43,44],{},"Every article returned by AllNewsAPI includes two sentiment fields:",[46,47,48,55],"ol",{},[26,49,50,54],{},[51,52,53],"strong",{},"sentiment",": A simple classification (positive, negative, or neutral)",[26,56,57,60],{},[51,58,59],{},"sentimentScores",": Detailed confidence scores for each sentiment category",[62,63,68],"pre",{"className":64,"code":65,"language":66,"meta":67,"style":67},"language-json shiki shiki-themes github-light github-dark","{\n  \"title\": \"Tech Company Announces Breakthrough Innovation\",\n  \"sentiment\": \"positive\",\n  \"sentimentScores\": {\n    \"positive\": 0.85,\n    \"neutral\": 0.12,\n    \"negative\": 0.03\n  }\n}\n","json","",[69,70,71,80,97,110,119,132,145,156,162],"code",{"__ignoreMap":67},[72,73,76],"span",{"class":74,"line":75},"line",1,[72,77,79],{"class":78},"sVt8B","{\n",[72,81,83,87,90,94],{"class":74,"line":82},2,[72,84,86],{"class":85},"sj4cs","  \"title\"",[72,88,89],{"class":78},": ",[72,91,93],{"class":92},"sZZnC","\"Tech Company Announces Breakthrough Innovation\"",[72,95,96],{"class":78},",\n",[72,98,100,103,105,108],{"class":74,"line":99},3,[72,101,102],{"class":85},"  \"sentiment\"",[72,104,89],{"class":78},[72,106,107],{"class":92},"\"positive\"",[72,109,96],{"class":78},[72,111,113,116],{"class":74,"line":112},4,[72,114,115],{"class":85},"  \"sentimentScores\"",[72,117,118],{"class":78},": {\n",[72,120,122,125,127,130],{"class":74,"line":121},5,[72,123,124],{"class":85},"    \"positive\"",[72,126,89],{"class":78},[72,128,129],{"class":85},"0.85",[72,131,96],{"class":78},[72,133,135,138,140,143],{"class":74,"line":134},6,[72,136,137],{"class":85},"    \"neutral\"",[72,139,89],{"class":78},[72,141,142],{"class":85},"0.12",[72,144,96],{"class":78},[72,146,148,151,153],{"class":74,"line":147},7,[72,149,150],{"class":85},"    \"negative\"",[72,152,89],{"class":78},[72,154,155],{"class":85},"0.03\n",[72,157,159],{"class":74,"line":158},8,[72,160,161],{"class":78},"  }\n",[72,163,165],{"class":74,"line":164},9,[72,166,167],{"class":78},"}\n",[11,169,170],{},"This means you can start building sentiment-aware features immediately without any ML setup!",[15,172,174],{"id":173},"step-1-fetching-news-with-sentiment-data","Step 1: Fetching News with Sentiment Data",[11,176,177],{},"Simply fetch news from AllNewsAPI - sentiment data is included automatically:",[62,179,183],{"className":180,"code":181,"language":182,"meta":67,"style":67},"language-javascript shiki shiki-themes github-light github-dark","const API_KEY = 'your_api_key_here';\n\nasync function fetchNewsWithSentiment(country = 'us') {\n  const response = await fetch(\n    `https:\u002F\u002Fapi.allnewsapi.com\u002Fheadlines?apikey=${API_KEY}&country=${country}`\n  );\n  \n  const data = await response.json();\n  \n  \u002F\u002F Each article already includes sentiment and sentimentScores!\n  return data.articles;\n}\n\n\u002F\u002F Usage\nconst articles = await fetchNewsWithSentiment('us');\n\narticles.forEach(article => {\n  console.log(`Title: ${article.title}`);\n  console.log(`Sentiment: ${article.sentiment}`);\n  console.log(`Scores:`, article.sentimentScores);\n  console.log('---');\n});\n","javascript",[69,184,185,190,196,201,206,211,216,221,226,230,236,242,247,252,258,264,269,275,281,287,293,299],{"__ignoreMap":67},[72,186,187],{"class":74,"line":75},[72,188,189],{},"const API_KEY = 'your_api_key_here';\n",[72,191,192],{"class":74,"line":82},[72,193,195],{"emptyLinePlaceholder":194},true,"\n",[72,197,198],{"class":74,"line":99},[72,199,200],{},"async function fetchNewsWithSentiment(country = 'us') {\n",[72,202,203],{"class":74,"line":112},[72,204,205],{},"  const response = await fetch(\n",[72,207,208],{"class":74,"line":121},[72,209,210],{},"    `https:\u002F\u002Fapi.allnewsapi.com\u002Fheadlines?apikey=${API_KEY}&country=${country}`\n",[72,212,213],{"class":74,"line":134},[72,214,215],{},"  );\n",[72,217,218],{"class":74,"line":147},[72,219,220],{},"  \n",[72,222,223],{"class":74,"line":158},[72,224,225],{},"  const data = await response.json();\n",[72,227,228],{"class":74,"line":164},[72,229,220],{},[72,231,233],{"class":74,"line":232},10,[72,234,235],{},"  \u002F\u002F Each article already includes sentiment and sentimentScores!\n",[72,237,239],{"class":74,"line":238},11,[72,240,241],{},"  return data.articles;\n",[72,243,245],{"class":74,"line":244},12,[72,246,167],{},[72,248,250],{"class":74,"line":249},13,[72,251,195],{"emptyLinePlaceholder":194},[72,253,255],{"class":74,"line":254},14,[72,256,257],{},"\u002F\u002F Usage\n",[72,259,261],{"class":74,"line":260},15,[72,262,263],{},"const articles = await fetchNewsWithSentiment('us');\n",[72,265,267],{"class":74,"line":266},16,[72,268,195],{"emptyLinePlaceholder":194},[72,270,272],{"class":74,"line":271},17,[72,273,274],{},"articles.forEach(article => {\n",[72,276,278],{"class":74,"line":277},18,[72,279,280],{},"  console.log(`Title: ${article.title}`);\n",[72,282,284],{"class":74,"line":283},19,[72,285,286],{},"  console.log(`Sentiment: ${article.sentiment}`);\n",[72,288,290],{"class":74,"line":289},20,[72,291,292],{},"  console.log(`Scores:`, article.sentimentScores);\n",[72,294,296],{"class":74,"line":295},21,[72,297,298],{},"  console.log('---');\n",[72,300,302],{"class":74,"line":301},22,[72,303,304],{},"});\n",[15,306,308],{"id":307},"step-2-filtering-by-sentiment","Step 2: Filtering by Sentiment",[11,310,311],{},"Filter articles based on their sentiment classification:",[62,313,315],{"className":180,"code":314,"language":182,"meta":67,"style":67},"function filterBySentiment(articles, sentimentType) {\n  return articles.filter(article => article.sentiment === sentimentType);\n}\n\n\u002F\u002F Get only positive news\nconst positiveNews = filterBySentiment(articles, 'positive');\n\n\u002F\u002F Get only negative news\nconst negativeNews = filterBySentiment(articles, 'negative');\n\n\u002F\u002F Get neutral news\nconst neutralNews = filterBySentiment(articles, 'neutral');\n\nconsole.log(`Positive articles: ${positiveNews.length}`);\nconsole.log(`Negative articles: ${negativeNews.length}`);\nconsole.log(`Neutral articles: ${neutralNews.length}`);\n",[69,316,317,322,327,331,335,340,345,349,354,359,363,368,373,377,382,387],{"__ignoreMap":67},[72,318,319],{"class":74,"line":75},[72,320,321],{},"function filterBySentiment(articles, sentimentType) {\n",[72,323,324],{"class":74,"line":82},[72,325,326],{},"  return articles.filter(article => article.sentiment === sentimentType);\n",[72,328,329],{"class":74,"line":99},[72,330,167],{},[72,332,333],{"class":74,"line":112},[72,334,195],{"emptyLinePlaceholder":194},[72,336,337],{"class":74,"line":121},[72,338,339],{},"\u002F\u002F Get only positive news\n",[72,341,342],{"class":74,"line":134},[72,343,344],{},"const positiveNews = filterBySentiment(articles, 'positive');\n",[72,346,347],{"class":74,"line":147},[72,348,195],{"emptyLinePlaceholder":194},[72,350,351],{"class":74,"line":158},[72,352,353],{},"\u002F\u002F Get only negative news\n",[72,355,356],{"class":74,"line":164},[72,357,358],{},"const negativeNews = filterBySentiment(articles, 'negative');\n",[72,360,361],{"class":74,"line":232},[72,362,195],{"emptyLinePlaceholder":194},[72,364,365],{"class":74,"line":238},[72,366,367],{},"\u002F\u002F Get neutral news\n",[72,369,370],{"class":74,"line":244},[72,371,372],{},"const neutralNews = filterBySentiment(articles, 'neutral');\n",[72,374,375],{"class":74,"line":249},[72,376,195],{"emptyLinePlaceholder":194},[72,378,379],{"class":74,"line":254},[72,380,381],{},"console.log(`Positive articles: ${positiveNews.length}`);\n",[72,383,384],{"class":74,"line":260},[72,385,386],{},"console.log(`Negative articles: ${negativeNews.length}`);\n",[72,388,389],{"class":74,"line":266},[72,390,391],{},"console.log(`Neutral articles: ${neutralNews.length}`);\n",[15,393,395],{"id":394},"step-3-sorting-by-sentiment-confidence","Step 3: Sorting by Sentiment Confidence",[11,397,398],{},"Sort articles by how confident the sentiment analysis is:",[62,400,402],{"className":180,"code":401,"language":182,"meta":67,"style":67},"function sortBySentimentConfidence(articles, sentimentType) {\n  return articles\n    .filter(article => article.sentiment === sentimentType)\n    .sort((a, b) => {\n      const scoreA = a.sentimentScores[sentimentType];\n      const scoreB = b.sentimentScores[sentimentType];\n      return scoreB - scoreA;\n    });\n}\n\n\u002F\u002F Get most confidently positive articles\nconst mostPositive = sortBySentimentConfidence(articles, 'positive');\n\nconsole.log('Most positive article:', mostPositive[0].title);\nconsole.log('Positive score:', mostPositive[0].sentimentScores.positive);\n",[69,403,404,409,414,419,424,429,434,439,444,448,452,457,462,466,471],{"__ignoreMap":67},[72,405,406],{"class":74,"line":75},[72,407,408],{},"function sortBySentimentConfidence(articles, sentimentType) {\n",[72,410,411],{"class":74,"line":82},[72,412,413],{},"  return articles\n",[72,415,416],{"class":74,"line":99},[72,417,418],{},"    .filter(article => article.sentiment === sentimentType)\n",[72,420,421],{"class":74,"line":112},[72,422,423],{},"    .sort((a, b) => {\n",[72,425,426],{"class":74,"line":121},[72,427,428],{},"      const scoreA = a.sentimentScores[sentimentType];\n",[72,430,431],{"class":74,"line":134},[72,432,433],{},"      const scoreB = b.sentimentScores[sentimentType];\n",[72,435,436],{"class":74,"line":147},[72,437,438],{},"      return scoreB - scoreA;\n",[72,440,441],{"class":74,"line":158},[72,442,443],{},"    });\n",[72,445,446],{"class":74,"line":164},[72,447,167],{},[72,449,450],{"class":74,"line":232},[72,451,195],{"emptyLinePlaceholder":194},[72,453,454],{"class":74,"line":238},[72,455,456],{},"\u002F\u002F Get most confidently positive articles\n",[72,458,459],{"class":74,"line":244},[72,460,461],{},"const mostPositive = sortBySentimentConfidence(articles, 'positive');\n",[72,463,464],{"class":74,"line":249},[72,465,195],{"emptyLinePlaceholder":194},[72,467,468],{"class":74,"line":254},[72,469,470],{},"console.log('Most positive article:', mostPositive[0].title);\n",[72,472,473],{"class":74,"line":260},[72,474,475],{},"console.log('Positive score:', mostPositive[0].sentimentScores.positive);\n",[15,477,479],{"id":478},"step-4-building-a-complete-news-sentiment-dashboard","Step 4: Building a Complete News Sentiment Dashboard",[11,481,482],{},"Create a full-featured sentiment analysis dashboard using AllNewsAPI's built-in sentiment data:",[62,484,486],{"className":180,"code":485,"language":182,"meta":67,"style":67},"\u002F\u002F sentiment-service.js\nclass NewsSentimentService {\n  constructor(apiKey) {\n    this.apiKey = apiKey;\n    this.apiUrl = 'https:\u002F\u002Fapi.allnewsapi.com\u002Fheadlines';\n  }\n  \n  async fetchNews(country = 'us', category = null) {\n    let url = `${this.apiUrl}?apikey=${this.apiKey}&country=${country}`;\n    if (category) url += `&category=${category}`;\n    \n    const response = await fetch(url);\n    const data = await response.json();\n    \n    \u002F\u002F Articles already include sentiment and sentimentScores from API\n    return data.articles || [];\n  }\n  \n  getSentimentStats(articles) {\n    const stats = {\n      total: articles.length,\n      positive: 0,\n      negative: 0,\n      neutral: 0,\n      averagePositiveScore: 0,\n      averageNegativeScore: 0,\n      averageNeutralScore: 0\n    };\n    \n    let totalPositive = 0;\n    let totalNegative = 0;\n    let totalNeutral = 0;\n    \n    articles.forEach(article => {\n      \u002F\u002F Use the built-in sentiment classification\n      stats[article.sentiment]++;\n      \n      \u002F\u002F Accumulate scores for averages\n      totalPositive += article.sentimentScores.positive;\n      totalNegative += article.sentimentScores.negative;\n      totalNeutral += article.sentimentScores.neutral;\n    });\n    \n    \u002F\u002F Calculate average scores\n    stats.averagePositiveScore = totalPositive \u002F articles.length;\n    stats.averageNegativeScore = totalNegative \u002F articles.length;\n    stats.averageNeutralScore = totalNeutral \u002F articles.length;\n    \n    return stats;\n  }\n  \n  filterBySentiment(articles, sentimentType) {\n    return articles.filter(article => article.sentiment === sentimentType);\n  }\n  \n  sortBySentimentScore(articles, sentimentType, order = 'desc') {\n    return [...articles].sort((a, b) => {\n      const scoreA = a.sentimentScores[sentimentType];\n      const scoreB = b.sentimentScores[sentimentType];\n      return order === 'desc' ? scoreB - scoreA : scoreA - scoreB;\n    });\n  }\n  \n  getHighConfidenceArticles(articles, sentimentType, threshold = 0.7) {\n    return articles.filter(article => \n      article.sentiment === sentimentType && \n      article.sentimentScores[sentimentType] >= threshold\n    );\n  }\n}\n\nmodule.exports = NewsSentimentService;\n",[69,487,488,493,498,503,508,513,517,521,526,531,536,541,546,551,555,560,565,569,573,578,583,588,593,599,605,611,617,623,629,634,640,646,652,657,663,669,675,681,687,693,699,705,710,715,721,727,733,739,744,750,755,760,766,772,777,782,788,794,799,804,810,815,820,825,831,837,843,849,855,860,865,870],{"__ignoreMap":67},[72,489,490],{"class":74,"line":75},[72,491,492],{},"\u002F\u002F sentiment-service.js\n",[72,494,495],{"class":74,"line":82},[72,496,497],{},"class NewsSentimentService {\n",[72,499,500],{"class":74,"line":99},[72,501,502],{},"  constructor(apiKey) {\n",[72,504,505],{"class":74,"line":112},[72,506,507],{},"    this.apiKey = apiKey;\n",[72,509,510],{"class":74,"line":121},[72,511,512],{},"    this.apiUrl = 'https:\u002F\u002Fapi.allnewsapi.com\u002Fheadlines';\n",[72,514,515],{"class":74,"line":134},[72,516,161],{},[72,518,519],{"class":74,"line":147},[72,520,220],{},[72,522,523],{"class":74,"line":158},[72,524,525],{},"  async fetchNews(country = 'us', category = null) {\n",[72,527,528],{"class":74,"line":164},[72,529,530],{},"    let url = `${this.apiUrl}?apikey=${this.apiKey}&country=${country}`;\n",[72,532,533],{"class":74,"line":232},[72,534,535],{},"    if (category) url += `&category=${category}`;\n",[72,537,538],{"class":74,"line":238},[72,539,540],{},"    \n",[72,542,543],{"class":74,"line":244},[72,544,545],{},"    const response = await fetch(url);\n",[72,547,548],{"class":74,"line":249},[72,549,550],{},"    const data = await response.json();\n",[72,552,553],{"class":74,"line":254},[72,554,540],{},[72,556,557],{"class":74,"line":260},[72,558,559],{},"    \u002F\u002F Articles already include sentiment and sentimentScores from API\n",[72,561,562],{"class":74,"line":266},[72,563,564],{},"    return data.articles || [];\n",[72,566,567],{"class":74,"line":271},[72,568,161],{},[72,570,571],{"class":74,"line":277},[72,572,220],{},[72,574,575],{"class":74,"line":283},[72,576,577],{},"  getSentimentStats(articles) {\n",[72,579,580],{"class":74,"line":289},[72,581,582],{},"    const stats = {\n",[72,584,585],{"class":74,"line":295},[72,586,587],{},"      total: articles.length,\n",[72,589,590],{"class":74,"line":301},[72,591,592],{},"      positive: 0,\n",[72,594,596],{"class":74,"line":595},23,[72,597,598],{},"      negative: 0,\n",[72,600,602],{"class":74,"line":601},24,[72,603,604],{},"      neutral: 0,\n",[72,606,608],{"class":74,"line":607},25,[72,609,610],{},"      averagePositiveScore: 0,\n",[72,612,614],{"class":74,"line":613},26,[72,615,616],{},"      averageNegativeScore: 0,\n",[72,618,620],{"class":74,"line":619},27,[72,621,622],{},"      averageNeutralScore: 0\n",[72,624,626],{"class":74,"line":625},28,[72,627,628],{},"    };\n",[72,630,632],{"class":74,"line":631},29,[72,633,540],{},[72,635,637],{"class":74,"line":636},30,[72,638,639],{},"    let totalPositive = 0;\n",[72,641,643],{"class":74,"line":642},31,[72,644,645],{},"    let totalNegative = 0;\n",[72,647,649],{"class":74,"line":648},32,[72,650,651],{},"    let totalNeutral = 0;\n",[72,653,655],{"class":74,"line":654},33,[72,656,540],{},[72,658,660],{"class":74,"line":659},34,[72,661,662],{},"    articles.forEach(article => {\n",[72,664,666],{"class":74,"line":665},35,[72,667,668],{},"      \u002F\u002F Use the built-in sentiment classification\n",[72,670,672],{"class":74,"line":671},36,[72,673,674],{},"      stats[article.sentiment]++;\n",[72,676,678],{"class":74,"line":677},37,[72,679,680],{},"      \n",[72,682,684],{"class":74,"line":683},38,[72,685,686],{},"      \u002F\u002F Accumulate scores for averages\n",[72,688,690],{"class":74,"line":689},39,[72,691,692],{},"      totalPositive += article.sentimentScores.positive;\n",[72,694,696],{"class":74,"line":695},40,[72,697,698],{},"      totalNegative += article.sentimentScores.negative;\n",[72,700,702],{"class":74,"line":701},41,[72,703,704],{},"      totalNeutral += article.sentimentScores.neutral;\n",[72,706,708],{"class":74,"line":707},42,[72,709,443],{},[72,711,713],{"class":74,"line":712},43,[72,714,540],{},[72,716,718],{"class":74,"line":717},44,[72,719,720],{},"    \u002F\u002F Calculate average scores\n",[72,722,724],{"class":74,"line":723},45,[72,725,726],{},"    stats.averagePositiveScore = totalPositive \u002F articles.length;\n",[72,728,730],{"class":74,"line":729},46,[72,731,732],{},"    stats.averageNegativeScore = totalNegative \u002F articles.length;\n",[72,734,736],{"class":74,"line":735},47,[72,737,738],{},"    stats.averageNeutralScore = totalNeutral \u002F articles.length;\n",[72,740,742],{"class":74,"line":741},48,[72,743,540],{},[72,745,747],{"class":74,"line":746},49,[72,748,749],{},"    return stats;\n",[72,751,753],{"class":74,"line":752},50,[72,754,161],{},[72,756,758],{"class":74,"line":757},51,[72,759,220],{},[72,761,763],{"class":74,"line":762},52,[72,764,765],{},"  filterBySentiment(articles, sentimentType) {\n",[72,767,769],{"class":74,"line":768},53,[72,770,771],{},"    return articles.filter(article => article.sentiment === sentimentType);\n",[72,773,775],{"class":74,"line":774},54,[72,776,161],{},[72,778,780],{"class":74,"line":779},55,[72,781,220],{},[72,783,785],{"class":74,"line":784},56,[72,786,787],{},"  sortBySentimentScore(articles, sentimentType, order = 'desc') {\n",[72,789,791],{"class":74,"line":790},57,[72,792,793],{},"    return [...articles].sort((a, b) => {\n",[72,795,797],{"class":74,"line":796},58,[72,798,428],{},[72,800,802],{"class":74,"line":801},59,[72,803,433],{},[72,805,807],{"class":74,"line":806},60,[72,808,809],{},"      return order === 'desc' ? scoreB - scoreA : scoreA - scoreB;\n",[72,811,813],{"class":74,"line":812},61,[72,814,443],{},[72,816,818],{"class":74,"line":817},62,[72,819,161],{},[72,821,823],{"class":74,"line":822},63,[72,824,220],{},[72,826,828],{"class":74,"line":827},64,[72,829,830],{},"  getHighConfidenceArticles(articles, sentimentType, threshold = 0.7) {\n",[72,832,834],{"class":74,"line":833},65,[72,835,836],{},"    return articles.filter(article => \n",[72,838,840],{"class":74,"line":839},66,[72,841,842],{},"      article.sentiment === sentimentType && \n",[72,844,846],{"class":74,"line":845},67,[72,847,848],{},"      article.sentimentScores[sentimentType] >= threshold\n",[72,850,852],{"class":74,"line":851},68,[72,853,854],{},"    );\n",[72,856,858],{"class":74,"line":857},69,[72,859,161],{},[72,861,863],{"class":74,"line":862},70,[72,864,167],{},[72,866,868],{"class":74,"line":867},71,[72,869,195],{"emptyLinePlaceholder":194},[72,871,873],{"class":74,"line":872},72,[72,874,875],{},"module.exports = NewsSentimentService;\n",[15,877,879],{"id":878},"step-5-creating-the-frontend","Step 5: Creating the Frontend",[11,881,882],{},"Build a React component to display sentiment using AllNewsAPI's built-in data:",[62,884,888],{"className":885,"code":886,"language":887,"meta":67,"style":67},"language-jsx shiki shiki-themes github-light github-dark","import React, { useState, useEffect } from 'react';\nimport '.\u002FSentimentDashboard.css';\n\nfunction SentimentDashboard() {\n  const [articles, setArticles] = useState([]);\n  const [filter, setFilter] = useState('all');\n  const [stats, setStats] = useState(null);\n  const [loading, setLoading] = useState(true);\n  \n  useEffect(() => {\n    fetchNewsWithSentiment();\n  }, []);\n  \n  async function fetchNewsWithSentiment() {\n    try {\n      const API_KEY = process.env.REACT_APP_NEWS_API_KEY;\n      const response = await fetch(\n        `https:\u002F\u002Fapi.allnewsapi.com\u002Fheadlines?apikey=${API_KEY}&country=us`\n      );\n      const data = await response.json();\n      \n      \u002F\u002F Articles already include sentiment data!\n      setArticles(data.articles);\n      setStats(calculateStats(data.articles));\n    } catch (error) {\n      console.error('Error fetching news:', error);\n    } finally {\n      setLoading(false);\n    }\n  }\n  \n  function calculateStats(articles) {\n    const stats = { total: articles.length, positive: 0, negative: 0, neutral: 0 };\n    articles.forEach(article => {\n      stats[article.sentiment]++;\n    });\n    return stats;\n  }\n  \n  const filteredArticles = filter === 'all'\n    ? articles\n    : articles.filter(a => a.sentiment === filter);\n  \n  function getSentimentColor(sentiment) {\n    switch (sentiment) {\n      case 'positive': return '#4caf50';\n      case 'negative': return '#f44336';\n      default: return '#9e9e9e';\n    }\n  }\n  \n  function getSentimentEmoji(sentiment) {\n    switch (sentiment) {\n      case 'positive': return '😊';\n      case 'negative': return '😟';\n      default: return '😐';\n    }\n  }\n  \n  if (loading) return \u003Cdiv>Loading...\u003C\u002Fdiv>;\n  \n  return (\n    \u003Cdiv className=\"sentiment-dashboard\">\n      \u003Ch1>News Sentiment Analysis\u003C\u002Fh1>\n      \u003Cp className=\"subtitle\">Powered by AllNewsAPI's built-in AI sentiment analysis\u003C\u002Fp>\n      \n      {stats && (\n        \u003Cdiv className=\"stats-panel\">\n          \u003Cdiv className=\"stat\">\n            \u003Cspan className=\"stat-label\">Total Articles\u003C\u002Fspan>\n            \u003Cspan className=\"stat-value\">{stats.total}\u003C\u002Fspan>\n          \u003C\u002Fdiv>\n          \u003Cdiv className=\"stat positive\">\n            \u003Cspan className=\"stat-label\">Positive\u003C\u002Fspan>\n            \u003Cspan className=\"stat-value\">{stats.positive}\u003C\u002Fspan>\n          \u003C\u002Fdiv>\n          \u003Cdiv className=\"stat neutral\">\n            \u003Cspan className=\"stat-label\">Neutral\u003C\u002Fspan>\n            \u003Cspan className=\"stat-value\">{stats.neutral}\u003C\u002Fspan>\n          \u003C\u002Fdiv>\n          \u003Cdiv className=\"stat negative\">\n            \u003Cspan className=\"stat-label\">Negative\u003C\u002Fspan>\n            \u003Cspan className=\"stat-value\">{stats.negative}\u003C\u002Fspan>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      )}\n      \n      \u003Cdiv className=\"filters\">\n        \u003Cbutton \n          className={filter === 'all' ? 'active' : ''}\n          onClick={() => setFilter('all')}\n        >\n          All\n        \u003C\u002Fbutton>\n        \u003Cbutton \n          className={filter === 'positive' ? 'active' : ''}\n          onClick={() => setFilter('positive')}\n        >\n          😊 Positive\n        \u003C\u002Fbutton>\n        \u003Cbutton \n          className={filter === 'neutral' ? 'active' : ''}\n          onClick={() => setFilter('neutral')}\n        >\n          😐 Neutral\n        \u003C\u002Fbutton>\n        \u003Cbutton \n          className={filter === 'negative' ? 'active' : ''}\n          onClick={() => setFilter('negative')}\n        >\n          😟 Negative\n        \u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n      \n      \u003Cdiv className=\"articles-grid\">\n        {filteredArticles.map((article, index) => (\n          \u003Cdiv key={index} className=\"article-card\">\n            \u003Cdiv \n              className=\"sentiment-badge\"\n              style={{ backgroundColor: getSentimentColor(article.sentiment) }}\n            >\n              {getSentimentEmoji(article.sentiment)}\n              {article.sentiment}\n            \u003C\u002Fdiv>\n            \n            {\u002F* Show confidence scores *\u002F}\n            \u003Cdiv className=\"sentiment-scores\">\n              \u003Cdiv className=\"score-bar\">\n                \u003Cspan>Positive: {(article.sentimentScores.positive * 100).toFixed(0)}%\u003C\u002Fspan>\n                \u003Cdiv className=\"bar\" style={{ width: `${article.sentimentScores.positive * 100}%`, backgroundColor: '#4caf50' }} \u002F>\n              \u003C\u002Fdiv>\n              \u003Cdiv className=\"score-bar\">\n                \u003Cspan>Neutral: {(article.sentimentScores.neutral * 100).toFixed(0)}%\u003C\u002Fspan>\n                \u003Cdiv className=\"bar\" style={{ width: `${article.sentimentScores.neutral * 100}%`, backgroundColor: '#9e9e9e' }} \u002F>\n              \u003C\u002Fdiv>\n              \u003Cdiv className=\"score-bar\">\n                \u003Cspan>Negative: {(article.sentimentScores.negative * 100).toFixed(0)}%\u003C\u002Fspan>\n                \u003Cdiv className=\"bar\" style={{ width: `${article.sentimentScores.negative * 100}%`, backgroundColor: '#f44336' }} \u002F>\n              \u003C\u002Fdiv>\n            \u003C\u002Fdiv>\n            \n            \u003Ch3>{article.title}\u003C\u002Fh3>\n            \u003Cp>{article.description}\u003C\u002Fp>\n            \n            \u003Cdiv className=\"article-meta\">\n              \u003Cspan>{article.source.name}\u003C\u002Fspan>\n              \u003Cspan>{new Date(article.publishedAt).toLocaleDateString()}\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n            \n            \u003Ca href={article.url} target=\"_blank\" rel=\"noopener noreferrer\">\n              Read More →\n            \u003C\u002Fa>\n          \u003C\u002Fdiv>\n        ))}\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  );\n}\n\nexport default SentimentDashboard;\n","jsx",[69,889,890,908,917,921,933,962,991,1018,1045,1049,1063,1071,1076,1080,1093,1100,1119,1137,1148,1153,1171,1175,1181,1189,1202,1213,1229,1238,1250,1255,1259,1263,1279,1314,1332,1342,1346,1354,1358,1362,1380,1388,1413,1417,1430,1438,1456,1472,1486,1490,1494,1498,1511,1517,1532,1547,1560,1564,1568,1572,1597,1601,1609,1627,1642,1662,1666,1676,1692,1708,1729,1749,1758,1774,1794,1814,1823,1839,1859,1879,1888,1904,1924,1944,1953,1963,1969,1974,1990,2001,2031,2054,2060,2066,2075,2084,2107,2127,2132,2138,2147,2156,2180,2200,2205,2211,2220,2229,2252,2272,2277,2283,2292,2302,2307,2323,2349,2374,2383,2394,2411,2417,2429,2435,2445,2451,2462,2478,2495,2529,2583,2593,2608,2636,2681,2690,2705,2733,2778,2787,2796,2801,2816,2830,2835,2851,2865,2894,2903,2908,2941,2947,2956,2965,2971,2980,2990,2995,3000,3005],{"__ignoreMap":67},[72,891,892,896,899,902,905],{"class":74,"line":75},[72,893,895],{"class":894},"szBVR","import",[72,897,898],{"class":78}," React, { useState, useEffect } ",[72,900,901],{"class":894},"from",[72,903,904],{"class":92}," 'react'",[72,906,907],{"class":78},";\n",[72,909,910,912,915],{"class":74,"line":82},[72,911,895],{"class":894},[72,913,914],{"class":92}," '.\u002FSentimentDashboard.css'",[72,916,907],{"class":78},[72,918,919],{"class":74,"line":99},[72,920,195],{"emptyLinePlaceholder":194},[72,922,923,926,930],{"class":74,"line":112},[72,924,925],{"class":894},"function",[72,927,929],{"class":928},"sScJk"," SentimentDashboard",[72,931,932],{"class":78},"() {\n",[72,934,935,938,941,944,947,950,953,956,959],{"class":74,"line":121},[72,936,937],{"class":894},"  const",[72,939,940],{"class":78}," [",[72,942,943],{"class":85},"articles",[72,945,946],{"class":78},", ",[72,948,949],{"class":85},"setArticles",[72,951,952],{"class":78},"] ",[72,954,955],{"class":894},"=",[72,957,958],{"class":928}," useState",[72,960,961],{"class":78},"([]);\n",[72,963,964,966,968,971,973,976,978,980,982,985,988],{"class":74,"line":134},[72,965,937],{"class":894},[72,967,940],{"class":78},[72,969,970],{"class":85},"filter",[72,972,946],{"class":78},[72,974,975],{"class":85},"setFilter",[72,977,952],{"class":78},[72,979,955],{"class":894},[72,981,958],{"class":928},[72,983,984],{"class":78},"(",[72,986,987],{"class":92},"'all'",[72,989,990],{"class":78},");\n",[72,992,993,995,997,1000,1002,1005,1007,1009,1011,1013,1016],{"class":74,"line":147},[72,994,937],{"class":894},[72,996,940],{"class":78},[72,998,999],{"class":85},"stats",[72,1001,946],{"class":78},[72,1003,1004],{"class":85},"setStats",[72,1006,952],{"class":78},[72,1008,955],{"class":894},[72,1010,958],{"class":928},[72,1012,984],{"class":78},[72,1014,1015],{"class":85},"null",[72,1017,990],{"class":78},[72,1019,1020,1022,1024,1027,1029,1032,1034,1036,1038,1040,1043],{"class":74,"line":158},[72,1021,937],{"class":894},[72,1023,940],{"class":78},[72,1025,1026],{"class":85},"loading",[72,1028,946],{"class":78},[72,1030,1031],{"class":85},"setLoading",[72,1033,952],{"class":78},[72,1035,955],{"class":894},[72,1037,958],{"class":928},[72,1039,984],{"class":78},[72,1041,1042],{"class":85},"true",[72,1044,990],{"class":78},[72,1046,1047],{"class":74,"line":164},[72,1048,220],{"class":78},[72,1050,1051,1054,1057,1060],{"class":74,"line":232},[72,1052,1053],{"class":928},"  useEffect",[72,1055,1056],{"class":78},"(() ",[72,1058,1059],{"class":894},"=>",[72,1061,1062],{"class":78}," {\n",[72,1064,1065,1068],{"class":74,"line":238},[72,1066,1067],{"class":928},"    fetchNewsWithSentiment",[72,1069,1070],{"class":78},"();\n",[72,1072,1073],{"class":74,"line":244},[72,1074,1075],{"class":78},"  }, []);\n",[72,1077,1078],{"class":74,"line":249},[72,1079,220],{"class":78},[72,1081,1082,1085,1088,1091],{"class":74,"line":254},[72,1083,1084],{"class":894},"  async",[72,1086,1087],{"class":894}," function",[72,1089,1090],{"class":928}," fetchNewsWithSentiment",[72,1092,932],{"class":78},[72,1094,1095,1098],{"class":74,"line":260},[72,1096,1097],{"class":894},"    try",[72,1099,1062],{"class":78},[72,1101,1102,1105,1108,1111,1114,1117],{"class":74,"line":266},[72,1103,1104],{"class":894},"      const",[72,1106,1107],{"class":85}," API_KEY",[72,1109,1110],{"class":894}," =",[72,1112,1113],{"class":78}," process.env.",[72,1115,1116],{"class":85},"REACT_APP_NEWS_API_KEY",[72,1118,907],{"class":78},[72,1120,1121,1123,1126,1128,1131,1134],{"class":74,"line":271},[72,1122,1104],{"class":894},[72,1124,1125],{"class":85}," response",[72,1127,1110],{"class":894},[72,1129,1130],{"class":894}," await",[72,1132,1133],{"class":928}," fetch",[72,1135,1136],{"class":78},"(\n",[72,1138,1139,1142,1145],{"class":74,"line":277},[72,1140,1141],{"class":92},"        `https:\u002F\u002Fapi.allnewsapi.com\u002Fheadlines?apikey=${",[72,1143,1144],{"class":85},"API_KEY",[72,1146,1147],{"class":92},"}&country=us`\n",[72,1149,1150],{"class":74,"line":283},[72,1151,1152],{"class":78},"      );\n",[72,1154,1155,1157,1160,1162,1164,1167,1169],{"class":74,"line":289},[72,1156,1104],{"class":894},[72,1158,1159],{"class":85}," data",[72,1161,1110],{"class":894},[72,1163,1130],{"class":894},[72,1165,1166],{"class":78}," response.",[72,1168,66],{"class":928},[72,1170,1070],{"class":78},[72,1172,1173],{"class":74,"line":295},[72,1174,680],{"class":78},[72,1176,1177],{"class":74,"line":301},[72,1178,1180],{"class":1179},"sJ8bj","      \u002F\u002F Articles already include sentiment data!\n",[72,1182,1183,1186],{"class":74,"line":595},[72,1184,1185],{"class":928},"      setArticles",[72,1187,1188],{"class":78},"(data.articles);\n",[72,1190,1191,1194,1196,1199],{"class":74,"line":601},[72,1192,1193],{"class":928},"      setStats",[72,1195,984],{"class":78},[72,1197,1198],{"class":928},"calculateStats",[72,1200,1201],{"class":78},"(data.articles));\n",[72,1203,1204,1207,1210],{"class":74,"line":607},[72,1205,1206],{"class":78},"    } ",[72,1208,1209],{"class":894},"catch",[72,1211,1212],{"class":78}," (error) {\n",[72,1214,1215,1218,1221,1223,1226],{"class":74,"line":613},[72,1216,1217],{"class":78},"      console.",[72,1219,1220],{"class":928},"error",[72,1222,984],{"class":78},[72,1224,1225],{"class":92},"'Error fetching news:'",[72,1227,1228],{"class":78},", error);\n",[72,1230,1231,1233,1236],{"class":74,"line":619},[72,1232,1206],{"class":78},[72,1234,1235],{"class":894},"finally",[72,1237,1062],{"class":78},[72,1239,1240,1243,1245,1248],{"class":74,"line":625},[72,1241,1242],{"class":928},"      setLoading",[72,1244,984],{"class":78},[72,1246,1247],{"class":85},"false",[72,1249,990],{"class":78},[72,1251,1252],{"class":74,"line":631},[72,1253,1254],{"class":78},"    }\n",[72,1256,1257],{"class":74,"line":636},[72,1258,161],{"class":78},[72,1260,1261],{"class":74,"line":642},[72,1262,220],{"class":78},[72,1264,1265,1268,1271,1273,1276],{"class":74,"line":648},[72,1266,1267],{"class":894},"  function",[72,1269,1270],{"class":928}," calculateStats",[72,1272,984],{"class":78},[72,1274,943],{"class":1275},"s4XuR",[72,1277,1278],{"class":78},") {\n",[72,1280,1281,1284,1287,1289,1292,1295,1298,1301,1304,1306,1309,1311],{"class":74,"line":654},[72,1282,1283],{"class":894},"    const",[72,1285,1286],{"class":85}," stats",[72,1288,1110],{"class":894},[72,1290,1291],{"class":78}," { total: articles.",[72,1293,1294],{"class":85},"length",[72,1296,1297],{"class":78},", positive: ",[72,1299,1300],{"class":85},"0",[72,1302,1303],{"class":78},", negative: ",[72,1305,1300],{"class":85},[72,1307,1308],{"class":78},", neutral: ",[72,1310,1300],{"class":85},[72,1312,1313],{"class":78}," };\n",[72,1315,1316,1319,1322,1324,1327,1330],{"class":74,"line":659},[72,1317,1318],{"class":78},"    articles.",[72,1320,1321],{"class":928},"forEach",[72,1323,984],{"class":78},[72,1325,1326],{"class":1275},"article",[72,1328,1329],{"class":894}," =>",[72,1331,1062],{"class":78},[72,1333,1334,1337,1340],{"class":74,"line":665},[72,1335,1336],{"class":78},"      stats[article.sentiment]",[72,1338,1339],{"class":894},"++",[72,1341,907],{"class":78},[72,1343,1344],{"class":74,"line":671},[72,1345,443],{"class":78},[72,1347,1348,1351],{"class":74,"line":677},[72,1349,1350],{"class":894},"    return",[72,1352,1353],{"class":78}," stats;\n",[72,1355,1356],{"class":74,"line":683},[72,1357,161],{"class":78},[72,1359,1360],{"class":74,"line":689},[72,1361,220],{"class":78},[72,1363,1364,1366,1369,1371,1374,1377],{"class":74,"line":695},[72,1365,937],{"class":894},[72,1367,1368],{"class":85}," filteredArticles",[72,1370,1110],{"class":894},[72,1372,1373],{"class":78}," filter ",[72,1375,1376],{"class":894},"===",[72,1378,1379],{"class":92}," 'all'\n",[72,1381,1382,1385],{"class":74,"line":701},[72,1383,1384],{"class":894},"    ?",[72,1386,1387],{"class":78}," articles\n",[72,1389,1390,1393,1396,1398,1400,1403,1405,1408,1410],{"class":74,"line":707},[72,1391,1392],{"class":894},"    :",[72,1394,1395],{"class":78}," articles.",[72,1397,970],{"class":928},[72,1399,984],{"class":78},[72,1401,1402],{"class":1275},"a",[72,1404,1329],{"class":894},[72,1406,1407],{"class":78}," a.sentiment ",[72,1409,1376],{"class":894},[72,1411,1412],{"class":78}," filter);\n",[72,1414,1415],{"class":74,"line":712},[72,1416,220],{"class":78},[72,1418,1419,1421,1424,1426,1428],{"class":74,"line":717},[72,1420,1267],{"class":894},[72,1422,1423],{"class":928}," getSentimentColor",[72,1425,984],{"class":78},[72,1427,53],{"class":1275},[72,1429,1278],{"class":78},[72,1431,1432,1435],{"class":74,"line":723},[72,1433,1434],{"class":894},"    switch",[72,1436,1437],{"class":78}," (sentiment) {\n",[72,1439,1440,1443,1446,1448,1451,1454],{"class":74,"line":729},[72,1441,1442],{"class":894},"      case",[72,1444,1445],{"class":92}," 'positive'",[72,1447,89],{"class":78},[72,1449,1450],{"class":894},"return",[72,1452,1453],{"class":92}," '#4caf50'",[72,1455,907],{"class":78},[72,1457,1458,1460,1463,1465,1467,1470],{"class":74,"line":735},[72,1459,1442],{"class":894},[72,1461,1462],{"class":92}," 'negative'",[72,1464,89],{"class":78},[72,1466,1450],{"class":894},[72,1468,1469],{"class":92}," '#f44336'",[72,1471,907],{"class":78},[72,1473,1474,1477,1479,1481,1484],{"class":74,"line":741},[72,1475,1476],{"class":894},"      default",[72,1478,89],{"class":78},[72,1480,1450],{"class":894},[72,1482,1483],{"class":92}," '#9e9e9e'",[72,1485,907],{"class":78},[72,1487,1488],{"class":74,"line":746},[72,1489,1254],{"class":78},[72,1491,1492],{"class":74,"line":752},[72,1493,161],{"class":78},[72,1495,1496],{"class":74,"line":757},[72,1497,220],{"class":78},[72,1499,1500,1502,1505,1507,1509],{"class":74,"line":762},[72,1501,1267],{"class":894},[72,1503,1504],{"class":928}," getSentimentEmoji",[72,1506,984],{"class":78},[72,1508,53],{"class":1275},[72,1510,1278],{"class":78},[72,1512,1513,1515],{"class":74,"line":768},[72,1514,1434],{"class":894},[72,1516,1437],{"class":78},[72,1518,1519,1521,1523,1525,1527,1530],{"class":74,"line":774},[72,1520,1442],{"class":894},[72,1522,1445],{"class":92},[72,1524,89],{"class":78},[72,1526,1450],{"class":894},[72,1528,1529],{"class":92}," '😊'",[72,1531,907],{"class":78},[72,1533,1534,1536,1538,1540,1542,1545],{"class":74,"line":779},[72,1535,1442],{"class":894},[72,1537,1462],{"class":92},[72,1539,89],{"class":78},[72,1541,1450],{"class":894},[72,1543,1544],{"class":92}," '😟'",[72,1546,907],{"class":78},[72,1548,1549,1551,1553,1555,1558],{"class":74,"line":784},[72,1550,1476],{"class":894},[72,1552,89],{"class":78},[72,1554,1450],{"class":894},[72,1556,1557],{"class":92}," '😐'",[72,1559,907],{"class":78},[72,1561,1562],{"class":74,"line":790},[72,1563,1254],{"class":78},[72,1565,1566],{"class":74,"line":796},[72,1567,161],{"class":78},[72,1569,1570],{"class":74,"line":801},[72,1571,220],{"class":78},[72,1573,1574,1577,1580,1582,1585,1589,1592,1594],{"class":74,"line":806},[72,1575,1576],{"class":894},"  if",[72,1578,1579],{"class":78}," (loading) ",[72,1581,1450],{"class":894},[72,1583,1584],{"class":78}," \u003C",[72,1586,1588],{"class":1587},"s9eBZ","div",[72,1590,1591],{"class":78},">Loading...\u003C\u002F",[72,1593,1588],{"class":1587},[72,1595,1596],{"class":78},">;\n",[72,1598,1599],{"class":74,"line":812},[72,1600,220],{"class":78},[72,1602,1603,1606],{"class":74,"line":817},[72,1604,1605],{"class":894},"  return",[72,1607,1608],{"class":78}," (\n",[72,1610,1611,1614,1616,1619,1621,1624],{"class":74,"line":822},[72,1612,1613],{"class":78},"    \u003C",[72,1615,1588],{"class":1587},[72,1617,1618],{"class":928}," className",[72,1620,955],{"class":894},[72,1622,1623],{"class":92},"\"sentiment-dashboard\"",[72,1625,1626],{"class":78},">\n",[72,1628,1629,1632,1635,1638,1640],{"class":74,"line":827},[72,1630,1631],{"class":78},"      \u003C",[72,1633,1634],{"class":1587},"h1",[72,1636,1637],{"class":78},">News Sentiment Analysis\u003C\u002F",[72,1639,1634],{"class":1587},[72,1641,1626],{"class":78},[72,1643,1644,1646,1648,1650,1652,1655,1658,1660],{"class":74,"line":833},[72,1645,1631],{"class":78},[72,1647,11],{"class":1587},[72,1649,1618],{"class":928},[72,1651,955],{"class":894},[72,1653,1654],{"class":92},"\"subtitle\"",[72,1656,1657],{"class":78},">Powered by AllNewsAPI's built-in AI sentiment analysis\u003C\u002F",[72,1659,11],{"class":1587},[72,1661,1626],{"class":78},[72,1663,1664],{"class":74,"line":839},[72,1665,680],{"class":78},[72,1667,1668,1671,1674],{"class":74,"line":845},[72,1669,1670],{"class":78},"      {stats ",[72,1672,1673],{"class":894},"&&",[72,1675,1608],{"class":78},[72,1677,1678,1681,1683,1685,1687,1690],{"class":74,"line":851},[72,1679,1680],{"class":78},"        \u003C",[72,1682,1588],{"class":1587},[72,1684,1618],{"class":928},[72,1686,955],{"class":894},[72,1688,1689],{"class":92},"\"stats-panel\"",[72,1691,1626],{"class":78},[72,1693,1694,1697,1699,1701,1703,1706],{"class":74,"line":857},[72,1695,1696],{"class":78},"          \u003C",[72,1698,1588],{"class":1587},[72,1700,1618],{"class":928},[72,1702,955],{"class":894},[72,1704,1705],{"class":92},"\"stat\"",[72,1707,1626],{"class":78},[72,1709,1710,1713,1715,1717,1719,1722,1725,1727],{"class":74,"line":862},[72,1711,1712],{"class":78},"            \u003C",[72,1714,72],{"class":1587},[72,1716,1618],{"class":928},[72,1718,955],{"class":894},[72,1720,1721],{"class":92},"\"stat-label\"",[72,1723,1724],{"class":78},">Total Articles\u003C\u002F",[72,1726,72],{"class":1587},[72,1728,1626],{"class":78},[72,1730,1731,1733,1735,1737,1739,1742,1745,1747],{"class":74,"line":867},[72,1732,1712],{"class":78},[72,1734,72],{"class":1587},[72,1736,1618],{"class":928},[72,1738,955],{"class":894},[72,1740,1741],{"class":92},"\"stat-value\"",[72,1743,1744],{"class":78},">{stats.total}\u003C\u002F",[72,1746,72],{"class":1587},[72,1748,1626],{"class":78},[72,1750,1751,1754,1756],{"class":74,"line":872},[72,1752,1753],{"class":78},"          \u003C\u002F",[72,1755,1588],{"class":1587},[72,1757,1626],{"class":78},[72,1759,1761,1763,1765,1767,1769,1772],{"class":74,"line":1760},73,[72,1762,1696],{"class":78},[72,1764,1588],{"class":1587},[72,1766,1618],{"class":928},[72,1768,955],{"class":894},[72,1770,1771],{"class":92},"\"stat positive\"",[72,1773,1626],{"class":78},[72,1775,1777,1779,1781,1783,1785,1787,1790,1792],{"class":74,"line":1776},74,[72,1778,1712],{"class":78},[72,1780,72],{"class":1587},[72,1782,1618],{"class":928},[72,1784,955],{"class":894},[72,1786,1721],{"class":92},[72,1788,1789],{"class":78},">Positive\u003C\u002F",[72,1791,72],{"class":1587},[72,1793,1626],{"class":78},[72,1795,1797,1799,1801,1803,1805,1807,1810,1812],{"class":74,"line":1796},75,[72,1798,1712],{"class":78},[72,1800,72],{"class":1587},[72,1802,1618],{"class":928},[72,1804,955],{"class":894},[72,1806,1741],{"class":92},[72,1808,1809],{"class":78},">{stats.positive}\u003C\u002F",[72,1811,72],{"class":1587},[72,1813,1626],{"class":78},[72,1815,1817,1819,1821],{"class":74,"line":1816},76,[72,1818,1753],{"class":78},[72,1820,1588],{"class":1587},[72,1822,1626],{"class":78},[72,1824,1826,1828,1830,1832,1834,1837],{"class":74,"line":1825},77,[72,1827,1696],{"class":78},[72,1829,1588],{"class":1587},[72,1831,1618],{"class":928},[72,1833,955],{"class":894},[72,1835,1836],{"class":92},"\"stat neutral\"",[72,1838,1626],{"class":78},[72,1840,1842,1844,1846,1848,1850,1852,1855,1857],{"class":74,"line":1841},78,[72,1843,1712],{"class":78},[72,1845,72],{"class":1587},[72,1847,1618],{"class":928},[72,1849,955],{"class":894},[72,1851,1721],{"class":92},[72,1853,1854],{"class":78},">Neutral\u003C\u002F",[72,1856,72],{"class":1587},[72,1858,1626],{"class":78},[72,1860,1862,1864,1866,1868,1870,1872,1875,1877],{"class":74,"line":1861},79,[72,1863,1712],{"class":78},[72,1865,72],{"class":1587},[72,1867,1618],{"class":928},[72,1869,955],{"class":894},[72,1871,1741],{"class":92},[72,1873,1874],{"class":78},">{stats.neutral}\u003C\u002F",[72,1876,72],{"class":1587},[72,1878,1626],{"class":78},[72,1880,1882,1884,1886],{"class":74,"line":1881},80,[72,1883,1753],{"class":78},[72,1885,1588],{"class":1587},[72,1887,1626],{"class":78},[72,1889,1891,1893,1895,1897,1899,1902],{"class":74,"line":1890},81,[72,1892,1696],{"class":78},[72,1894,1588],{"class":1587},[72,1896,1618],{"class":928},[72,1898,955],{"class":894},[72,1900,1901],{"class":92},"\"stat negative\"",[72,1903,1626],{"class":78},[72,1905,1907,1909,1911,1913,1915,1917,1920,1922],{"class":74,"line":1906},82,[72,1908,1712],{"class":78},[72,1910,72],{"class":1587},[72,1912,1618],{"class":928},[72,1914,955],{"class":894},[72,1916,1721],{"class":92},[72,1918,1919],{"class":78},">Negative\u003C\u002F",[72,1921,72],{"class":1587},[72,1923,1626],{"class":78},[72,1925,1927,1929,1931,1933,1935,1937,1940,1942],{"class":74,"line":1926},83,[72,1928,1712],{"class":78},[72,1930,72],{"class":1587},[72,1932,1618],{"class":928},[72,1934,955],{"class":894},[72,1936,1741],{"class":92},[72,1938,1939],{"class":78},">{stats.negative}\u003C\u002F",[72,1941,72],{"class":1587},[72,1943,1626],{"class":78},[72,1945,1947,1949,1951],{"class":74,"line":1946},84,[72,1948,1753],{"class":78},[72,1950,1588],{"class":1587},[72,1952,1626],{"class":78},[72,1954,1956,1959,1961],{"class":74,"line":1955},85,[72,1957,1958],{"class":78},"        \u003C\u002F",[72,1960,1588],{"class":1587},[72,1962,1626],{"class":78},[72,1964,1966],{"class":74,"line":1965},86,[72,1967,1968],{"class":78},"      )}\n",[72,1970,1972],{"class":74,"line":1971},87,[72,1973,680],{"class":78},[72,1975,1977,1979,1981,1983,1985,1988],{"class":74,"line":1976},88,[72,1978,1631],{"class":78},[72,1980,1588],{"class":1587},[72,1982,1618],{"class":928},[72,1984,955],{"class":894},[72,1986,1987],{"class":92},"\"filters\"",[72,1989,1626],{"class":78},[72,1991,1993,1995,1998],{"class":74,"line":1992},89,[72,1994,1680],{"class":78},[72,1996,1997],{"class":1587},"button",[72,1999,2000],{"class":78}," \n",[72,2002,2004,2007,2009,2012,2014,2017,2020,2023,2026,2029],{"class":74,"line":2003},90,[72,2005,2006],{"class":928},"          className",[72,2008,955],{"class":894},[72,2010,2011],{"class":78},"{filter ",[72,2013,1376],{"class":894},[72,2015,2016],{"class":92}," 'all'",[72,2018,2019],{"class":894}," ?",[72,2021,2022],{"class":92}," 'active'",[72,2024,2025],{"class":894}," :",[72,2027,2028],{"class":92}," ''",[72,2030,167],{"class":78},[72,2032,2034,2037,2039,2042,2044,2047,2049,2051],{"class":74,"line":2033},91,[72,2035,2036],{"class":928},"          onClick",[72,2038,955],{"class":894},[72,2040,2041],{"class":78},"{() ",[72,2043,1059],{"class":894},[72,2045,2046],{"class":928}," setFilter",[72,2048,984],{"class":78},[72,2050,987],{"class":92},[72,2052,2053],{"class":78},")}\n",[72,2055,2057],{"class":74,"line":2056},92,[72,2058,2059],{"class":78},"        >\n",[72,2061,2063],{"class":74,"line":2062},93,[72,2064,2065],{"class":78},"          All\n",[72,2067,2069,2071,2073],{"class":74,"line":2068},94,[72,2070,1958],{"class":78},[72,2072,1997],{"class":1587},[72,2074,1626],{"class":78},[72,2076,2078,2080,2082],{"class":74,"line":2077},95,[72,2079,1680],{"class":78},[72,2081,1997],{"class":1587},[72,2083,2000],{"class":78},[72,2085,2087,2089,2091,2093,2095,2097,2099,2101,2103,2105],{"class":74,"line":2086},96,[72,2088,2006],{"class":928},[72,2090,955],{"class":894},[72,2092,2011],{"class":78},[72,2094,1376],{"class":894},[72,2096,1445],{"class":92},[72,2098,2019],{"class":894},[72,2100,2022],{"class":92},[72,2102,2025],{"class":894},[72,2104,2028],{"class":92},[72,2106,167],{"class":78},[72,2108,2110,2112,2114,2116,2118,2120,2122,2125],{"class":74,"line":2109},97,[72,2111,2036],{"class":928},[72,2113,955],{"class":894},[72,2115,2041],{"class":78},[72,2117,1059],{"class":894},[72,2119,2046],{"class":928},[72,2121,984],{"class":78},[72,2123,2124],{"class":92},"'positive'",[72,2126,2053],{"class":78},[72,2128,2130],{"class":74,"line":2129},98,[72,2131,2059],{"class":78},[72,2133,2135],{"class":74,"line":2134},99,[72,2136,2137],{"class":78},"          😊 Positive\n",[72,2139,2141,2143,2145],{"class":74,"line":2140},100,[72,2142,1958],{"class":78},[72,2144,1997],{"class":1587},[72,2146,1626],{"class":78},[72,2148,2150,2152,2154],{"class":74,"line":2149},101,[72,2151,1680],{"class":78},[72,2153,1997],{"class":1587},[72,2155,2000],{"class":78},[72,2157,2159,2161,2163,2165,2167,2170,2172,2174,2176,2178],{"class":74,"line":2158},102,[72,2160,2006],{"class":928},[72,2162,955],{"class":894},[72,2164,2011],{"class":78},[72,2166,1376],{"class":894},[72,2168,2169],{"class":92}," 'neutral'",[72,2171,2019],{"class":894},[72,2173,2022],{"class":92},[72,2175,2025],{"class":894},[72,2177,2028],{"class":92},[72,2179,167],{"class":78},[72,2181,2183,2185,2187,2189,2191,2193,2195,2198],{"class":74,"line":2182},103,[72,2184,2036],{"class":928},[72,2186,955],{"class":894},[72,2188,2041],{"class":78},[72,2190,1059],{"class":894},[72,2192,2046],{"class":928},[72,2194,984],{"class":78},[72,2196,2197],{"class":92},"'neutral'",[72,2199,2053],{"class":78},[72,2201,2203],{"class":74,"line":2202},104,[72,2204,2059],{"class":78},[72,2206,2208],{"class":74,"line":2207},105,[72,2209,2210],{"class":78},"          😐 Neutral\n",[72,2212,2214,2216,2218],{"class":74,"line":2213},106,[72,2215,1958],{"class":78},[72,2217,1997],{"class":1587},[72,2219,1626],{"class":78},[72,2221,2223,2225,2227],{"class":74,"line":2222},107,[72,2224,1680],{"class":78},[72,2226,1997],{"class":1587},[72,2228,2000],{"class":78},[72,2230,2232,2234,2236,2238,2240,2242,2244,2246,2248,2250],{"class":74,"line":2231},108,[72,2233,2006],{"class":928},[72,2235,955],{"class":894},[72,2237,2011],{"class":78},[72,2239,1376],{"class":894},[72,2241,1462],{"class":92},[72,2243,2019],{"class":894},[72,2245,2022],{"class":92},[72,2247,2025],{"class":894},[72,2249,2028],{"class":92},[72,2251,167],{"class":78},[72,2253,2255,2257,2259,2261,2263,2265,2267,2270],{"class":74,"line":2254},109,[72,2256,2036],{"class":928},[72,2258,955],{"class":894},[72,2260,2041],{"class":78},[72,2262,1059],{"class":894},[72,2264,2046],{"class":928},[72,2266,984],{"class":78},[72,2268,2269],{"class":92},"'negative'",[72,2271,2053],{"class":78},[72,2273,2275],{"class":74,"line":2274},110,[72,2276,2059],{"class":78},[72,2278,2280],{"class":74,"line":2279},111,[72,2281,2282],{"class":78},"          😟 Negative\n",[72,2284,2286,2288,2290],{"class":74,"line":2285},112,[72,2287,1958],{"class":78},[72,2289,1997],{"class":1587},[72,2291,1626],{"class":78},[72,2293,2295,2298,2300],{"class":74,"line":2294},113,[72,2296,2297],{"class":78},"      \u003C\u002F",[72,2299,1588],{"class":1587},[72,2301,1626],{"class":78},[72,2303,2305],{"class":74,"line":2304},114,[72,2306,680],{"class":78},[72,2308,2310,2312,2314,2316,2318,2321],{"class":74,"line":2309},115,[72,2311,1631],{"class":78},[72,2313,1588],{"class":1587},[72,2315,1618],{"class":928},[72,2317,955],{"class":894},[72,2319,2320],{"class":92},"\"articles-grid\"",[72,2322,1626],{"class":78},[72,2324,2326,2329,2332,2335,2337,2339,2342,2345,2347],{"class":74,"line":2325},116,[72,2327,2328],{"class":78},"        {filteredArticles.",[72,2330,2331],{"class":928},"map",[72,2333,2334],{"class":78},"((",[72,2336,1326],{"class":1275},[72,2338,946],{"class":78},[72,2340,2341],{"class":1275},"index",[72,2343,2344],{"class":78},") ",[72,2346,1059],{"class":894},[72,2348,1608],{"class":78},[72,2350,2352,2354,2356,2359,2361,2364,2367,2369,2372],{"class":74,"line":2351},117,[72,2353,1696],{"class":78},[72,2355,1588],{"class":1587},[72,2357,2358],{"class":928}," key",[72,2360,955],{"class":894},[72,2362,2363],{"class":78},"{index} ",[72,2365,2366],{"class":928},"className",[72,2368,955],{"class":894},[72,2370,2371],{"class":92},"\"article-card\"",[72,2373,1626],{"class":78},[72,2375,2377,2379,2381],{"class":74,"line":2376},118,[72,2378,1712],{"class":78},[72,2380,1588],{"class":1587},[72,2382,2000],{"class":78},[72,2384,2386,2389,2391],{"class":74,"line":2385},119,[72,2387,2388],{"class":928},"              className",[72,2390,955],{"class":894},[72,2392,2393],{"class":92},"\"sentiment-badge\"\n",[72,2395,2397,2400,2402,2405,2408],{"class":74,"line":2396},120,[72,2398,2399],{"class":928},"              style",[72,2401,955],{"class":894},[72,2403,2404],{"class":78},"{{ backgroundColor: ",[72,2406,2407],{"class":928},"getSentimentColor",[72,2409,2410],{"class":78},"(article.sentiment) }}\n",[72,2412,2414],{"class":74,"line":2413},121,[72,2415,2416],{"class":78},"            >\n",[72,2418,2420,2423,2426],{"class":74,"line":2419},122,[72,2421,2422],{"class":78},"              {",[72,2424,2425],{"class":928},"getSentimentEmoji",[72,2427,2428],{"class":78},"(article.sentiment)}\n",[72,2430,2432],{"class":74,"line":2431},123,[72,2433,2434],{"class":78},"              {article.sentiment}\n",[72,2436,2438,2441,2443],{"class":74,"line":2437},124,[72,2439,2440],{"class":78},"            \u003C\u002F",[72,2442,1588],{"class":1587},[72,2444,1626],{"class":78},[72,2446,2448],{"class":74,"line":2447},125,[72,2449,2450],{"class":78},"            \n",[72,2452,2454,2457,2460],{"class":74,"line":2453},126,[72,2455,2456],{"class":78},"            {",[72,2458,2459],{"class":1179},"\u002F* Show confidence scores *\u002F",[72,2461,167],{"class":78},[72,2463,2465,2467,2469,2471,2473,2476],{"class":74,"line":2464},127,[72,2466,1712],{"class":78},[72,2468,1588],{"class":1587},[72,2470,1618],{"class":928},[72,2472,955],{"class":894},[72,2474,2475],{"class":92},"\"sentiment-scores\"",[72,2477,1626],{"class":78},[72,2479,2481,2484,2486,2488,2490,2493],{"class":74,"line":2480},128,[72,2482,2483],{"class":78},"              \u003C",[72,2485,1588],{"class":1587},[72,2487,1618],{"class":928},[72,2489,955],{"class":894},[72,2491,2492],{"class":92},"\"score-bar\"",[72,2494,1626],{"class":78},[72,2496,2498,2501,2503,2506,2509,2512,2515,2518,2520,2522,2525,2527],{"class":74,"line":2497},129,[72,2499,2500],{"class":78},"                \u003C",[72,2502,72],{"class":1587},[72,2504,2505],{"class":78},">Positive: {(article.sentimentScores.positive ",[72,2507,2508],{"class":894},"*",[72,2510,2511],{"class":85}," 100",[72,2513,2514],{"class":78},").",[72,2516,2517],{"class":928},"toFixed",[72,2519,984],{"class":78},[72,2521,1300],{"class":85},[72,2523,2524],{"class":78},")}%\u003C\u002F",[72,2526,72],{"class":1587},[72,2528,1626],{"class":78},[72,2530,2532,2534,2536,2538,2540,2543,2546,2548,2551,2554,2556,2559,2561,2563,2566,2569,2571,2574,2577,2580],{"class":74,"line":2531},130,[72,2533,2500],{"class":78},[72,2535,1588],{"class":1587},[72,2537,1618],{"class":928},[72,2539,955],{"class":894},[72,2541,2542],{"class":92},"\"bar\"",[72,2544,2545],{"class":928}," style",[72,2547,955],{"class":894},[72,2549,2550],{"class":78},"{{ width: ",[72,2552,2553],{"class":92},"`${",[72,2555,1326],{"class":78},[72,2557,2558],{"class":92},".",[72,2560,59],{"class":78},[72,2562,2558],{"class":92},[72,2564,2565],{"class":78},"positive",[72,2567,2568],{"class":894}," *",[72,2570,2511],{"class":85},[72,2572,2573],{"class":92},"}%`",[72,2575,2576],{"class":78},", backgroundColor: ",[72,2578,2579],{"class":92},"'#4caf50'",[72,2581,2582],{"class":78}," }} \u002F>\n",[72,2584,2586,2589,2591],{"class":74,"line":2585},131,[72,2587,2588],{"class":78},"              \u003C\u002F",[72,2590,1588],{"class":1587},[72,2592,1626],{"class":78},[72,2594,2596,2598,2600,2602,2604,2606],{"class":74,"line":2595},132,[72,2597,2483],{"class":78},[72,2599,1588],{"class":1587},[72,2601,1618],{"class":928},[72,2603,955],{"class":894},[72,2605,2492],{"class":92},[72,2607,1626],{"class":78},[72,2609,2611,2613,2615,2618,2620,2622,2624,2626,2628,2630,2632,2634],{"class":74,"line":2610},133,[72,2612,2500],{"class":78},[72,2614,72],{"class":1587},[72,2616,2617],{"class":78},">Neutral: {(article.sentimentScores.neutral ",[72,2619,2508],{"class":894},[72,2621,2511],{"class":85},[72,2623,2514],{"class":78},[72,2625,2517],{"class":928},[72,2627,984],{"class":78},[72,2629,1300],{"class":85},[72,2631,2524],{"class":78},[72,2633,72],{"class":1587},[72,2635,1626],{"class":78},[72,2637,2639,2641,2643,2645,2647,2649,2651,2653,2655,2657,2659,2661,2663,2665,2668,2670,2672,2674,2676,2679],{"class":74,"line":2638},134,[72,2640,2500],{"class":78},[72,2642,1588],{"class":1587},[72,2644,1618],{"class":928},[72,2646,955],{"class":894},[72,2648,2542],{"class":92},[72,2650,2545],{"class":928},[72,2652,955],{"class":894},[72,2654,2550],{"class":78},[72,2656,2553],{"class":92},[72,2658,1326],{"class":78},[72,2660,2558],{"class":92},[72,2662,59],{"class":78},[72,2664,2558],{"class":92},[72,2666,2667],{"class":78},"neutral",[72,2669,2568],{"class":894},[72,2671,2511],{"class":85},[72,2673,2573],{"class":92},[72,2675,2576],{"class":78},[72,2677,2678],{"class":92},"'#9e9e9e'",[72,2680,2582],{"class":78},[72,2682,2684,2686,2688],{"class":74,"line":2683},135,[72,2685,2588],{"class":78},[72,2687,1588],{"class":1587},[72,2689,1626],{"class":78},[72,2691,2693,2695,2697,2699,2701,2703],{"class":74,"line":2692},136,[72,2694,2483],{"class":78},[72,2696,1588],{"class":1587},[72,2698,1618],{"class":928},[72,2700,955],{"class":894},[72,2702,2492],{"class":92},[72,2704,1626],{"class":78},[72,2706,2708,2710,2712,2715,2717,2719,2721,2723,2725,2727,2729,2731],{"class":74,"line":2707},137,[72,2709,2500],{"class":78},[72,2711,72],{"class":1587},[72,2713,2714],{"class":78},">Negative: {(article.sentimentScores.negative ",[72,2716,2508],{"class":894},[72,2718,2511],{"class":85},[72,2720,2514],{"class":78},[72,2722,2517],{"class":928},[72,2724,984],{"class":78},[72,2726,1300],{"class":85},[72,2728,2524],{"class":78},[72,2730,72],{"class":1587},[72,2732,1626],{"class":78},[72,2734,2736,2738,2740,2742,2744,2746,2748,2750,2752,2754,2756,2758,2760,2762,2765,2767,2769,2771,2773,2776],{"class":74,"line":2735},138,[72,2737,2500],{"class":78},[72,2739,1588],{"class":1587},[72,2741,1618],{"class":928},[72,2743,955],{"class":894},[72,2745,2542],{"class":92},[72,2747,2545],{"class":928},[72,2749,955],{"class":894},[72,2751,2550],{"class":78},[72,2753,2553],{"class":92},[72,2755,1326],{"class":78},[72,2757,2558],{"class":92},[72,2759,59],{"class":78},[72,2761,2558],{"class":92},[72,2763,2764],{"class":78},"negative",[72,2766,2568],{"class":894},[72,2768,2511],{"class":85},[72,2770,2573],{"class":92},[72,2772,2576],{"class":78},[72,2774,2775],{"class":92},"'#f44336'",[72,2777,2582],{"class":78},[72,2779,2781,2783,2785],{"class":74,"line":2780},139,[72,2782,2588],{"class":78},[72,2784,1588],{"class":1587},[72,2786,1626],{"class":78},[72,2788,2790,2792,2794],{"class":74,"line":2789},140,[72,2791,2440],{"class":78},[72,2793,1588],{"class":1587},[72,2795,1626],{"class":78},[72,2797,2799],{"class":74,"line":2798},141,[72,2800,2450],{"class":78},[72,2802,2804,2806,2809,2812,2814],{"class":74,"line":2803},142,[72,2805,1712],{"class":78},[72,2807,2808],{"class":1587},"h3",[72,2810,2811],{"class":78},">{article.title}\u003C\u002F",[72,2813,2808],{"class":1587},[72,2815,1626],{"class":78},[72,2817,2819,2821,2823,2826,2828],{"class":74,"line":2818},143,[72,2820,1712],{"class":78},[72,2822,11],{"class":1587},[72,2824,2825],{"class":78},">{article.description}\u003C\u002F",[72,2827,11],{"class":1587},[72,2829,1626],{"class":78},[72,2831,2833],{"class":74,"line":2832},144,[72,2834,2450],{"class":78},[72,2836,2838,2840,2842,2844,2846,2849],{"class":74,"line":2837},145,[72,2839,1712],{"class":78},[72,2841,1588],{"class":1587},[72,2843,1618],{"class":928},[72,2845,955],{"class":894},[72,2847,2848],{"class":92},"\"article-meta\"",[72,2850,1626],{"class":78},[72,2852,2854,2856,2858,2861,2863],{"class":74,"line":2853},146,[72,2855,2483],{"class":78},[72,2857,72],{"class":1587},[72,2859,2860],{"class":78},">{article.source.name}\u003C\u002F",[72,2862,72],{"class":1587},[72,2864,1626],{"class":78},[72,2866,2868,2870,2872,2875,2878,2881,2884,2887,2890,2892],{"class":74,"line":2867},147,[72,2869,2483],{"class":78},[72,2871,72],{"class":1587},[72,2873,2874],{"class":78},">{",[72,2876,2877],{"class":894},"new",[72,2879,2880],{"class":928}," Date",[72,2882,2883],{"class":78},"(article.publishedAt).",[72,2885,2886],{"class":928},"toLocaleDateString",[72,2888,2889],{"class":78},"()}\u003C\u002F",[72,2891,72],{"class":1587},[72,2893,1626],{"class":78},[72,2895,2897,2899,2901],{"class":74,"line":2896},148,[72,2898,2440],{"class":78},[72,2900,1588],{"class":1587},[72,2902,1626],{"class":78},[72,2904,2906],{"class":74,"line":2905},149,[72,2907,2450],{"class":78},[72,2909,2911,2913,2915,2918,2920,2923,2926,2928,2931,2934,2936,2939],{"class":74,"line":2910},150,[72,2912,1712],{"class":78},[72,2914,1402],{"class":1587},[72,2916,2917],{"class":928}," href",[72,2919,955],{"class":894},[72,2921,2922],{"class":78},"{article.url} ",[72,2924,2925],{"class":928},"target",[72,2927,955],{"class":894},[72,2929,2930],{"class":92},"\"_blank\"",[72,2932,2933],{"class":928}," rel",[72,2935,955],{"class":894},[72,2937,2938],{"class":92},"\"noopener noreferrer\"",[72,2940,1626],{"class":78},[72,2942,2944],{"class":74,"line":2943},151,[72,2945,2946],{"class":78},"              Read More →\n",[72,2948,2950,2952,2954],{"class":74,"line":2949},152,[72,2951,2440],{"class":78},[72,2953,1402],{"class":1587},[72,2955,1626],{"class":78},[72,2957,2959,2961,2963],{"class":74,"line":2958},153,[72,2960,1753],{"class":78},[72,2962,1588],{"class":1587},[72,2964,1626],{"class":78},[72,2966,2968],{"class":74,"line":2967},154,[72,2969,2970],{"class":78},"        ))}\n",[72,2972,2974,2976,2978],{"class":74,"line":2973},155,[72,2975,2297],{"class":78},[72,2977,1588],{"class":1587},[72,2979,1626],{"class":78},[72,2981,2983,2986,2988],{"class":74,"line":2982},156,[72,2984,2985],{"class":78},"    \u003C\u002F",[72,2987,1588],{"class":1587},[72,2989,1626],{"class":78},[72,2991,2993],{"class":74,"line":2992},157,[72,2994,215],{"class":78},[72,2996,2998],{"class":74,"line":2997},158,[72,2999,167],{"class":78},[72,3001,3003],{"class":74,"line":3002},159,[72,3004,195],{"emptyLinePlaceholder":194},[72,3006,3008,3011,3014],{"class":74,"line":3007},160,[72,3009,3010],{"class":894},"export",[72,3012,3013],{"class":894}," default",[72,3015,3016],{"class":78}," SentimentDashboard;\n",[15,3018,3020],{"id":3019},"step-6-visualizing-sentiment-trends","Step 6: Visualizing Sentiment Trends",[11,3022,3023],{},"Create a sentiment timeline chart using AllNewsAPI's sentiment data:",[62,3025,3027],{"className":180,"code":3026,"language":182,"meta":67,"style":67},"import { Line } from 'react-chartjs-2';\n\nfunction SentimentTrendChart({ articles }) {\n  \u002F\u002F Group articles by date using built-in sentiment\n  const sentimentByDate = articles.reduce((acc, article) => {\n    const date = new Date(article.publishedAt).toLocaleDateString();\n    \n    if (!acc[date]) {\n      acc[date] = { positive: 0, negative: 0, neutral: 0, total: 0 };\n    }\n    \n    \u002F\u002F Use the built-in sentiment classification\n    acc[date][article.sentiment]++;\n    acc[date].total++;\n    \n    return acc;\n  }, {});\n  \n  const dates = Object.keys(sentimentByDate).sort();\n  \n  const data = {\n    labels: dates,\n    datasets: [\n      {\n        label: 'Positive',\n        data: dates.map(date => \n          (sentimentByDate[date].positive \u002F sentimentByDate[date].total) * 100\n        ),\n        borderColor: '#4caf50',\n        backgroundColor: 'rgba(76, 175, 80, 0.1)'\n      },\n      {\n        label: 'Negative',\n        data: dates.map(date => \n          (sentimentByDate[date].negative \u002F sentimentByDate[date].total) * 100\n        ),\n        borderColor: '#f44336',\n        backgroundColor: 'rgba(244, 67, 54, 0.1)'\n      },\n      {\n        label: 'Neutral',\n        data: dates.map(date => \n          (sentimentByDate[date].neutral \u002F sentimentByDate[date].total) * 100\n        ),\n        borderColor: '#9e9e9e',\n        backgroundColor: 'rgba(158, 158, 158, 0.1)'\n      }\n    ]\n  };\n  \n  const options = {\n    responsive: true,\n    plugins: {\n      title: {\n        display: true,\n        text: 'Sentiment Trends Over Time (AllNewsAPI Data)'\n      }\n    },\n    scales: {\n      y: {\n        beginAtZero: true,\n        max: 100,\n        ticks: {\n          callback: value => value + '%'\n        }\n      }\n    }\n  };\n  \n  return \u003CLine data={data} options={options} \u002F>;\n}\n",[69,3028,3029,3034,3038,3043,3048,3053,3058,3062,3067,3072,3076,3080,3085,3090,3095,3099,3104,3109,3113,3118,3122,3127,3132,3137,3142,3147,3152,3157,3162,3167,3172,3177,3181,3186,3190,3195,3199,3204,3209,3213,3217,3222,3226,3231,3235,3240,3245,3250,3255,3260,3264,3269,3274,3279,3284,3289,3294,3298,3303,3308,3313,3318,3323,3328,3333,3338,3342,3346,3350,3354,3359],{"__ignoreMap":67},[72,3030,3031],{"class":74,"line":75},[72,3032,3033],{},"import { Line } from 'react-chartjs-2';\n",[72,3035,3036],{"class":74,"line":82},[72,3037,195],{"emptyLinePlaceholder":194},[72,3039,3040],{"class":74,"line":99},[72,3041,3042],{},"function SentimentTrendChart({ articles }) {\n",[72,3044,3045],{"class":74,"line":112},[72,3046,3047],{},"  \u002F\u002F Group articles by date using built-in sentiment\n",[72,3049,3050],{"class":74,"line":121},[72,3051,3052],{},"  const sentimentByDate = articles.reduce((acc, article) => {\n",[72,3054,3055],{"class":74,"line":134},[72,3056,3057],{},"    const date = new Date(article.publishedAt).toLocaleDateString();\n",[72,3059,3060],{"class":74,"line":147},[72,3061,540],{},[72,3063,3064],{"class":74,"line":158},[72,3065,3066],{},"    if (!acc[date]) {\n",[72,3068,3069],{"class":74,"line":164},[72,3070,3071],{},"      acc[date] = { positive: 0, negative: 0, neutral: 0, total: 0 };\n",[72,3073,3074],{"class":74,"line":232},[72,3075,1254],{},[72,3077,3078],{"class":74,"line":238},[72,3079,540],{},[72,3081,3082],{"class":74,"line":244},[72,3083,3084],{},"    \u002F\u002F Use the built-in sentiment classification\n",[72,3086,3087],{"class":74,"line":249},[72,3088,3089],{},"    acc[date][article.sentiment]++;\n",[72,3091,3092],{"class":74,"line":254},[72,3093,3094],{},"    acc[date].total++;\n",[72,3096,3097],{"class":74,"line":260},[72,3098,540],{},[72,3100,3101],{"class":74,"line":266},[72,3102,3103],{},"    return acc;\n",[72,3105,3106],{"class":74,"line":271},[72,3107,3108],{},"  }, {});\n",[72,3110,3111],{"class":74,"line":277},[72,3112,220],{},[72,3114,3115],{"class":74,"line":283},[72,3116,3117],{},"  const dates = Object.keys(sentimentByDate).sort();\n",[72,3119,3120],{"class":74,"line":289},[72,3121,220],{},[72,3123,3124],{"class":74,"line":295},[72,3125,3126],{},"  const data = {\n",[72,3128,3129],{"class":74,"line":301},[72,3130,3131],{},"    labels: dates,\n",[72,3133,3134],{"class":74,"line":595},[72,3135,3136],{},"    datasets: [\n",[72,3138,3139],{"class":74,"line":601},[72,3140,3141],{},"      {\n",[72,3143,3144],{"class":74,"line":607},[72,3145,3146],{},"        label: 'Positive',\n",[72,3148,3149],{"class":74,"line":613},[72,3150,3151],{},"        data: dates.map(date => \n",[72,3153,3154],{"class":74,"line":619},[72,3155,3156],{},"          (sentimentByDate[date].positive \u002F sentimentByDate[date].total) * 100\n",[72,3158,3159],{"class":74,"line":625},[72,3160,3161],{},"        ),\n",[72,3163,3164],{"class":74,"line":631},[72,3165,3166],{},"        borderColor: '#4caf50',\n",[72,3168,3169],{"class":74,"line":636},[72,3170,3171],{},"        backgroundColor: 'rgba(76, 175, 80, 0.1)'\n",[72,3173,3174],{"class":74,"line":642},[72,3175,3176],{},"      },\n",[72,3178,3179],{"class":74,"line":648},[72,3180,3141],{},[72,3182,3183],{"class":74,"line":654},[72,3184,3185],{},"        label: 'Negative',\n",[72,3187,3188],{"class":74,"line":659},[72,3189,3151],{},[72,3191,3192],{"class":74,"line":665},[72,3193,3194],{},"          (sentimentByDate[date].negative \u002F sentimentByDate[date].total) * 100\n",[72,3196,3197],{"class":74,"line":671},[72,3198,3161],{},[72,3200,3201],{"class":74,"line":677},[72,3202,3203],{},"        borderColor: '#f44336',\n",[72,3205,3206],{"class":74,"line":683},[72,3207,3208],{},"        backgroundColor: 'rgba(244, 67, 54, 0.1)'\n",[72,3210,3211],{"class":74,"line":689},[72,3212,3176],{},[72,3214,3215],{"class":74,"line":695},[72,3216,3141],{},[72,3218,3219],{"class":74,"line":701},[72,3220,3221],{},"        label: 'Neutral',\n",[72,3223,3224],{"class":74,"line":707},[72,3225,3151],{},[72,3227,3228],{"class":74,"line":712},[72,3229,3230],{},"          (sentimentByDate[date].neutral \u002F sentimentByDate[date].total) * 100\n",[72,3232,3233],{"class":74,"line":717},[72,3234,3161],{},[72,3236,3237],{"class":74,"line":723},[72,3238,3239],{},"        borderColor: '#9e9e9e',\n",[72,3241,3242],{"class":74,"line":729},[72,3243,3244],{},"        backgroundColor: 'rgba(158, 158, 158, 0.1)'\n",[72,3246,3247],{"class":74,"line":735},[72,3248,3249],{},"      }\n",[72,3251,3252],{"class":74,"line":741},[72,3253,3254],{},"    ]\n",[72,3256,3257],{"class":74,"line":746},[72,3258,3259],{},"  };\n",[72,3261,3262],{"class":74,"line":752},[72,3263,220],{},[72,3265,3266],{"class":74,"line":757},[72,3267,3268],{},"  const options = {\n",[72,3270,3271],{"class":74,"line":762},[72,3272,3273],{},"    responsive: true,\n",[72,3275,3276],{"class":74,"line":768},[72,3277,3278],{},"    plugins: {\n",[72,3280,3281],{"class":74,"line":774},[72,3282,3283],{},"      title: {\n",[72,3285,3286],{"class":74,"line":779},[72,3287,3288],{},"        display: true,\n",[72,3290,3291],{"class":74,"line":784},[72,3292,3293],{},"        text: 'Sentiment Trends Over Time (AllNewsAPI Data)'\n",[72,3295,3296],{"class":74,"line":790},[72,3297,3249],{},[72,3299,3300],{"class":74,"line":796},[72,3301,3302],{},"    },\n",[72,3304,3305],{"class":74,"line":801},[72,3306,3307],{},"    scales: {\n",[72,3309,3310],{"class":74,"line":806},[72,3311,3312],{},"      y: {\n",[72,3314,3315],{"class":74,"line":812},[72,3316,3317],{},"        beginAtZero: true,\n",[72,3319,3320],{"class":74,"line":817},[72,3321,3322],{},"        max: 100,\n",[72,3324,3325],{"class":74,"line":822},[72,3326,3327],{},"        ticks: {\n",[72,3329,3330],{"class":74,"line":827},[72,3331,3332],{},"          callback: value => value + '%'\n",[72,3334,3335],{"class":74,"line":833},[72,3336,3337],{},"        }\n",[72,3339,3340],{"class":74,"line":839},[72,3341,3249],{},[72,3343,3344],{"class":74,"line":845},[72,3345,1254],{},[72,3347,3348],{"class":74,"line":851},[72,3349,3259],{},[72,3351,3352],{"class":74,"line":857},[72,3353,220],{},[72,3355,3356],{"class":74,"line":862},[72,3357,3358],{},"  return \u003CLine data={data} options={options} \u002F>;\n",[72,3360,3361],{"class":74,"line":867},[72,3362,167],{},[15,3364,3366],{"id":3365},"step-7-advanced-features","Step 7: Advanced Features",[2808,3368,3370],{"id":3369},"topic-based-sentiment","Topic-Based Sentiment",[11,3372,3373],{},"Analyze sentiment for specific topics:",[62,3375,3377],{"className":180,"code":3376,"language":182,"meta":67,"style":67},"function analyzeTopicSentiment(articles, topic) {\n  const relevantArticles = articles.filter(article => {\n    const text = `${article.title} ${article.description}`.toLowerCase();\n    return text.includes(topic.toLowerCase());\n  });\n  \n  const sentiments = relevantArticles.map(a => a.sentiment.score);\n  const averageSentiment = sentiments.reduce((a, b) => a + b, 0) \u002F sentiments.length;\n  \n  return {\n    topic,\n    articleCount: relevantArticles.length,\n    averageSentiment,\n    classification: classifySentiment(averageSentiment)\n  };\n}\n\n\u002F\u002F Usage\nconst topics = ['economy', 'technology', 'politics', 'health'];\nconst topicSentiments = topics.map(topic => \n  analyzeTopicSentiment(articles, topic)\n);\n",[69,3378,3379,3384,3389,3394,3399,3404,3408,3413,3418,3422,3427,3432,3437,3442,3447,3451,3455,3459,3463,3468,3473,3478],{"__ignoreMap":67},[72,3380,3381],{"class":74,"line":75},[72,3382,3383],{},"function analyzeTopicSentiment(articles, topic) {\n",[72,3385,3386],{"class":74,"line":82},[72,3387,3388],{},"  const relevantArticles = articles.filter(article => {\n",[72,3390,3391],{"class":74,"line":99},[72,3392,3393],{},"    const text = `${article.title} ${article.description}`.toLowerCase();\n",[72,3395,3396],{"class":74,"line":112},[72,3397,3398],{},"    return text.includes(topic.toLowerCase());\n",[72,3400,3401],{"class":74,"line":121},[72,3402,3403],{},"  });\n",[72,3405,3406],{"class":74,"line":134},[72,3407,220],{},[72,3409,3410],{"class":74,"line":147},[72,3411,3412],{},"  const sentiments = relevantArticles.map(a => a.sentiment.score);\n",[72,3414,3415],{"class":74,"line":158},[72,3416,3417],{},"  const averageSentiment = sentiments.reduce((a, b) => a + b, 0) \u002F sentiments.length;\n",[72,3419,3420],{"class":74,"line":164},[72,3421,220],{},[72,3423,3424],{"class":74,"line":232},[72,3425,3426],{},"  return {\n",[72,3428,3429],{"class":74,"line":238},[72,3430,3431],{},"    topic,\n",[72,3433,3434],{"class":74,"line":244},[72,3435,3436],{},"    articleCount: relevantArticles.length,\n",[72,3438,3439],{"class":74,"line":249},[72,3440,3441],{},"    averageSentiment,\n",[72,3443,3444],{"class":74,"line":254},[72,3445,3446],{},"    classification: classifySentiment(averageSentiment)\n",[72,3448,3449],{"class":74,"line":260},[72,3450,3259],{},[72,3452,3453],{"class":74,"line":266},[72,3454,167],{},[72,3456,3457],{"class":74,"line":271},[72,3458,195],{"emptyLinePlaceholder":194},[72,3460,3461],{"class":74,"line":277},[72,3462,257],{},[72,3464,3465],{"class":74,"line":283},[72,3466,3467],{},"const topics = ['economy', 'technology', 'politics', 'health'];\n",[72,3469,3470],{"class":74,"line":289},[72,3471,3472],{},"const topicSentiments = topics.map(topic => \n",[72,3474,3475],{"class":74,"line":295},[72,3476,3477],{},"  analyzeTopicSentiment(articles, topic)\n",[72,3479,3480],{"class":74,"line":301},[72,3481,990],{},[15,3483,3366],{"id":3484},"step-7-advanced-features-1",[2808,3486,3488],{"id":3487},"topic-based-sentiment-analysis","Topic-Based Sentiment Analysis",[11,3490,3491],{},"Analyze sentiment for specific topics using AllNewsAPI's search:",[62,3493,3495],{"className":180,"code":3494,"language":182,"meta":67,"style":67},"async function analyzeTopicSentiment(topic, apiKey) {\n  const response = await fetch(\n    `https:\u002F\u002Fapi.allnewsapi.com\u002Fsearch?apikey=${apiKey}&q=${encodeURIComponent(topic)}`\n  );\n  \n  const data = await response.json();\n  const articles = data.articles;\n  \n  \u002F\u002F Calculate sentiment distribution\n  const stats = {\n    topic,\n    total: articles.length,\n    positive: 0,\n    negative: 0,\n    neutral: 0,\n    avgPositiveScore: 0,\n    avgNegativeScore: 0\n  };\n  \n  let totalPos = 0, totalNeg = 0;\n  \n  articles.forEach(article => {\n    stats[article.sentiment]++;\n    totalPos += article.sentimentScores.positive;\n    totalNeg += article.sentimentScores.negative;\n  });\n  \n  stats.avgPositiveScore = totalPos \u002F articles.length;\n  stats.avgNegativeScore = totalNeg \u002F articles.length;\n  \n  return stats;\n}\n\n\u002F\u002F Usage\nconst topics = ['economy', 'technology', 'climate change', 'healthcare'];\nconst topicSentiments = await Promise.all(\n  topics.map(topic => analyzeTopicSentiment(topic, API_KEY))\n);\n\ntopicSentiments.forEach(stat => {\n  console.log(`${stat.topic}: ${stat.positive} positive, ${stat.negative} negative`);\n});\n",[69,3496,3497,3502,3506,3511,3515,3519,3523,3528,3532,3537,3542,3546,3551,3556,3561,3566,3571,3576,3580,3584,3589,3593,3598,3603,3608,3613,3617,3621,3626,3631,3635,3640,3644,3648,3652,3657,3662,3667,3671,3675,3680,3685],{"__ignoreMap":67},[72,3498,3499],{"class":74,"line":75},[72,3500,3501],{},"async function analyzeTopicSentiment(topic, apiKey) {\n",[72,3503,3504],{"class":74,"line":82},[72,3505,205],{},[72,3507,3508],{"class":74,"line":99},[72,3509,3510],{},"    `https:\u002F\u002Fapi.allnewsapi.com\u002Fsearch?apikey=${apiKey}&q=${encodeURIComponent(topic)}`\n",[72,3512,3513],{"class":74,"line":112},[72,3514,215],{},[72,3516,3517],{"class":74,"line":121},[72,3518,220],{},[72,3520,3521],{"class":74,"line":134},[72,3522,225],{},[72,3524,3525],{"class":74,"line":147},[72,3526,3527],{},"  const articles = data.articles;\n",[72,3529,3530],{"class":74,"line":158},[72,3531,220],{},[72,3533,3534],{"class":74,"line":164},[72,3535,3536],{},"  \u002F\u002F Calculate sentiment distribution\n",[72,3538,3539],{"class":74,"line":232},[72,3540,3541],{},"  const stats = {\n",[72,3543,3544],{"class":74,"line":238},[72,3545,3431],{},[72,3547,3548],{"class":74,"line":244},[72,3549,3550],{},"    total: articles.length,\n",[72,3552,3553],{"class":74,"line":249},[72,3554,3555],{},"    positive: 0,\n",[72,3557,3558],{"class":74,"line":254},[72,3559,3560],{},"    negative: 0,\n",[72,3562,3563],{"class":74,"line":260},[72,3564,3565],{},"    neutral: 0,\n",[72,3567,3568],{"class":74,"line":266},[72,3569,3570],{},"    avgPositiveScore: 0,\n",[72,3572,3573],{"class":74,"line":271},[72,3574,3575],{},"    avgNegativeScore: 0\n",[72,3577,3578],{"class":74,"line":277},[72,3579,3259],{},[72,3581,3582],{"class":74,"line":283},[72,3583,220],{},[72,3585,3586],{"class":74,"line":289},[72,3587,3588],{},"  let totalPos = 0, totalNeg = 0;\n",[72,3590,3591],{"class":74,"line":295},[72,3592,220],{},[72,3594,3595],{"class":74,"line":301},[72,3596,3597],{},"  articles.forEach(article => {\n",[72,3599,3600],{"class":74,"line":595},[72,3601,3602],{},"    stats[article.sentiment]++;\n",[72,3604,3605],{"class":74,"line":601},[72,3606,3607],{},"    totalPos += article.sentimentScores.positive;\n",[72,3609,3610],{"class":74,"line":607},[72,3611,3612],{},"    totalNeg += article.sentimentScores.negative;\n",[72,3614,3615],{"class":74,"line":613},[72,3616,3403],{},[72,3618,3619],{"class":74,"line":619},[72,3620,220],{},[72,3622,3623],{"class":74,"line":625},[72,3624,3625],{},"  stats.avgPositiveScore = totalPos \u002F articles.length;\n",[72,3627,3628],{"class":74,"line":631},[72,3629,3630],{},"  stats.avgNegativeScore = totalNeg \u002F articles.length;\n",[72,3632,3633],{"class":74,"line":636},[72,3634,220],{},[72,3636,3637],{"class":74,"line":642},[72,3638,3639],{},"  return stats;\n",[72,3641,3642],{"class":74,"line":648},[72,3643,167],{},[72,3645,3646],{"class":74,"line":654},[72,3647,195],{"emptyLinePlaceholder":194},[72,3649,3650],{"class":74,"line":659},[72,3651,257],{},[72,3653,3654],{"class":74,"line":665},[72,3655,3656],{},"const topics = ['economy', 'technology', 'climate change', 'healthcare'];\n",[72,3658,3659],{"class":74,"line":671},[72,3660,3661],{},"const topicSentiments = await Promise.all(\n",[72,3663,3664],{"class":74,"line":677},[72,3665,3666],{},"  topics.map(topic => analyzeTopicSentiment(topic, API_KEY))\n",[72,3668,3669],{"class":74,"line":683},[72,3670,990],{},[72,3672,3673],{"class":74,"line":689},[72,3674,195],{"emptyLinePlaceholder":194},[72,3676,3677],{"class":74,"line":695},[72,3678,3679],{},"topicSentiments.forEach(stat => {\n",[72,3681,3682],{"class":74,"line":701},[72,3683,3684],{},"  console.log(`${stat.topic}: ${stat.positive} positive, ${stat.negative} negative`);\n",[72,3686,3687],{"class":74,"line":707},[72,3688,304],{},[2808,3690,3692],{"id":3691},"sentiment-alerts","Sentiment Alerts",[11,3694,3695],{},"Monitor sentiment shifts over time:",[62,3697,3699],{"className":180,"code":3698,"language":182,"meta":67,"style":67},"class SentimentAlertSystem {\n  constructor(threshold = 0.2) {\n    this.threshold = threshold;\n    this.baseline = null;\n  }\n  \n  setBaseline(articles) {\n    const positiveCount = articles.filter(a => a.sentiment === 'positive').length;\n    this.baseline = positiveCount \u002F articles.length;\n  }\n  \n  checkForAlerts(articles) {\n    const positiveCount = articles.filter(a => a.sentiment === 'positive').length;\n    const currentRatio = positiveCount \u002F articles.length;\n    \n    if (!this.baseline) {\n      this.setBaseline(articles);\n      return null;\n    }\n    \n    const change = currentRatio - this.baseline;\n    \n    if (Math.abs(change) > this.threshold) {\n      return {\n        type: change > 0 ? 'positive_shift' : 'negative_shift',\n        magnitude: Math.abs(change),\n        message: `Sentiment has shifted ${change > 0 ? 'more positive' : 'more negative'} by ${(Math.abs(change) * 100).toFixed(1)}%`\n      };\n    }\n    \n    return null;\n  }\n}\n\n\u002F\u002F Usage\nconst alertSystem = new SentimentAlertSystem();\nconst alert = alertSystem.checkForAlerts(articles);\nif (alert) {\n  console.log('Alert:', alert.message);\n}\n",[69,3700,3701,3706,3711,3716,3721,3725,3729,3734,3739,3744,3748,3752,3757,3761,3766,3770,3775,3780,3785,3789,3793,3798,3802,3807,3812,3817,3822,3827,3832,3836,3840,3845,3849,3853,3857,3861,3866,3871,3876,3881],{"__ignoreMap":67},[72,3702,3703],{"class":74,"line":75},[72,3704,3705],{},"class SentimentAlertSystem {\n",[72,3707,3708],{"class":74,"line":82},[72,3709,3710],{},"  constructor(threshold = 0.2) {\n",[72,3712,3713],{"class":74,"line":99},[72,3714,3715],{},"    this.threshold = threshold;\n",[72,3717,3718],{"class":74,"line":112},[72,3719,3720],{},"    this.baseline = null;\n",[72,3722,3723],{"class":74,"line":121},[72,3724,161],{},[72,3726,3727],{"class":74,"line":134},[72,3728,220],{},[72,3730,3731],{"class":74,"line":147},[72,3732,3733],{},"  setBaseline(articles) {\n",[72,3735,3736],{"class":74,"line":158},[72,3737,3738],{},"    const positiveCount = articles.filter(a => a.sentiment === 'positive').length;\n",[72,3740,3741],{"class":74,"line":164},[72,3742,3743],{},"    this.baseline = positiveCount \u002F articles.length;\n",[72,3745,3746],{"class":74,"line":232},[72,3747,161],{},[72,3749,3750],{"class":74,"line":238},[72,3751,220],{},[72,3753,3754],{"class":74,"line":244},[72,3755,3756],{},"  checkForAlerts(articles) {\n",[72,3758,3759],{"class":74,"line":249},[72,3760,3738],{},[72,3762,3763],{"class":74,"line":254},[72,3764,3765],{},"    const currentRatio = positiveCount \u002F articles.length;\n",[72,3767,3768],{"class":74,"line":260},[72,3769,540],{},[72,3771,3772],{"class":74,"line":266},[72,3773,3774],{},"    if (!this.baseline) {\n",[72,3776,3777],{"class":74,"line":271},[72,3778,3779],{},"      this.setBaseline(articles);\n",[72,3781,3782],{"class":74,"line":277},[72,3783,3784],{},"      return null;\n",[72,3786,3787],{"class":74,"line":283},[72,3788,1254],{},[72,3790,3791],{"class":74,"line":289},[72,3792,540],{},[72,3794,3795],{"class":74,"line":295},[72,3796,3797],{},"    const change = currentRatio - this.baseline;\n",[72,3799,3800],{"class":74,"line":301},[72,3801,540],{},[72,3803,3804],{"class":74,"line":595},[72,3805,3806],{},"    if (Math.abs(change) > this.threshold) {\n",[72,3808,3809],{"class":74,"line":601},[72,3810,3811],{},"      return {\n",[72,3813,3814],{"class":74,"line":607},[72,3815,3816],{},"        type: change > 0 ? 'positive_shift' : 'negative_shift',\n",[72,3818,3819],{"class":74,"line":613},[72,3820,3821],{},"        magnitude: Math.abs(change),\n",[72,3823,3824],{"class":74,"line":619},[72,3825,3826],{},"        message: `Sentiment has shifted ${change > 0 ? 'more positive' : 'more negative'} by ${(Math.abs(change) * 100).toFixed(1)}%`\n",[72,3828,3829],{"class":74,"line":625},[72,3830,3831],{},"      };\n",[72,3833,3834],{"class":74,"line":631},[72,3835,1254],{},[72,3837,3838],{"class":74,"line":636},[72,3839,540],{},[72,3841,3842],{"class":74,"line":642},[72,3843,3844],{},"    return null;\n",[72,3846,3847],{"class":74,"line":648},[72,3848,161],{},[72,3850,3851],{"class":74,"line":654},[72,3852,167],{},[72,3854,3855],{"class":74,"line":659},[72,3856,195],{"emptyLinePlaceholder":194},[72,3858,3859],{"class":74,"line":665},[72,3860,257],{},[72,3862,3863],{"class":74,"line":671},[72,3864,3865],{},"const alertSystem = new SentimentAlertSystem();\n",[72,3867,3868],{"class":74,"line":677},[72,3869,3870],{},"const alert = alertSystem.checkForAlerts(articles);\n",[72,3872,3873],{"class":74,"line":683},[72,3874,3875],{},"if (alert) {\n",[72,3877,3878],{"class":74,"line":689},[72,3879,3880],{},"  console.log('Alert:', alert.message);\n",[72,3882,3883],{"class":74,"line":695},[72,3884,167],{},[15,3886,3888],{"id":3887},"best-practices","Best Practices",[46,3890,3891,3897,3903,3909,3915,3921,3927],{},[26,3892,3893,3896],{},[51,3894,3895],{},"Use the built-in data"," - AllNewsAPI's sentiment is already AI-powered and accurate",[26,3898,3899,3902],{},[51,3900,3901],{},"Show confidence scores"," - Display sentimentScores to show certainty",[26,3904,3905,3908],{},[51,3906,3907],{},"Filter intelligently"," - Let users choose their preferred sentiment",[26,3910,3911,3914],{},[51,3912,3913],{},"Track trends"," - Monitor sentiment changes over time",[26,3916,3917,3920],{},[51,3918,3919],{},"Combine with categories"," - Analyze sentiment by topic or category",[26,3922,3923,3926],{},[51,3924,3925],{},"Consider thresholds"," - Use high-confidence articles for critical decisions",[26,3928,3929,3932],{},[51,3930,3931],{},"Provide context"," - Show why an article has a certain sentiment",[15,3934,3936],{"id":3935},"when-to-build-custom-sentiment-analysis","When to Build Custom Sentiment Analysis",[11,3938,3939],{},"While AllNewsAPI provides excellent built-in sentiment analysis, you might want custom analysis for:",[23,3941,3942,3948,3954,3960],{},[26,3943,3944,3947],{},[51,3945,3946],{},"Domain-specific sentiment"," - Industry-specific terminology",[26,3949,3950,3953],{},[51,3951,3952],{},"Multi-aspect analysis"," - Analyzing different aspects of an article separately",[26,3955,3956,3959],{},[51,3957,3958],{},"Custom scoring"," - Your own sentiment scoring methodology",[26,3961,3962,3965],{},[51,3963,3964],{},"Real-time updates"," - Analyzing user comments or social media reactions",[11,3967,3968],{},"For these cases, you can use libraries like:",[23,3970,3971,3982],{},[26,3972,3973,3974,946,3976,946,3979],{},"JavaScript: ",[69,3975,53],{},[69,3977,3978],{},"natural",[69,3980,3981],{},"compromise",[26,3983,3984,3985,946,3988,946,3991],{},"Python: ",[69,3986,3987],{},"textblob",[69,3989,3990],{},"transformers",[69,3992,3993],{},"vader",[15,3995,3997],{"id":3996},"conclusion","Conclusion",[11,3999,4000],{},"AllNewsAPI's built-in sentiment analysis makes it incredibly easy to add sentiment-aware features to your news applications. No ML setup, no training data, no infrastructure - just instant access to AI-powered sentiment data for every article.",[11,4002,4003,4004,4008],{},"Ready to build sentiment-aware news apps? ",[1402,4005,4007],{"href":4006},"\u002Fsignup","Get started with AllNewsAPI"," today!",[15,4010,4012],{"id":4011},"resources","Resources",[23,4014,4015,4021,4029],{},[26,4016,4017],{},[1402,4018,4020],{"href":4019},"\u002Fdocs","AllNewsAPI Documentation",[26,4022,4023],{},[1402,4024,4028],{"href":4025,"rel":4026},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSentiment_analysis",[4027],"nofollow","Understanding Sentiment Scores",[26,4030,4031],{},[1402,4032,4034],{"href":4033},"\u002Fblog\u002Fbuilding-news-aggregator-app","Building News Dashboards Tutorial",[4036,4037,4038],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":67,"searchDepth":82,"depth":82,"links":4040},[4041,4042,4043,4044,4045,4046,4047,4048,4049,4052,4056,4057,4058,4059],{"id":17,"depth":82,"text":18},{"id":40,"depth":82,"text":41},{"id":173,"depth":82,"text":174},{"id":307,"depth":82,"text":308},{"id":394,"depth":82,"text":395},{"id":478,"depth":82,"text":479},{"id":878,"depth":82,"text":879},{"id":3019,"depth":82,"text":3020},{"id":3365,"depth":82,"text":3366,"children":4050},[4051],{"id":3369,"depth":99,"text":3370},{"id":3484,"depth":82,"text":3366,"children":4053},[4054,4055],{"id":3487,"depth":99,"text":3488},{"id":3691,"depth":99,"text":3692},{"id":3887,"depth":82,"text":3888},{"id":3935,"depth":82,"text":3936},{"id":3996,"depth":82,"text":3997},{"id":4011,"depth":82,"text":4012},"2024-10-05","Learn how to leverage AllNewsAPI's built-in AI-powered sentiment analysis to understand the emotional tone of news articles",false,"md","\u002Fblog\u002Fadding-sentiment-analysis-to-your-news-app.webp",{},"\u002Fblog\u002Fnews-sentiment-analysis",{"title":5,"description":4061},{"loc":4066},"blog\u002Fnews-sentiment-analysis","machine-learning, tutorial","4FdI-5HdgrETuz18pzwbKqXTNsEoBoQYe7cTfaM9Qoo",1783882214366]