Social-Issue-Aware Smishing Detector
์ด ๋ชจ๋ธ์ ํ๊ตญ์ด SMS ๋ฌธ์ ๋ฉ์์ง๊ฐ ์ค๋ฏธ์ฑ(ํผ์ฑ ์ฌ๊ธฐ)์ธ์ง ์ ์ ๋ฌธ์ ์ธ์ง๋ฅผ ํ๋ณํ๊ธฐ ์ํด ๋ง๋ค์ด์ง TF-IDF + Logistic Regression ์์๋ธ ๋ถ๋ฅ๊ธฐ์ ๋๋ค.
๐ ํ์ต ๋ฐ์ดํฐ์ ์ถ์ฒ
- ๋ณธ ๋ชจ๋ธ์ Hugging Face ์ปค๋ฎค๋ํฐ์ ์คํ ๋ฐ์ดํฐ์ ์ธ meal-bbang/Korean_message ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต ๋ฐ ๊ฒ์ฆ๋์์ต๋๋ค (์ด 16,309๊ฑด).
๐ ์ฃผ์ ํน์ง
- ํํ์ ๋ถ์๊ธฐ ๋ถํ์:
char_wbn-gram ๋ฐฉ์์ ์ฌ์ฉํ์ฌ MeCab, KoNLPy ๋ฑ์ ์ค์น ์์ด๋ ํ๊ตญ์ด ์กฐ์ฌ์ ์ด๊ฐ ํจํด์ ํ์ตํฉ๋๋ค. ์ด๋น ์์ฒ ๊ฑด ์ด์ ์ถ๋ก ๊ฐ๋ฅํ ๊ทน๋์ ๊ฐ๋ฒผ์์ ์ง๋๋๋ค. - ํน์ ๊ธฐํธ ์ฒ๋ฆฌ (์ ๊ฐ ๋ฌธ์ ์ ๊ทํ):
unicodedata.normalize์ NFKC ๋ชจ๋๋ฅผ ํ์ฉํ์ฌ ์ํ์์ ๊ฐ๋ ๋ณด๋ด๊ฑฐ๋ ๊ณต๊ฒฉ์๋ค์ด ํํฐ๋ง์ ํผํ๊ธฐ ์ํด ๊ผผ์๋ก ์ฐ๋ '์ ๊ฐ ๋ฌธ์'๋ค์ ์ผ๋ฐ ๊ธ์ ํญ ํํ๋ก ๋ฐ๋ฅด๊ฒ ์ ๊ทํํ์ต๋๋ค. - URL ํ ํฐ ์นํ ๊ธฐ๋ฒ: ๋จธ์ ๋ฌ๋ ๋ถ๋ฅ๊ธฐ๊ฐ URL ํํ ๊ทธ ์์ฒด์ ์ง์คํ ์ ์๋๋ก ํ
์คํธ์ ํฌํจ๋ ๋ชจ๋ ์น ์ฃผ์(http/www)๋ฅผ ์ ๊ท์์ ํตํด
__URL__์ด๋ผ๋ ํน์ ํ ํฐ์ผ๋ก ์ผ๊ด ์นํํ์ฌ ํ์ต์์ผฐ์ต๋๋ค.
๐ ๋ชจ๋ธ ์ฑ๋ฅ
์์ธ ์์น๋ metrics.json ์ฐธ๊ณ .
- AUC-ROC: 0.9995
- F1 Score: 0.9981
๐ ์ฌ์ฉ ๋ฐฉ๋ฒ (Python)
import joblib
from huggingface_hub import hf_hub_download
# ํ๋ธ์์ ํ์ผ ๋ค์ด๋ก๋
model_path = hf_hub_download(repo_id="Hyeonseo/ko-smishing-detector", filename="pipeline.pkl")
pipeline = joblib.load(model_path)
# ์ถ๋ก ํ
์คํธ (0: ์ ์, 1: ์ค๋ฏธ์ฑ)
texts = [
"[Web๋ฐ์ ] ์๋
ํ์ธ์, ์ฌ๋์ง์๊ธ ์ ์ฒญ ์๋ด์
๋๋ค. http://bit.ly/fakeurl",
"๋๋ฆฌ๋ ๋ด์ผ ์คํ 3์ ํ์ ์๋ฃ ์ฒจ๋ถํฉ๋๋ค."
]
probas = pipeline.predict_proba(texts)[:, 1]
for txt, score in zip(texts, probas):
print(f"์ค๋ฏธ์ฑ ํ๋ฅ {score:.2%} : {txt}")