Comment & Review Sentiment Analysis avatar

Comment & Review Sentiment Analysis

Pricing

from $1.50 / 1,000 comment analyzeds

Go to Apify Store
Comment & Review Sentiment Analysis

Comment & Review Sentiment Analysis

Add sentiment, language, complaint signals and NEW/CHANGED/UNCHANGED monitoring to comments from any Apify Dataset or pasted text. Local models in 6 languages, no AI API, hash-only monitoring memory.

Pricing

from $1.50 / 1,000 comment analyzeds

Rating

0.0

(0)

Developer

KazKN

KazKN

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

Comment & Review Sentiment Analysis (6 Languages, No AI API)

Comment and review sentiment analysis in 6 languages, with weekly NEW and CHANGED tracking

Comment & Review Sentiment Analysis (also known as Social Media Sentiment Monitor) is an Apify Actor for comment sentiment analysis, customer review sentiment analysis, and social media sentiment analysis, with a sentiment analysis API for brand managers, community managers, e-commerce teams, agencies, and analysts who already collect comments and reviews and need to know what people feel and what changed since last week.

Use it as the analysis step after any comments or reviews scraper. Give it the Dataset ID of a YouTube comments, TikTok comments, app store reviews, Google Maps reviews, or Trustpilot reviews scraper run, or paste your own texts. One run adds sentiment, language, duplicate and spam flags, and NEW / CHANGED / UNCHANGED monitoring to every comment, plus a complaint signal for Spanish, Italian, and Portuguese comments. Everything runs on local models: your comments are never sent to a third-party AI API, and the monitoring memory keeps only hashes.

Best for: social listening, brand monitoring, customer review analysis, support triage, weekly sentiment reports, and comment exports to Google Sheets, BI tools, or a CRM.

Explore on Apify: Run Actor · Input · Output · Pricing · API · Support

Video tutorial — see it in action

Watch the 2-minute demo: from a pile of multilingual comments to one sentiment label per comment, then a weekly view of what is new or changed.


API examples, GitHub repo, and workflows

Need to run this Actor from Python or Node.js, or see real sample outputs first? Use the public GitHub resource hub:

GitHub repo

The repo includes:

  • Python and Node.js examples with the Apify client
  • a sample input with 15 comments in 6 languages
  • real sample output rows and the matching SUMMARY
  • a weekly monitoring input for a scraper Dataset

Start here: Comment & Review Sentiment Analysis examples


What does Comment & Review Sentiment Analysis do?

NeedWhat you get
Comment sentimentpositive, neutral, or negative for each comment, with a model score
Multilingual analysisEnglish, French, German, Spanish, Italian, and Portuguese, with language detection per comment
Complaint triage (beta)A complaintSignal for Spanish, Italian, and Portuguese comments, even when the tone looks polite
Cleaner dataExact duplicate and simple spam flags
Weekly monitoringNEW, CHANGED, or UNCHANGED for each comment compared with the previous run
ReportingA SUMMARY record with sentiment distribution, net sentiment, complaint signals, and daily volume
Privacy controlsHide comment text or hash comment IDs with one checkbox, no author data copied, hash-only baselines
No scraping, no loginWorks on data you already have: no social account, cookie, or proxy needed

It does not collect comments itself. Pair it with any comments or reviews scraper on Apify, or paste your own list.


Why use it for comment and review sentiment analysis?

  • Read thousands of comments in one run. Instead of reading every review, sort them by sentiment and start with the negative ones.
  • One tool for 6 languages. Comments in English, French, German, Spanish, Italian, and Portuguese get the same labels, so you can compare markets.
  • See what changed. Monitor mode tells you which comments are new or changed since last week, so a weekly report takes minutes.
  • No AI API, no data sharing. The models run inside the Actor, so your comments are not sent to an AI provider.
  • Apify platform included. Schedule weekly runs, call the Actor through the API, export to JSON, CSV, Excel, or Google Sheets, and connect it to Make, Zapier, or webhooks.

How to analyze comment sentiment in 3 steps

  1. Collect comments with any Apify comments or reviews scraper, or prepare your own list.
  2. Run this Actor with the scraper run's Dataset ID, or paste the comments in texts.
  3. Get one row per comment in the output Dataset, plus a SUMMARY record for reporting. Schedule it in monitor mode to see only what changed since the previous run.

How much does sentiment analysis cost?

Pay per event, with no subscription:

  • $1.50 per 1,000 analyzed comments ($0.0015 per comment);
  • plus an Actor start fee of $0.0005 per GB of memory ($0.001 per run at the default 2 GB).

For example, analyzing 10,000 comments costs about $15.00, plus $0.001 for the start.

