From 6f76c483ec415c8e187ba5fff3d55a45ef6f6507 Mon Sep 17 00:00:00 2001 From: wyn <1074145239@qq.com> Date: Thu, 21 May 2026 14:14:34 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=98=E4=B8=8D=E9=94=99=EF=BC=8C=E6=8C=BA?= =?UTF-8?q?=E5=AE=8C=E7=BE=8E=EF=BC=8C=E5=94=AF=E4=B8=80=E4=B8=8D=E8=B6=B3?= =?UTF-8?q?The=20results=20of=20the=20linear=20regression=20analysis=20in?= =?UTF-8?q?=20this=20study=20show=20that=20work=20immersion=20among=20emer?= =?UTF-8?q?gency=20department=20nurses=20is=20an=20important=20influencing?= =?UTF-8?q?=20factor=20for=20organizational=20silence=20(P=20<=200.05).=20?= =?UTF-8?q?Organizational=20silence=20among=20emergency=20department=20nur?= =?UTF-8?q?ses=20is=20a=20process=20influenced=20by=20both=20individual=20?= =?UTF-8?q?motivation=20[23]=20and=20external=20environment=20[24].=20The?= =?UTF-8?q?=20higher=20the=20immersion=20scores=20of=20emergency=20departm?= =?UTF-8?q?ent=20nurses,=20the=20more=20likely=20they=20are=20to=20feel=20?= =?UTF-8?q?intrinsically=20motivated=20[25]=20and=20willing=20to=20speak?= =?UTF-8?q?=20up.=2024=E6=88=AA=E5=8F=96=E6=88=90=E4=BA=86=E5=90=8E?= =?UTF-8?q?=E9=9D=A2=E7=9A=84he=20higher=20the=20immersion=20scores=20of?= =?UTF-8?q?=20emergency=20department=20nurses,=20the=20more=20likely=20the?= =?UTF-8?q?y=20are=20to=20feel=20intrinsically=20motivated?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/common/ReferenceCheckService.php | 75 ++++++++++++++++++-- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/application/common/ReferenceCheckService.php b/application/common/ReferenceCheckService.php index 27ff9d8c..be13d089 100644 --- a/application/common/ReferenceCheckService.php +++ b/application/common/ReferenceCheckService.php @@ -193,7 +193,7 @@ class ReferenceCheckService 'created_at' => $now, 'updated_at' => $now, ]); - continue; + $this->pushJob(intval($checkId), $delay); $checkIds[] = $checkId; $queued++; @@ -682,13 +682,13 @@ class ReferenceCheckService */ private function extractLocalCitationContext($content, $tagStart, $tagEnd, array $tagSpans) { - $sentenceStart = $this->findSentenceStart($content, $tagStart); + $paragraphStart = $this->findParagraphStart($content, $tagStart); $sentenceEnd = $this->findSentenceEnd($content, $tagEnd, $tagEnd); - $prevTagEnd = $sentenceStart; + $prevTagEnd = $paragraphStart; $nextTagStart = $sentenceEnd; foreach ($tagSpans as $span) { - if ($span['end'] <= $tagStart && $span['end'] > $prevTagEnd && $span['end'] >= $sentenceStart) { + if ($span['end'] <= $tagStart && $span['end'] > $prevTagEnd) { $prevTagEnd = $span['end']; } if ($span['start'] > $tagEnd && $span['start'] < $nextTagStart) { @@ -696,9 +696,13 @@ class ReferenceCheckService } } - $hasPriorCiteInSentence = ($prevTagEnd > $sentenceStart); - // 同句后续引用:从上一 标签后开始;首个引用:从整句开头到本标签前 - $localStart = $hasPriorCiteInSentence ? $prevTagEnd : $sentenceStart; + $hasPriorCiteInParagraph = ($prevTagEnd > $paragraphStart); + // 同段后续引用:从上一 后开始;段内首个引用:从段落开头到本标签前(非仅最后一句) + if ($hasPriorCiteInParagraph) { + $localStart = $prevTagEnd; + } else { + $localStart = $this->capContextStartBeforeTag($content, $tagStart, $paragraphStart); + } // 默认:引用标签前的论述(如 Yin et al. [13] → 含 “higher than … Yin et al.”) $localEnd = $tagStart; @@ -894,6 +898,63 @@ class ReferenceCheckService return true; } + /** + * 段落起始(HTML / 换行),避免英文多句段落只取到最后一个句号后的一句 + */ + private function findParagraphStart($content, $tagStart) + { + $search = substr($content, 0, max(0, $tagStart)); + if ($search === '') { + return 0; + } + + $best = 0; + + if (preg_match_all('/]*>/i', $search, $m, PREG_OFFSET_CAPTURE)) { + $last = end($m[0]); + $best = max($best, $last[1] + strlen($last[0])); + } + if (preg_match_all('/<\/p>\s*/i', $search, $m, PREG_OFFSET_CAPTURE)) { + $last = end($m[0]); + $best = max($best, $last[1] + strlen($last[0])); + } + if (preg_match_all('/\s*/i', $search, $m, PREG_OFFSET_CAPTURE)) { + $last = end($m[0]); + $best = max($best, $last[1] + strlen($last[0])); + } + + $pos = strrpos($search, "\n\n"); + if ($pos !== false) { + $best = max($best, $pos + 2); + } + $pos = strrpos($search, "\n"); + if ($pos !== false) { + $best = max($best, $pos + 1); + } + + return $best; + } + + /** + * 段落过长时从引用处向前截取上限,避免单次 LLM 上下文过大 + */ + private function capContextStartBeforeTag($content, $tagStart, $paragraphStart, $maxBytes = 2500) + { + if ($tagStart - $paragraphStart <= $maxBytes) { + return $paragraphStart; + } + + $start = $tagStart - $maxBytes; + $slice = substr($content, $start, $tagStart - $start); + if (preg_match('/[.!?。!?]\s+/u', $slice, $m, PREG_OFFSET_CAPTURE)) { + $last = end($m[0]); + $rel = $last[1] + strlen($last[0]); + return $start + $rel; + } + + return max($paragraphStart, $start); + } + private function findSentenceStart($content, $position) { $start = 0;