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