visuddhinanda 1 неделя назад
Родитель
Сommit
27e81e6cda
1 измененных файлов с 79 добавлено и 0 удалено
  1. 79 0
      api-v13/app/Console/Commands/ExportPaliWordFrequency.php

+ 79 - 0
api-v13/app/Console/Commands/ExportPaliWordFrequency.php

@@ -0,0 +1,79 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Models\Sentence;
+use Illuminate\Console\Attributes\Description;
+use Illuminate\Console\Attributes\Signature;
+use Illuminate\Console\Command;
+
+#[Signature('export:pali-word-frequency {--limit=0 : 只处理前 N 条记录,0 表示全部(测试用)}')]
+#[Description('扫描 channel.type=translation 的句子,统计 [[巴利文]] 单词出现次数并输出 CSV')]
+class ExportPaliWordFrequency extends Command
+{
+    /**
+     * Execute the console command.
+     */
+    public function handle(): int
+    {
+        $limit = (int) $this->option('limit');
+
+        $query = Sentence::type('translation')->select(['uid', 'content'])->orderBy('uid');
+        $total = $query->count();
+        $this->info("符合要求的 sentences 总数: {$total}".($limit > 0 ? "(本次仅处理前 {$limit} 条)" : ''));
+
+        if ($total === 0) {
+            $this->warn('没有找到任何记录,退出。');
+
+            return 0;
+        }
+
+        if ($limit > 0) {
+            $query = $query->limit($limit);
+        }
+
+        $wordCounts = [];
+        $processed = 0;
+        $matchedSentences = 0;
+
+        foreach ($query->cursor() as $sent) {
+            $processed++;
+            if (! empty($sent->content) && preg_match_all('/\[\[([^\[\]]+)\]\]/u', $sent->content, $matches) > 0) {
+                $matchedSentences++;
+                foreach ($matches[1] as $word) {
+                    $word = trim($word);
+                    if ($word === '') {
+                        continue;
+                    }
+                    $wordCounts[$word] = ($wordCounts[$word] ?? 0) + 1;
+                }
+            }
+
+            if ($processed % 1000 === 0) {
+                $this->info("已处理 {$processed}/{$total} 条,其中 {$matchedSentences} 条包含 [[巴利文]],累计发现 ".count($wordCounts).' 个不同单词');
+            }
+        }
+
+        arsort($wordCounts, SORT_NUMERIC);
+
+        $fileName = 'pali-word-frequency-'.date('Ymd-His').($limit > 0 ? "-limit{$limit}" : '').'.csv';
+        $exportDir = storage_path('app/public/export');
+        if (! is_dir($exportDir)) {
+            mkdir($exportDir, 0755, true);
+        }
+        $filePath = $exportDir.'/'.$fileName;
+
+        $file = fopen($filePath, 'w');
+        fwrite($file, "\xEF\xBB\xBF");
+        fputcsv($file, ['word', 'count']);
+        foreach ($wordCounts as $word => $count) {
+            fputcsv($file, [$word, $count]);
+        }
+        fclose($file);
+
+        $this->info("扫描完成:共处理 {$processed} 条记录,{$matchedSentences} 条包含 [[巴利文]],".count($wordCounts).' 个不同单词');
+        $this->info("CSV 已输出: {$filePath}");
+
+        return 0;
+    }
+}