added image ai-moderation

This commit is contained in:
SlimusMinus
2026-07-28 01:10:11 +03:00
parent 1132a774af
commit d376a7417a
34 changed files with 8302 additions and 34 deletions

View File

@@ -0,0 +1,39 @@
from PIL import Image
from app.exceptions.invalid_image_exception import InvalidImageException
class ImageValidator:
MIN_WIDTH = 50
MIN_HEIGHT = 50
MAX_WIDTH = 10000
MAX_HEIGHT = 10000
def validate(
self,
image: Image.Image
) -> None:
width, height = image.size
if width < self.MIN_WIDTH:
raise InvalidImageException(
f"Image width is too small: {width}"
)
if height < self.MIN_HEIGHT:
raise InvalidImageException(
f"Image height is too small: {height}"
)
if width > self.MAX_WIDTH:
raise InvalidImageException(
f"Image width is too large: {width}"
)
if height > self.MAX_HEIGHT:
raise InvalidImageException(
f"Image height is too large: {height}"
)

View File

@@ -0,0 +1,51 @@
import re
from app.moderation.profanity.dictionary import ProfanityDictionary
from app.moderation.profanity.lemmatizer import Lemmatizer
class ProfanityDetector:
def __init__(
self,
dictionary: ProfanityDictionary,
lemmatizer: Lemmatizer
):
self.dictionary = dictionary
self.lemmatizer = lemmatizer
def detect(
self,
text: str
) -> list[str]:
words = re.findall(
r"[а-яА-ЯёЁ]+",
text.lower()
)
result = []
for word in words:
lemma = self.lemmatizer.normalize(word)
for bad_word in self.dictionary.words:
if lemma.startswith(bad_word):
result.append(word)
break
return result

View File

@@ -0,0 +1,49 @@
from pathlib import Path
class ProfanityDictionary:
def __init__(
self,
file_path: str
):
self.words = self.load(file_path)
def load(
self,
file_path: str
) -> set[str]:
path = Path(file_path)
if not path.exists():
raise FileNotFoundError(
f"Profanity dictionary not found: {file_path}"
)
with open(
path,
"r",
encoding="utf-8"
) as file:
return {
line.strip().lower().replace("\ufeff", "")
for line in file
if line.strip()
}
def contains(
self,
word: str
) -> bool:
return word in self.words

View File

@@ -0,0 +1,20 @@
import pymorphy3
class Lemmatizer:
def __init__(self):
self.morph = pymorphy3.MorphAnalyzer()
def normalize(
self,
word: str
) -> str:
result = self.morph.parse(word)
return result[0].normal_form