achilleskal/summarizer-bundle
Laravel bundle that adds text summarization utilities: generate short summaries from longer content with simple configuration and integration hooks, suitable for articles, posts, and other readable text.
Installation
composer require achilleskal/summarizer-bundle
Add to config/app.php under providers:
AchillesKal\SummarizerBundle\SummarizerServiceProvider::class,
Publish the config (if needed):
php artisan vendor:publish --provider="AchillesKal\SummarizerBundle\SummarizerServiceProvider" --tag="config"
First Use Case Summarize a string in a controller or service:
use AchillesKal\SummarizerBundle\Facades\Summarizer;
$text = "Your long text here...";
$summary = Summarizer::summarize($text);
return response()->json(['summary' => $summary]);
Where to Look First
app\Facades\Summarizer (for quick usage).AchillesKal\SummarizerBundle\Services\SummarizerService (for customization).config/summarizer.php (adjust summarization logic, e.g., algorithm, max_length).Basic Summarization Use the facade for simplicity:
$summary = Summarizer::summarize($articleText, ['max_length' => 100]);
Customizing the Algorithm
Override the default summarizer (e.g., switch to ratio_text or textstat):
// In a service or config:
$summarizer = new AchillesKal\SummarizerBundle\Services\SummarizerService('textstat');
$summary = $summarizer->summarize($text);
Integration with Eloquent Models Add a trait to models for reusable summarization:
use AchillesKal\SummarizerBundle\Traits\Summarizable;
class Article extends Model
{
use Summarizable;
}
Then call:
$article->summarizeContent(); // Assumes $article->content exists
Batch Processing Process multiple texts (e.g., from a database query):
$articles = Article::all();
$summaries = collect($articles)->map(fn($article) =>
Summarizer::summarize($article->content)
);
API Integration Wrap summarization in a Laravel API resource:
public function toArray($request)
{
return [
'summary' => Summarizer::summarize($this->content),
'original_length' => strlen($this->content),
];
}
Algorithm Limitations
textstat or ratio_text. If these are missing, summarization fails silently.composer require textstat/ratio_text if needed) or handle exceptions:
try {
$summary = Summarizer::summarize($text);
} catch (\Exception $e) {
Log::error("Summarization failed: " . $e->getMessage());
return "Fallback summary...";
}
Config Overrides
config/summarizer.php (e.g., default_algorithm) may not reflect immediately if the service is cached.php artisan config:clear
Performance with Long Texts
textstat) can be slow for large inputs (>5,000 words).max_length to truncate early or implement a fallback:
$summary = Summarizer::summarize($text, [
'algorithm' => 'ratio_text',
'max_length' => 200,
]);
Dependency Conflicts
spatie/array-to-xml).Testing Edge Cases
if (empty($text) || !is_string($text)) {
return "No summary available.";
}
Custom Summarizers
Implement the AchillesKal\SummarizerBundle\Contracts\SummarizerInterface to add new algorithms:
class MySummarizer implements SummarizerInterface {
public function summarize(string $text, array $options): string {
// Custom logic
}
}
Register it in config/summarizer.php:
'algorithms' => [
'my_summarizer' => AchillesKal\MySummarizer::class,
],
Middleware for API Summarization Auto-summarize request/response bodies:
public function handle($request, Closure $next) {
$response = $next($request);
if ($response->getContent()) {
$response->setContent(
Summarizer::summarize($response->getContent())
);
}
return $response;
}
Queueing Long Summarizations Offload heavy summarization to a queue (e.g., Laravel Queues):
SummarizeJob::dispatch($text)->onQueue('summarization');
Define the job:
class SummarizeJob implements ShouldQueue {
public function handle() {
$summary = Summarizer::summarize($this->text);
// Store $summary
}
}
Log::debug("Summarization input:", ['text' => $text]);
$summary = Summarizer::summarize($text);
Log::debug("Summarization output:", ['summary' => $summary]);
$summarizers = ['ratio_text', 'textstat'];
foreach ($summarizers as $algorithm) {
$summary = Summarizer::summarize($text, ['algorithm' => $algorithm]);
Log::info("Algorithm $algorithm summary:", ['summary' => $summary]);
}
How can I help you explore Laravel packages today?