{"record":{"id":"9dde63f1c2af1cae","repo":"stanfordnlp/CoreNLP","slug":"empty-top-speakers-list-for-quote-toshorterst","errorCode":null,"errorMessage":"  Empty top speakers list for: ${quote.toShorterString()} [no candidate top speakers found – just ignore!","messagePattern":"  Empty top speakers list for: (.+?) \\[no candidate top speakers found – just ignore!","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/edu/stanford/nlp/quoteattribution/Sieves/MSSieves/BaselineTopSpeakerSieve.java","lineNumber":102,"sourceCode":"        // if none found, try again with bigger window\n        if (topSpeakers.isEmpty()) {\n          if (backSpanStart > 0) {\n            backSpanStart = Math.max(0, quoteRun.first - BACKWARD_WINDOW_BIG);\n            closestMentionsBackward = findClosestMentionsInSpanBackward(new Pair<>(backSpanStart, quoteRun.first - 1));\n            // log.info(\"  Found big backward mentions in [\" + backSpanStart + \",\" + (quoteRun.first - 1) + \"]: \" +\n            //         closestMentionsBackward);\n          }\n          if (forwardSpanEnd < toks.size() - 1) {\n            forwardSpanEnd = Math.min(quoteRun.second + FORWARD_WINDOW_BIG, toks.size() - 1);\n            closestMentions = findClosestMentionsInSpanForward(new Pair<>(quoteRun.second + 1, forwardSpanEnd));\n            // log.info(\"  Found big forward mentions in [\" + (quoteRun.second + 1) + \",\" + forwardSpanEnd + \"]: \" +\n            //         closestMentions);\n          }\n          topSpeakers = Counters.toSortedList(getTopSpeakers(closestMentions, closestMentionsBackward, gender,\n                  quote, true));\n        }\n        if (topSpeakers.isEmpty()) {\n          log.warn(\"  Empty top speakers list for: \" + quote.toShorterString() +\n                  \" [no candidate top speakers found – just ignore!\");\n          continue;\n        }\n        topSpeakers = removeQuoteNames(topSpeakers, quote);\n        String topSpeaker = topSpeakers.get(0);\n\n        Pair<String, String> nextPrediction = getConversationalNextPrediction(quotes, quote_idx, gender);\n        boolean set = updatePredictions(quote, nextPrediction);\n        if (set) {\n          continue;\n        }\n\n        Pair<String, String> prevPrediction = getConversationalPreviousPrediction(quotes, quote_idx, gender);\n        set = updatePredictions(quote, prevPrediction);\n        if (set) {\n          continue;\n        }\n","sourceCodeStart":84,"sourceCodeEnd":120,"githubUrl":"https://github.com/stanfordnlp/CoreNLP/blob/1b7edd19c4d0d7b1f13a2591425b9b60a0b1af7a/src/edu/stanford/nlp/quoteattribution/Sieves/MSSieves/BaselineTopSpeakerSieve.java#L84-L120","documentation":"In the quote attribution pipeline, BaselineTopSpeakerSieve.topSpeakerInRange assembles candidate top speakers for a quote from co-occurring mentions. If the resulting list is empty (no candidates from either forward or backward passes), there is no speaker to attribute, so a warning is logged with the quote text and the quote is skipped.","triggerScenarios":"doMentionToSpeaker processes a quote whose surrounding mentions yield an empty candidate set from getTopSpeakers — e.g. no nearby animate/person mentions and no gender-filtered candidates.","commonSituations":"Documents with sparse mention density (dialogue-heavy or fragmented text); quotes in paragraphs without detected person entities; coreference chains that never reach the quote's vicinity.","solutions":["Check the upstream NER/coreference annotations — missing Person mentions are the usual root cause; run a stronger NER model.","Ignore the warning: the quote is intentionally skipped and remains unattributed.","Tune sieve options (e.g. gender filters, mention distance) to widen the candidate pool.","Inspect the specific quote via the logged toShorterString() to see why no candidates were found."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"if (topSpeakers == null || topSpeakers.isEmpty()) { log.debug(\"no candidate speakers for quote: \" + quote.toShorterString()); return null; }","typeGuard":"if (topSpeakers == null || topSpeakers.isEmpty()) return null;","tryCatchPattern":"List<Person> topSpeakers = sieve.topSpeakerInRange(...);\nif (topSpeakers == null || topSpeakers.isEmpty()) { /* leave quote unattributed or try another sieve */ }","preventionTips":["Run high-quality NER and coreference before quote attribution","Accept that some quotes legitimately have no attributable speaker","Configure multiple sieves so another sieve can supply speakers when the baseline one is empty"],"tags":["nlp","quote-attribution","coreference"],"backgroundTag":"empty-result-set","analyzedSha":"1b7edd19c4d0d7b1f13a2591425b9b60a0b1af7a","analyzedAt":"2026-09-10T02:24:07.274Z","contentChangedAt":"2026-09-10T02:24:07.274Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}