Comments that fail validation (for example, an empty or non-text value) are returned as ERROR rows and are not charged. If you set a maximum cost per run, the Actor stops before analyzing comments it cannot charge, says so in the log and in RUN_MANIFEST (stoppedAtChargeLimit), and does not update the monitoring baseline.


Input

See the Input tab for every option. The two common cases are below.

Read the comments produced by another Actor run:

{
"datasetId": "YOUR_DATASET_ID",
"textField": "text",
"idField": "id",
"metadataFields": {
"observedAt": "createdAt",
"platform": "source"
},
"maxItems": 1000
}

Or paste comments directly:

{
"texts": [
{ "id": "review-1", "text": "The product is excellent." },
{ "id": "review-2", "text": "La livraison est trop lente." }
],
"languages": ["en", "fr"]
}

Provide texts or datasetId; when both are filled in, the Dataset is used and the inline comments are ignored. textField and idField accept nested paths such as review.body. Your comment IDs and texts are shown in the output by default, so you can see which comment got which sentiment. Set includeSourceIdentifiers to false to replace the IDs with SHA-256 hashes, and includeText to false to leave the text out. Only source, observedAt, platform, and sourceRef can be mapped as metadata, and their values must be primitive. Do not point sourceRef to a private or signed URL. Author profiles and nested objects are never copied.

Set languageField (for example review.locale) only if the source reliably gives the language of each comment, not a page locale or the author's country. Codes such as es-MX, it, and pt_BR are normalized to es, it, and pt; missing or malformed codes fall back to detection. languageSource tells you whether the language was provided, detected, or undetermined.


Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. Here are two rows from a real run, simplified:

[
{
"recordId": "fr-2",
"text": "Le flacon est arrivé cassé, très déçue.",
"sentiment": "negative",
"confidence": 0.9972,
"language": "fr",
"languageSource": "detected",
"complaintSignal": "not_evaluated",
"isDuplicate": false,
"isSpam": false,
"processingStatus": "OK"
},
{
"recordId": "es-1",
"text": "Me encanta la marca, pero la app no carga desde ayer.",
"sentiment": "neutral",
"confidence": 0.8314,
"language": "es",
"languageSource": "detected",
"complaintSignal": "possible",
"isDuplicate": false,
"isSpam": false,
"processingStatus": "OK"
}
]

The Spanish comment sounds polite, so its sentiment is neutral, but the complaint signal flags the app problem.

FieldTypeDescription
recordIdstringYour comment ID, or its SHA-256 hash when includeSourceIdentifiers is false
textstringThe comment, omitted when includeText is false
sentimentstringpositive, neutral, or negative
confidencenumberModel score from 0 to 1
languagestringen, fr, de, es, it, pt, or und when too short to tell
complaintSignalstringpossible, not_detected, or not_evaluated (beta, Spanish, Italian, Portuguese)
isDuplicatebooleantrue for an exact duplicate of an earlier comment
isSpambooleantrue when simple spam rules match
statusstringIn monitor mode: NEW, CHANGED, or UNCHANGED
processingStatusstringOK, or ERROR for an invalid comment (not charged)

The default key-value store contains:

  • SUMMARY — sentiment distribution, net sentiment, complaint signals, and daily volume;
  • RUN_MANIFEST — counts, source completeness, baseline status, and whether the run stopped at your maximum cost;
  • MODEL_MANIFEST — model repositories, revisions, licenses, sizes, and SHA-256 hashes.

Weekly sentiment monitoring

Set mode to monitor and give a stable stateKey, such as brand-weekly. The first complete run marks valid comments as NEW. Later runs return NEW, CHANGED, or UNCHANGED for each comment.

Baselines are kept in the named key-value store sentiment-monitor-state of your account, because each run starts with a new default store. They contain hashes and prediction summaries, never raw text or author identity. A truncated source or an invalid comment does not replace the previous baseline. Changing the model, the language set, or the analysis settings makes an old baseline incompatible instead of silently comparing different analyses.

Only one monitoring run per stateKey works at a time: a second run started meanwhile stops at once with an explicit message, before analyzing anything. The lock of a run that crashed expires at that run's timeout. If another run publishes a newer baseline while a run is still working, the slower run keeps it and reports baselineUpdated: false. After an aborted run, check RUN_MANIFEST before relying on the baseline. Use a new stateKey when you change languageField.


Complaint signal (beta)

complaintSignal can flag a possible problem (a crash, a login issue, a missing refund…) even when sentiment is neutral or positive. It uses local rules for Spanish, Italian, and Portuguese. possible means a rule matched. not_detected means no rule matched, which does not prove the comment contains no problem. not_evaluated means the comment is in a language without rules, such as English, French, or German. A comment too short for its language to be determined is still checked against the Spanish, Italian, and Portuguese rules.

