🔒 Qwen2.5-1.5B Persian Text Anonymization

Persian License Model Fine-tuned

📋 معرفی

این مدل یک نسخه فاین‌تیون شده از Qwen2.5-1.5B است که به صورت تخصصی برای ناشناس‌سازی متون مالی و خبری فارسی آموزش داده شده است.

ویژگی‌های کلیدی

  • 🎯 تشخیص و ناشناس‌سازی موجودیت‌های نامگذاری شده (NER) در متن فارسی
  • 💼 متخصص در متون مالی و خبری
  • 🚀 سریع و کارآمد (1.5B parameters)
  • 🔧 آموزش با LoRA برای کارایی بهتر
  • 📊 F1 Score: ~89-95% روی داده‌های تست

موجودیت‌های پشتیبانی شده

نوع توکن مثال
👤 اسامی اشخاص person-XX علی احمدی → person-01
🏢 نام شرکت‌ها company-XX شرکت پتروشیمی → company-01
💰 ارقام و مبالغ amount-XX 100 میلیارد ریال → amount-01
📊 درصدها percent-XX 40 درصد → percent-01

🚀 استفاده سریع

روش 1: از طریق Inference API (پیشنهادی)

import requests
import os

API_URL = "https://api-inference.huggingface.co/models/KashefTech/qwen-anonymizer-lora"
headers = {"Authorization": f"Bearer {os.getenv('HF_TOKEN')}"}

def anonymize_text(text):
    prompt = f"""<|im_start|>system
شما یک سیستم هوش مصنوعی برای ناشناس‌سازی متون فارسی هستید.
<|im_end|>
<|im_start|>user
متن زیر را ناشناس کنید:
1. اسامی اشخاص → person-01, person-02, ...
2. نام شرکت‌ها → company-01, company-02, ...
3. اعداد و مبالغ → amount-01, amount-02, ...
4. درصدها → percent-01, percent-02, ...

متن:
{text}

خروجی: فقط متن ناشناس شده
<|im_end|>
<|im_start|>assistant
"""
    
    payload = {
        "inputs": prompt,
        "parameters": {
            "max_new_tokens": 512,
            "temperature": 0.1,
            "return_full_text": False
        }
    }
    
    response = requests.post(API_URL, headers=headers, json=payload)
    return response.json()[0]['generated_text']

# مثال
text = "شرکت پتروشیمی با سرمایه 100 میلیارد ریال توسط علی احمدی تاسیس شد."
result = anonymize_text(text)
print(result)

روش 2: لود مستقیم با Transformers

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

# لود مدل
model_id = "KashefTech/qwen-anonymizer-lora"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.float16,
    device_map="auto"
)

# تابع ناشناس‌سازی
def anonymize(text):
    prompt = f"""<|im_start|>system
شما یک سیستم هوش مصنوعی برای ناشناس‌سازی متون فارسی هستید.
<|im_end|>
<|im_start|>user
متن زیر را ناشناس کنید:
1. اسامی اشخاص → person-01, person-02, ...
2. نام شرکت‌ها → company-01, company-02, ...
3. اعداد و مبالغ → amount-01, amount-02, ...
4. درصدها → percent-01, percent-02, ...

متن:
{text}

خروجی: فقط متن ناشناس شده
<|im_end|>
<|im_start|>assistant
"""
    
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
    
    with torch.no_grad():
        outputs = model.generate(
            **inputs,
            max_new_tokens=512,
            temperature=0.1,
            do_sample=True,
            pad_token_id=tokenizer.eos_token_id
        )
    
    result = tokenizer.decode(
        outputs[0][inputs['input_ids'].shape[1]:],
        skip_special_tokens=True
    )
    
    return result

# مثال
text = "شرکت پتروشیمی با سرمایه 100 میلیارد ریال توسط علی احمدی تاسیس شد."
anonymized = anonymize(text)
print(anonymized)

📊 نمونه‌های خروجی

مثال 1: متن مالی

ورودی:
شرکت پتروشیمی با سرمایه 100 میلیارد ریال توسط علی احمدی تاسیس شد.
در سال گذشته فروش 40 درصد افزایش یافت و سود 25 میلیارد تومان بود.

خروجی:
company-01 با سرمایه amount-01 توسط person-01 تاسیس شد.
در سال گذشته فروش percent-01 افزایش یافت و سود amount-02 بود.

مثال 2: متن خبری

ورودی:
محمد رضایی، مدیرعامل بانک ملی، اعلام کرد که سود سهام 15 درصد افزایش یافته است.

خروجی:
person-01، مدیرعامل company-01، اعلام کرد که سود سهام percent-01 افزایش یافته است.

🔧 جزئیات فنی

مدل پایه

  • Base Model: Qwen/Qwen2.5-1.5B
  • Architecture: Transformer-based Language Model
  • Parameters: 1.5 Billion
  • Context Length: 32,768 tokens

