Update
This commit is contained in:
@@ -11,6 +11,7 @@
|
||||
use App\Models\Category;
|
||||
use App\Models\Meme;
|
||||
use App\Models\MemeMedia;
|
||||
use App\Models\MemeMediaEmbedding;
|
||||
use Pgvector\Laravel\Distance;
|
||||
use Str;
|
||||
|
||||
@@ -22,10 +23,46 @@ class MemeGenerator
|
||||
|
||||
const STATUS_COMPLETED = 'completed';
|
||||
|
||||
public static function getSuitableMeme(Meme $meme)
|
||||
public static function getSuitableMemeMedia(Meme $meme)
|
||||
{
|
||||
//dd($meme->toArray());
|
||||
return MemeMedia::first();
|
||||
$meme_media = null;
|
||||
|
||||
|
||||
$primary_keyword_type = $meme->primary_keyword_type;
|
||||
|
||||
if ($primary_keyword_type == 'action') {
|
||||
|
||||
$meme_media = self::getMemeMediaByKeywords($meme->action_keywords, 2, 'action_keywords');
|
||||
|
||||
if (is_null($meme_media)) {
|
||||
|
||||
$keywords = array_merge($meme->emotion_keywords, $meme->misc_keywords, $meme->keywords);
|
||||
|
||||
$meme_media = self::getMemeMediaByKeywords($keywords, 2);
|
||||
}
|
||||
} else if ($primary_keyword_type == 'emotion') {
|
||||
$meme_media = self::getMemeMediaByKeywords($meme->emotion_keywords, 2, 'emotion_keywords');
|
||||
|
||||
if (is_null($meme_media)) {
|
||||
$keywords = array_merge($meme->action_keywords, $meme->misc_keywords, $meme->keywords);
|
||||
|
||||
$meme_media = self::getMemeMediaByKeywords($keywords, 2);
|
||||
}
|
||||
} else if ($primary_keyword_type == 'misc') {
|
||||
$meme_media = self::getMemeMediaByKeywords($meme->misc_keywords, 2, 'misc_keywords');
|
||||
|
||||
if (is_null($meme_media)) {
|
||||
$keywords = array_merge($meme->action_keywords, $meme->emotion_keywords, $meme->keywords);
|
||||
|
||||
$meme_media = self::getMemeMediaByKeywords($keywords, 2);
|
||||
}
|
||||
}
|
||||
|
||||
if (is_null($meme_media)) {
|
||||
$meme_media = MemeMedia::query()->inRandomOrder()->first();
|
||||
}
|
||||
|
||||
return $meme_media;
|
||||
}
|
||||
|
||||
public static function generateMemeByCategory(Category $category)
|
||||
@@ -56,7 +93,7 @@ public static function generateMemeByCategory(Category $category)
|
||||
|
||||
if (! is_null($meme) && $meme->status == self::STATUS_PENDING) {
|
||||
// populate meme_id
|
||||
$meme->meme_id = null; // self::getMemeMediaByKeywords($meme_output->keywords)->id;
|
||||
$meme->meme_id = self::getSuitableMemeMedia($meme)->id;
|
||||
$meme->background_id = self::generateBackgroundMediaWithRunware($meme_output->background)->id;
|
||||
|
||||
if (
|
||||
@@ -172,24 +209,23 @@ public static function generateBackgroundMediaWithRunware($prompt)
|
||||
return $background_media;
|
||||
}
|
||||
|
||||
public static function getMemeMediaByKeywords(array $keywords)
|
||||
public static function getMemeMediaByKeywords(array $keywords, int $tolerance = 10, ?string $tag = null)
|
||||
{
|
||||
$meme_media = null;
|
||||
|
||||
$meme_medias = MemeMedia::withAnyTags($keywords)->take(10)->get();
|
||||
$meme_embedding = CloudflareAI::getVectorEmbeddingBgeSmall(implode(' ', $keywords));
|
||||
|
||||
|
||||
$meme_medias = MemeMediaEmbedding::query()
|
||||
->when(!is_empty($tag), function ($query) use ($tag) {
|
||||
return $query->where('tag', $tag);
|
||||
})
|
||||
->nearestNeighbors('embedding', $meme_embedding, Distance::L2)
|
||||
->take($tolerance)
|
||||
->get();
|
||||
|
||||
|
||||
if ($meme_medias->count() > 0) {
|
||||
$meme_media = $meme_medias->random();
|
||||
}
|
||||
|
||||
if (is_null($meme_media)) {
|
||||
$meme_embedding = CloudflareAI::getVectorEmbeddingBgeSmall(implode(' ', $keywords));
|
||||
|
||||
$meme_medias = MemeMedia::query()->nearestNeighbors('embedding', $meme_embedding, Distance::L2)->take(10)->get();
|
||||
|
||||
if ($meme_medias->count() > 0) {
|
||||
$meme_media = $meme_medias->random();
|
||||
}
|
||||
$meme_media = $meme_medias->random()->meme_media;
|
||||
}
|
||||
|
||||
return $meme_media;
|
||||
|
||||
Reference in New Issue
Block a user