Use it to sort comments for review, not as a final classification. On 74 original Portuguese reviews, it flagged 29 of 39 complaints with 1 false alarm among the other 35. On 127 short Brazilian shopping reviews, it flagged 51 of 70 complaints, with 13 false alarms among the other 57. Short or implicit complaints are the ones it misses most.


Accuracy and languages

  • On 612 annotated test sentences (102 per language), sentiment reaches a macro-F1 of 0.870 (0.838 to 0.893 depending on the language).
  • On real customer reviews translated into the six languages, macro-F1 is 0.796 on full reviews and 0.672 on short extracts of 10 to 40 characters.
  • Very short Spanish, Italian, and Portuguese comments can be confused with one another. When the evidence is weak, the Actor returns und instead of guessing; set languageField when your source provides the language.
  • Indirect complaints with no clearly negative word, such as a question ("free shipping, then fees at checkout?") or a comparison ("slower than another shop"), can come out neutral instead of negative, especially in German.

Sarcasm, very short text, domain jargon, and mixed opinions reduce quality. Review a sample of your own data before automating decisions.


Privacy and responsible use

Analysis runs inside the Actor with pinned models; model downloads and remote AI fallbacks are disabled at run time. Do not use sentiment as a decision about an individual, as proof of intent, or as an explanation of why a trend changed.

Comments can contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. Only analyze comments you have a legitimate reason to process, and use includeText and includeSourceIdentifiers to keep the output minimal. If you're unsure whether your reason is legitimate, consult your lawyers.


Limits and tips

maxItems is capped at 10,000 comments per run and maxTextChars at 5,000 characters per comment; longer or malformed comments become ERROR rows while the others continue. Each raw Dataset page is limited to 8 MiB and the retained source to 32 MiB. The Actor needs at least 2 GB of memory; more memory gives more CPU and faster runs on large inputs.

  • Start with a small maxItems to check that textField points to the comment text.
  • Set a maximum cost per run in Apify to cap spending on large Datasets.
  • Set languageField when your scraper gives a reliable language per comment: short comments are then labeled more accurately.

FAQ

What is comment sentiment analysis?

It labels each comment or review as positive, neutral, or negative, so you can measure how people feel about a brand, product, or video without reading every comment.

Does this Actor scrape social networks?

No. It analyzes comments you already have, from another Actor's Dataset or pasted text. Use any comments scraper first, then pass its Dataset ID.

Can I analyze YouTube comments or app store reviews?

Yes. Run a YouTube comments scraper or an app store reviews scraper on Apify, then give its Dataset ID to this Actor and set textField to the field that holds the comment text.

Is there a sentiment analysis API?

Yes. Every Apify Actor has an API. Start a run and read the results from Python, Node.js, or any HTTP client: see the API tab and the GitHub examples.

How do I export the results to CSV or Excel?

Open the run's Dataset and choose JSON, CSV, Excel, or HTML, or connect Google Sheets through Apify integrations.

Is my text sent to an AI service?

No. Both the analysis and the models run inside the Actor.

Which languages are supported?

English, French, German, Spanish, Italian, and Portuguese. The complaint signal covers Spanish, Italian, and Portuguese.

Can I run it every week?

Yes. Use monitor mode with a stable stateKey and an Apify schedule to see only new or changed comments.


Other Actors by KazKN

ActorWhen to choose it
Vinted Smart Scraper: Listings, Sellers & PricesScrape Vinted listings by keyword in 26 countries and compare prices between markets
Vinted Turbo Scraper: Search, Seller & Item URLsPaste any Vinted URL (search, brand, category, or seller profile) and export it
LoopNet + Crexi Scraper · CRE ListingsCommercial real estate listings from LoopNet and Crexi in one broker-ready file
YouTube Channel Finder — Qualified Creator LeadsFind YouTube creators for sponsorships, outreach, and influencer campaigns
App Store Scraper for Localization GapsFind strong US apps missing French, German, Spanish, or other localizations
Shopify Apps Spy + Product ScraperSee which apps a Shopify store has installed, and scrape its products
Vestiaire Collective Scraper: Sold Items & ExportExport Vestiaire Collective listings and sold items with prices

Technical notes

  • Stack: Apify SDK, TypeScript, Node.js, and Transformers.js with quantized ONNX models.
  • Sentiment model: Horizon-Labs/multilingual-sentiment-small (Apache-2.0), pinned to one revision and run inside the Actor.
  • Output: Apify Dataset with JSON, CSV, Excel, HTML, API, and integrations, plus SUMMARY, RUN_MANIFEST, and MODEL_MANIFEST records.

Support

Open an issue on Apify for bugs, missing languages, new fields, or questions about your data.

If this Actor helped your workflow, an honest Apify review helps other teams evaluate it and helps prioritize maintenance.