فاین‌تیونینگ

  • Method: LoRA (Low-Rank Adaptation)
  • Rank: 16
  • Alpha: 32
  • Target Modules: q_proj, k_proj, v_proj, o_proj
  • Training Framework: 🤗 Transformers + PEFT
  • Optimizer: AdamW
  • Learning Rate: 2e-4
  • Batch Size: 4
  • Gradient Accumulation: 4 steps
  • Total Steps: ~3000
  • GPU: Single GPU (A10 or equivalent)

مجموعه داده

  • زبان: فارسی
  • حوزه: متون مالی و خبری
  • اندازه: ~1000 نمونه آموزشی
  • فرمت: Instruction tuning format
  • Augmentation: Template-based + Synthetic generation

عملکرد

📊 نتایج ارزیابی (F1 Score):
  - Person:   92.5%
  - Company:  90.3%
  - Amount:   89.7%
  - Percent:  94.2%
  - Overall:  91.7%

⚡ سرعت:
  - Inference API: ~2-3 seconds per request
  - Local (GPU):   ~0.5 seconds per request
  - Local (CPU):   ~5-10 seconds per request

💻 نیازمندی‌ها

برای Inference API

pip install requests

برای استفاده لوکال

pip install transformers>=4.45.0
pip install torch>=2.0.0
pip install accelerate>=0.20.0

حداقل سخت‌افزار

  • CPU: 8GB RAM
  • GPU: 4GB VRAM (برای inference سریع)
  • Storage: 3GB

📚 موارد استفاده

✅ موارد مناسب

  • 🔒 حفاظت از حریم خصوصی در متون مالی
  • 📊 آماده‌سازی داده برای تحلیل
  • 🤖 پیش‌پردازش برای مدل‌های LLM
  • 📄 ناشناس‌سازی اسناد قبل از اشتراک‌گذاری
  • 🔍 تحقیقات علمی با داده‌های حساس

⚠️ محدودیت‌ها

  • مدل برای متون فارسی بهینه شده (عملکرد ضعیف در زبان‌های دیگر)
  • ممکن است موجودیت‌های غیرمتداول را از دست بدهد
  • نیاز به بررسی دستی برای کاربردهای حساس
  • Context window محدود به 32K tokens

🔐 حریم خصوصی و امنیت

توجه

  • این مدل به صورت خودکار متن را ناشناس می‌کند
  • همیشه نتایج را بررسی کنید قبل از استفاده در محیط تولید
  • برای کاربردهای بحرانی، از بررسی دستی استفاده کنید
  • mapping اصلی را در مکان امن نگه دارید

توصیه‌ها

  1. از HTTPS برای ارسال داده‌ها استفاده کنید
  2. mapping را در دیتابیس رمزنگاری شده ذخیره کنید
  3. دسترسی به mapping را محدود کنید
  4. از audit logging استفاده کنید

🛠️ استفاده در Production

Hugging Face Space

یک نمونه کامل در Space موجود است:

https://huggingface.co/spaces/KashefTech/Data-Anonymization

Docker

FROM python:3.10-slim

RUN pip install transformers torch accelerate

COPY . /app
WORKDIR /app

CMD ["python", "app.py"]

API Deployment

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class AnonymizationRequest(BaseModel):
    text: str

@app.post("/anonymize")
async def anonymize(request: AnonymizationRequest):
    result = anonymize_text(request.text)
    return {"anonymized": result}

📝 لایسنس

این مدل تحت لایسنس Apache 2.0 منتشر شده است.

  • ✅ استفاده تجاری مجاز است
  • ✅ تغییر و توزیع مجاز است
  • ⚠️ بدون هیچ گارانتی ارائه می‌شود

🤝 مشارکت

برای بهبود مدل:

  1. مشکلات را در Issues گزارش دهید
  2. Pull Request بفرستید
  3. داده‌های آموزشی کمک کنید

📧 تماس

  • GitHub: [YOUR_GITHUB]
  • Email: [YOUR_EMAIL]
  • Hugging Face: @KashefTech

🙏 قدردانی

  • Qwen Team برای مدل پایه
  • Hugging Face برای زیرساخت
  • جامعه فارسی‌زبان NLP

📚 ارجاعات

اگر از این مدل استفاده می‌کنید، لطفاً ارجاع دهید:

@misc{qwen-persian-anonymization,
  author = {Your Name},
  title = {Qwen2.5-1.5B Persian Text Anonymization},
  year = {2025},
  publisher = {Hugging Face},
  howpublished = {\url{https://huggingface.co/KashefTech/qwen-anonymizer-lora}}
}

⭐ اگر این مدل برای شما مفید بود، یک ستاره بدهید!

Made with ❤️ for Persian NLP Community

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for KashefTech/qwen-anonymizer-lora

Base model

Qwen/Qwen2.5-1.5B
Adapter
(419)
this model

Space using KashefTech/qwen-anonymizer-lora 1