Содержание
Интеллектуальное саммари для статей на сайте. Автоматическое выделение главного по кнопке
Краткое саммари помогает читателю быстрее понять смысл материала без необходимости читать весь текст. Это делает блог удобнее, улучшает восприятие и экономит время. Создавать выжимку вручную после каждой статьи долго и скучно поэтому намного эффективнее использовать автоматический скрипт который формирует краткое саммари по кнопке.
Введение
Идея проста. Скрипт берет текст статьи и удаляет примеры кода, технические блоки и служебные элементы. После очистки текст разбивается на отдельные предложения. Каждое из них анализируется и получает собственную оценку значимости. Алгоритм выбирает самые информативные фразы и собирает из них краткую выжимку.
Анализ выполняется только один раз. Все последующие нажатия показывают или скрывают готовое саммари без повторного вычисления. Это дает быстрый и удобный результат.
Как работает интеллектуальное саммари
Процесс состоит из нескольких этапов:
- Сначала удаляются теги pre и code, а также элементы подсветки кода.
- Далее текст делится на предложения.
- Из каждого предложения выделяются слова, они приводятся к нижнему регистру и очищаются от пунктуации.
- Короткие и служебные слова исключаются. Оставшиеся участвуют в формировании частотного словаря.
- Чем чаще слово встречается, тем сильнее оно влияет на вес предложения. На основе этих данных выбираются самые значимые фразы. Затем они сортируются в исходном порядке и объединяются в один абзац. Это и есть итоговое саммари.
Готовая разметка для статьи
<div class="article-summary-wrapper mb-3"> <button class="btn btn-outline-primary btn-sm js-auto-summary-btn" type="button"> Показать саммари </button> <div class="article-summary js-auto-summary" hidden> <div class="article-summary-text"></div> </div> </div> <div class="article-body js-article-body"> $MESSAGE$ </div>
Стили оформления блока саммари
.article-summary-wrapper {
margin: 0 0 20px;
}
.article-summary-wrapper .js-auto-summary-btn {
font-size: 0.85rem;
}
.article-summary {
margin-top: 10px;
padding: 12px 14px 12px 40px;
border-radius: 8px;
border: 1px solid rgba(0, 0, 0, 0.08);
background: linear-gradient(
135deg,
rgba(13, 110, 253, 0.06),
rgba(13, 202, 240, 0.06)
);
position: relative;
font-size: 0.95rem;
line-height: 1.6;
}
.article-summary::before {
content: "★";
position: absolute;
left: 16px;
top: 12px;
font-size: 0.9rem;
opacity: 0.8;
}
.article-summary-text {
padding-left: 0;
}
Полный скрипт интеллектуального саммари
<script>
document.addEventListener("DOMContentLoaded", function () {
var buttons = document.querySelectorAll(".js-auto-summary-btn");
var stopWords = new Set([
"и","в","во","не","что","он","она","они","на","я","с","со","как","а","то",
"все","это","по","но","из","у","к","до","за","от","о","для","же","ты",
"мы","вы","их","ему","ее","наш","ваш","так","или","был","были","быть",
"есть","нет","при","над","под","ли","там","тут","тот","эта","это",
"эти","когда","где","только","еще","уже","чтобы","тогда","очень","такой",
"через","после","перед","между"
]);
function getTextFromElement(el) {
if (!el) return "";
var clone = el.cloneNode(true);
clone.querySelectorAll(
"pre, code, script, style, .hljs, .prettyprint, .code-block"
).forEach(function (node) {
node.remove();
});
var parts = [];
var textNodes = clone.querySelectorAll("p, li");
textNodes.forEach(function (node) {
var t = (node.innerText || node.textContent || "").trim();
if (t.length > 0) parts.push(t);
});
if (parts.length === 0) {
return (clone.innerText || clone.textContent || "").trim();
}
return parts.join(" ");
}
function splitToSentences(text) {
var raw = text
.replace(/\s+/g, " ")
.replace(/([\.!\?])+/g, "$1|")
.split("|");
var sentences = [];
raw.forEach(function (s) {
var t = s.trim();
if (t.length > 0) sentences.push(t);
});
return sentences;
}
function tokenizeWords(text) {
return text
.toLowerCase()
.replace(/[^а-яa-z0-9ё]/gi, " ")
.split(/\s+/)
.filter(function (w) {
return w.length > 2 && !stopWords.has(w);
});
}
function buildWordFrequency(sentences) {
var freq = Object.create(null);
sentences.forEach(function (s) {
tokenizeWords(s).forEach(function (w) {
freq[w] = (freq[w] || 0) + 1;
});
});
return freq;
}
function scoreSentences(sentences, freq) {
var scored = [];
sentences.forEach(function (s, index) {
var words = tokenizeWords(s);
if (words.length === 0) return;
var score = 0;
words.forEach(function (w) {
if (freq[w]) score += freq[w];
});
score = score / words.length;
scored.push({ index: index, text: s, score: score });
});
return scored;
}
function generateSummary(text, maxSentences) {
maxSentences = maxSentences || 3;
var sentences = splitToSentences(text);
if (sentences.length === 0) return "";
if (sentences.length <= maxSentences) return sentences.join(" ");
var freq = buildWordFrequency(sentences);
var scored = scoreSentences(sentences, freq);
scored.sort(function (a, b) {
return b.score - a.score;
});
var top = scored.slice(0, maxSentences);
top.sort(function (a, b) {
return a.index - b.index;
});
return top.map(function (item) { return item.text; }).join(" ");
}
buttons.forEach(function (button) {
var wrapper = button.closest(".article-summary-wrapper");
var summaryBlock = wrapper.querySelector(".js-auto-summary");
var article = document.querySelector(".js-article-body");
var showText = "Показать саммари";
var hideText = "Скрыть саммари";
var generated = false;
button.addEventListener("click", function () {
var isHidden = summaryBlock.hasAttribute("hidden");
if (isHidden && !generated) {
var fullText = getTextFromElement(article);
var summary = generateSummary(fullText, 3);
if (!summary) summary = "Не удалось автоматически выделить краткое саммари.";
summaryBlock.querySelector(".article-summary-text").textContent = summary;
generated = true;
}
if (isHidden) {
summaryBlock.removeAttribute("hidden");
button.textContent = hideText;
} else {
summaryBlock.setAttribute("hidden", "");
button.textContent = showText;
}
});
});
});
</script>
Заключение
Интеллектуальное саммари делает статьи компактными, понятными и удобными. Скрипт работает автоматически, не требует внешних сервисов и подходит для любых блогов. Это простой и эффективный способ улучшить материалы и повысить удобство чтения.
Оцените полезность материала!
Лицензия: CC BY-SA 4.0
Автор: Юрий Герук
Комментарии