AutospamPretrainPipeline.php 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. <?php
  2. namespace App\Jobs\AutospamPipeline;
  3. use Illuminate\Bus\Queueable;
  4. use Illuminate\Contracts\Queue\ShouldBeUnique;
  5. use Illuminate\Contracts\Queue\ShouldQueue;
  6. use Illuminate\Foundation\Bus\Dispatchable;
  7. use Illuminate\Queue\InteractsWithQueue;
  8. use Illuminate\Queue\SerializesModels;
  9. use App\Util\Lexer\Classifier;
  10. use App\AccountInterstitial;
  11. use App\Status;
  12. use Illuminate\Support\Facades\Storage;
  13. use App\Services\AutospamService;
  14. class AutospamPretrainPipeline implements ShouldQueue
  15. {
  16. use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  17. public $classifier;
  18. /**
  19. * Create a new job instance.
  20. */
  21. public function __construct()
  22. {
  23. $this->classifier = new Classifier();
  24. }
  25. /**
  26. * Execute the job.
  27. */
  28. public function handle(): void
  29. {
  30. $classifier = $this->classifier;
  31. $aiCount = AccountInterstitial::whereItemType('App\Status')
  32. ->whereIsSpam(true)
  33. ->count();
  34. if($aiCount < 100) {
  35. return;
  36. }
  37. AccountInterstitial::whereItemType('App\Status')
  38. ->whereIsSpam(true)
  39. ->inRandomOrder()
  40. ->take(config('autospam.nlp.spam_sample_limit'))
  41. ->pluck('item_id')
  42. ->each(function ($ai) use($classifier) {
  43. $status = Status::whereNotNull('caption')->find($ai);
  44. if(!$status) {
  45. return;
  46. }
  47. $classifier->learn($status->caption, 'spam');
  48. });
  49. Storage::put(AutospamService::MODEL_SPAM_PATH, $classifier->export());
  50. AutospamUpdateCachedDataPipeline::dispatch()->delay(5);
  51. }
  52. }