AI Social API
Updated 2026-09-16 · Chad

Using an LLM to Spot Coordinated Word-of-Mouth Posts: What a Keyword Dictionary Misses, and How to Fill the Gap

In one line: Paid word-of-mouth posting is a real industry. A keyword dictionary can tell you whether a single post reads positive or negative, but it can’t tell you whether a batch of posts, taken together, looks too coordinated — that takes an LLM reading the timing, wording and cross-account pattern across the batch, and even then the result is a signal, not proof.

This post contains Apify affiliate links (no extra cost to you). Costs and comparisons are stated honestly, including where Apify is not the best fit.

Coordinated word-of-mouth posting isn’t a hypothetical

Search “口碑” (“word-of-mouth”) on Threads and you land directly on recruiting posts. One from @wawajump_jump reads: “Looking for long-term collaborators ✨ word-of-mouth reply posting ✨ mainly social media posting-on-behalf and word-of-mouth comments. Platforms: Threads, Dcard, FB, Bahamut, Mobile01, FashionGuide, etc.” — the same operator running “word-of-mouth commenting” across six communities at once (Threads, Dcard, Facebook, Bahamut, Mobile01 and FashionGuide), not a one-platform, one-off case.

People who’ve worked in marketing and PR are also sharing, from the reader’s side, how they learn to spot these posts. One post from @th6li9 describes the “occupational habit” the job leaves you with: “1. Quickly spot word-of-mouth posts. 2. Don’t trust KOLs — plenty of them have blown up in scandal anyway.” In other words, people inside the industry know how to spot this, but that judgment isn’t something every social-listening operator has, and it’s hard to replicate by having a human read every single post.

If you’re scraping forum volume to run sentiment analysis, this directly affects your conclusions: a batch of arranged positive comments inflates “volume” and pushes “sentiment” up, making you misread the mood; a concentrated burst of negative reviews could just as easily be a competitor’s operation rather than genuine user dissatisfaction. Either way, you need another layer of judgment beyond a sentiment score.

What a keyword dictionary can and can’t do

Our own asia-social-listening actor’s built-in sentiment analysis uses a lightweight, rule-based keyword dictionary (about ten positive/negative words each for Traditional Chinese and English), scoring (positive hits − negative hits) / (positive + negative + 1) and thresholding at ±0.15 into positive/neutral/negative — that’s documented plainly on its Apify Store listing, and it is not an AI/LLM model.

That dictionary approach has its place: it’s cheap, instant, and good enough for a rough read on general sentiment. But it has two structural blind spots:

Closing those two gaps means changing the unit of analysis: instead of asking “is this one sentence positive or negative,” you feed a batch of posts together and have an LLM read the pattern across them.

What an LLM can see that a dictionary can’t — and what it still can’t see

Academic work on detecting “coordinated” or astroturfing campaigns typically groups signals into three buckets: timing, content, and network structure. A paper on LLM-based coordinated-campaign detection (arXiv:2501.11849) points to a timing signal — “In coordinated campaigns, retweets often occur in rapid bursts, indicating synchronized activity” — alongside content-level signals like consistent tone and text similarity.

The interesting part is that even that paper can’t get the third bucket, network structure. The same paper states it plainly: “Since 𝕏 does not provide information about the original re-tweeting actions, we predict the propagation trees” — the platform doesn’t expose the actual retweet relationships, so the authors reconstruct a likely propagation tree from mentions, follower relationships and weighted probabilities, rather than working from a real interaction graph.

That’s actually good news for anyone doing this outside a research lab: nobody has a clean relationship graph for this problem — everyone is piecing it together from partial signals. What asia-social-listening gives you is a deduplicated mention list (mention_id / author / text / created_at / platform / sentiment / is_duplicate / duplicate_of, among other fields), with no follower graph or posting history — so we don’t even attempt the “reconstruct a propagation tree” step. What an LLM can add on top is the two signal types that don’t require a relationship graph: text content and timing distribution. The difference isn’t that academia has magic data we lack; it’s that they spend an extra layer of inference approximating the structural signal, and we choose not to guess at it.

Concretely, here’s what each method can and can’t catch:

SignalKeyword dictionaryLLM reading a batch
Positive/negative wording in a single post
Sarcasm (positive wording, mocking intent)Partially (reads context)
Exact duplicate posts❌ (but the actor’s is_duplicate text-hash check catches this)
Same script, reworded across different accountsPartially (reads cross-post structural similarity)
Same brand term surging across accounts/platforms in a short window✅ (created_at + platform are comparable)
Account history, follower graph, brand-new accounts❌ (the actor has none of these fields — needs separate investigation)

How to design the classifier

Once you’ve pulled a batch of mentions with asia-social-listening, the actual flow looks like this:

Step 1 — Let the built-in dedup do what it’s good at. With deduplication: true, exact duplicates and cross-platform reposts of the same text get flagged is_duplicate: true. That’s the cheapest “copy-paste” signal available, and it costs nothing to compute — don’t waste an LLM call on it.

Step 2 — Bucket the remaining, non-duplicate mentions by time. For example, group everything from the same day and the same brand_matched into time windows based on created_at, so the LLM reads “the batch of posts inside this window” rather than one post at a time.

Step 3 — Use a structured prompt that has the LLM grade a signal, not deliver a verdict:

// Example prompt (illustrative — wire it into whatever LLM API you use)
{
  "system": "You will receive multiple social posts from the same time window and the same brand keyword (with author, platform, timestamp and text). Your task is to flag which posts show a coordination signal worth human review — not to determine whether they are genuine or fake. For each post, output coordination_signal (low/medium/high) and reasons (an array listing only the specific signals you observed, e.g. wording/structure closely matches another post, or many different accounts used near-identical phrasing to praise the same selling point in a short window). If there isn't enough signal, mark it low — do not speculate about an account's identity or motive.",
  "input": "<the mention list JSON for this time window>"
}

Use the returned coordination_signal to rank posts and pull the highest-scoring batch for human review — not to auto-remove content or publicly name anyone. That distinction matters; see the FAQ below.

The two approaches, side by side

Keyword dictionary (sentimentAnalysis)LLM batch classification
CostBuilt in, free (bundled into mention billing)Extra LLM API cost (depends on volume and model)
SpeedInstantNeeds an extra API call (can be batched to save cost)
Catches sarcasmNoPartially
Catches the same script across accountsNoPartially (reads text similarity)
Catches account history / network structureNoNo (needs a separate data source)
Output certaintyHigh (fixed rules, reproducible)Probabilistic signal, needs human review
Best forA quick read on general sentimentScreening suspicious volume when you have review capacity

Three ways to start

FAQ

What can’t a keyword dictionary catch? It can’t catch sarcasm, and it can’t catch the same script rewritten in different words across different accounts — it only counts positive/negative word hits inside a single post, and never compares whether a batch of posts looks suspiciously coordinated.

Can an LLM classifier catch paid word-of-mouth posts with certainty? No — it’s a probabilistic signal, not proof. Even academic work on coordinated-campaign detection stresses combining timing, content similarity and other signals rather than judging from a single post (see arXiv:2501.11849). Treat it as a ranking tool that surfaces posts for human review, not something you use to publicly accuse a specific business or person.

Isn’t that what asia-social-listening’s built-in sentiment analysis already does? No. Its sentiment analysis is a lightweight rule-based keyword dictionary (about ten positive and ten negative words each for Traditional Chinese and English), not an AI model — it only returns positive/neutral/negative and has no notion of whether a post was arranged. To do the kind of classification in this article, you need to wire in an LLM separately.

Does this catch coordinated word-of-mouth activity on Threads or Dcard? asia-social-listening v1 monitors LIHKG, PTT, HardwareZone and Telegram — it does not cover Threads, Dcard, Facebook, Bahamut or Mobile01. To cover bahamut-scraper or mobile01-scraper volume, run those actors alongside it.

Is this legal? We only scrape public content, never login-walled data, and we follow each site’s terms of service and local law.

Further reading


Chad runs 40+ published Apify actors, including asia-social-listening used here. Cost and field figures come from pipelines that actually run; academic research and competitor pricing are linked to their sources, and unverified claims are left out.