روشهای سنتی تشخیص زبان بر پایهی الگوهای آماری و ویژگیهای زبانی مثل حروف، n-gramها (ترکیبهای چند حرفی متوالی)، و فراوانی کلمات بنا شدهاند. این روشها ساده و سریعاند و در متنهای کوتاه نیز معمولاً دقت خوبی دارند. برای مثال، ترکیبهایی مثل "th" در انگلیسی یا "که" در فارسی به سیستم کمک میکنند زبان متن را تشخیص دهد.
با پیشرفت یادگیری ماشین و بهویژه مدلهای عمیق مثل شبکههای عصبی بازگشتی (RNN) یا ترنسفورمرها (مانند BERT و XLM-R)، پروژههای جدیدتر توانایی بسیار بیشتری در تشخیص زبان حتی در متنهای مبهم و چندزبانه پیدا کردهاند. این مدلها میتوانند تفاوتهای ظریف بین زبانهای مشابه (مثل فارسی و دری یا اسپانیایی و پرتغالی) را بهتر تشخیص دهند.
یکی از چالشهای مهم در این پروژهها، تشخیص زبان در متنهای کوتاه (مثل پیامک یا توییت) و یا متنهای چندزبانه است که در آن کاربر در یک جمله از چند زبان استفاده میکند. برای حل این مشکل، برخی پروژهها به سراغ ترکیب چند روش (hybrid models) یا استفاده از مدلهای چندزبانه (multilingual models) رفتهاند.
در نهایت، تشخیص زبان متن یک بخش حیاتی در بسیاری از سیستمهای هوش مصنوعی و نرمافزارهای مدرن محسوب میشود و هنوز هم با وجود پیشرفتها، جای کار بسیاری دارد؛ بهخصوص در پشتیبانی از زبانهای کممنبع مثل کردی، پشتو یا زبانهای محلی که دادههای آموزشی کمی دارند.
روش کلی ساخت مدل برای پروژههای تشخیص زبان متن
ساخت یک مدل برای تشخیص زبان متن معمولاً شامل چند مرحلهی اصلی است که از آمادهسازی دادهها تا آموزش و ارزیابی مدل را در بر میگیرد. در ادامه یک دید کلی از این مراحل آورده شده است:
جمعآوری و آمادهسازی دادهها
-
گام اول داشتن یک مجموعهداده متنی چندزبانه است. این دادهها میتوانند از منابعی مانند Wikipedia، Common Crawl یا پایگاههای دادهی عمومی زبانها (مثل Tatoeba و OPUS) استخراج شوند.
-
دادهها باید پاکسازی شوند: حذف نویسههای غیرضروری، یکدستسازی متن (مثلاً حذف کاراکترهای عجیب یا ایموجیها).
-
برای هر نمونه، باید برچسب زبان مشخص باشد (مثل en برای انگلیسی، fa برای فارسی).
استخراج ویژگیها (Feature Extraction)
-
در روشهای کلاسیک، از n-gramهای کاراکتری یا کلمهای استفاده میشود. بهعنوان مثال، دنبالههای 3 یا 4 حرفی میتوانند شاخص خوبی برای تشخیص زبان باشند.
-
در روشهای مدرن، از بردارهای嵌گذاری (embeddings) مثل Word2Vec، fastText یا حتی مدلهای ترنسفورمر چندزبانه (mBERT, XLM-R) برای نمایش متن استفاده میشود.
انتخاب و آموزش مدل
-
مدلهای سنتی: Naive Bayes، SVM یا Logistic Regression که با n-gramها کار میکنند. این مدلها سریع و سبکاند.
-
مدلهای عمیق: شبکههای CNN، RNN یا ترنسفورمرها که دقت بالاتری دارند و برای زبانهای مشابه نیز کارایی بهتری نشان میدهند.
-
در پروژههای عملی، استفاده از مدلهای ازپیشآموزشدیده مثل fastText (Facebook AI) یا langid.py بسیار رایج است چون بدون نیاز به آموزش سنگین، دقت بالایی ارائه میدهند.
ارزیابی و تست
-
دادهها به دو بخش آموزشی و آزمایشی تقسیم میشوند.
-
معیارهای ارزیابی شامل دقت (Accuracy)، بازخوانی (Recall) و F1-score است.
-
برای متنهای کوتاه یا ترکیبشده، بهتر است تستهای ویژهای طراحی شود.
بهبود و بهینهسازی
-
استفاده از افزایش داده (Data Augmentation) برای زبانهای کممنبع.
-
بهکارگیری مدلهای چندمرحلهای (ابتدا تشخیص گروه زبانی مثل هندواروپایی، سپس تشخیص زبان دقیق).
-
ترکیب مدلهای آماری و عمیق برای افزایش دقت در شرایط واقعی.
در یک نگاه، فرایند کلی به صورت زیر است:
جمعآوری داده → پیشپردازش متن → استخراج ویژگی → آموزش مدل → ارزیابی → بهینهسازی
معرفی و توضیح مدلهای ازپیشآموزشدیده برای تشخیص زبان متن
یکی از سادهترین و سریعترین راهها برای پیادهسازی پروژههای تشخیص زبان متن، استفاده از مدلهای آماده (Pre-trained Models) است. این مدلها قبلاً روی دادههای بزرگ آموزش دیدهاند و میتوانند بدون نیاز به صرف زمان و منابع زیاد، در پروژهها مورد استفاده قرار بگیرند. در این بخش دو مدل پرکاربرد را معرفی میکنم:
1. 🟢 fastText (Facebook AI Research)
-
توسعهدهنده: آزمایشگاه هوش مصنوعی فیسبوک (FAIR)
-
ویژگیها:
-
بر پایهی شبکههای عصبی سبک و سریع ساخته شده است.
-
از n-gramهای کاراکتری برای تشخیص زبان استفاده میکند.
-
قابلیت تشخیص بیش از 170 زبان مختلف را دارد.
-
حتی روی متنهای کوتاه (مثل توییت یا پیامک) نیز دقت خوبی نشان میدهد.
-
بسیار سریع است و میتواند روی CPU و حتی موبایل اجرا شود.
-
-
کاربردها:
-
تشخیص زبان متن ورودی در سیستمهای چت یا پشتیبانی آنلاین.
-
انتخاب خودکار زبان برای موتورهای ترجمه.
-
فیلتر یا دستهبندی محتوا بر اساس زبان.
-
-
نمونه استفاده (پایتون):
import fasttext # مدل از پیش آموزشدیده model = fasttext.load_model("lid.176.ftz") text = "سلام حال شما چطور است؟" prediction = model.predict(text) print(prediction)خروجی: برچسب زبان (مثل
__label__faبرای فارسی).
2. 🟢 langid.py
-
توسعهدهنده: محققان دانشگاه ملی استرالیا (2009–2012)
-
ویژگیها:
-
یک کتابخانهی پایتونی ساده و سبک.
-
بدون نیاز به اتصال اینترنت یا دانلود مدل جداگانه (مدل داخل خود کتابخانه قرار دارد).
-
قابلیت تشخیص حدود 90 زبان.
-
کاملاً مستقل است (بدون نیاز به کتابخانههای خارجی).
-
نسبت به fastText سرعت کمتری دارد اما برای پروژههای کوچک و آزمایشی مناسب است.
-
-
کاربردها:
-
تحلیل سریع متن در پروژههای پژوهشی.
-
استفاده در اسکریپتهای سبک پایتونی.
-
مناسب برای محیطهایی که نمیخواهید فایل مدل جداگانه نگه دارید.
-
-
نمونه استفاده (پایتون):
import langid text = "Bonjour tout le monde" lang, confidence = langid.classify(text) print(lang, confidence) -
خروجی:
fr 0.99(زبان فرانسوی با 99٪ اطمینان).
🔍 مقایسه fastText و langid.py
| ویژگی | fastText | langid.py |
|---|---|---|
| تعداد زبانها | ~176 زبان | ~90 زبان |
| دقت روی متن کوتاه | بالا | متوسط |
| سرعت | بسیار سریع | سریع اما کندتر از fastText |
| نیاز به مدل خارجی | بله (دانلود فایل مدل) | خیر (مدل درون پکیج است) |
| مناسب برای | سیستمهای بزرگ و عملیاتی | پروژههای سبک و پژوهشی |
به طور خلاصه:
-
اگر پروژهی بزرگ و عملیاتی داری → بهتر است از fastText استفاده کنی.
-
اگر پروژهی آزمایشی یا سبک داری → langid.py گزینهی سادهتر و سریعتری است.
پروژهی End-to-End تشخیص زبان متن با هوش مصنوعی
من کد را مرحله به مرحله مینویسم و در هر بخش توضیح میدهم چه انتخابهایی داریم. در هر مرحله از برنامه ما میتوانیم از چند روش استفاده کنیم بهمین خاطر کدهای این پروژه بصورت مرحله ای بیان میشوند و در هر مرحله نشان میدهیم از چه روشهایی میتوان استفاده کرد و مزایا و معایت هر روش را بیان میکنیم.
پیدا کردن و آمادهسازی دادهها
برای این پروژه نیاز به دیتاست چندزبانه داریم. دیتاستهای مناسب:
-
Tatoeba Sentences (جملات چندزبانه با برچسب زبان)
-
Europarl Corpus (متون چندزبانه پارلمان اروپا)
-
Wikipedia Dumps (بسیار بزرگ ولی نیازمند پردازش زیاد)
-
DLI – Dataset from Kaggle (Multi-Language Dataset with Labels)
برای سادگی از Kaggle – Language Identification Dataset استفاده میکنیم (شامل متنهایی از زبانهای مختلف با برچسب).
که میتوانید این فایل های را از اینجا دانلود کنید:
import pandas as pd
from sklearn.model_selection import train_test_split
# دیتاست نمونه از Kaggle (شامل ستونهای: "Text" و "Language")
data = pd.read_csv("language_dataset.csv")
print(data.head())
# تقسیم به دادههای آموزش و تست
train_texts, test_texts, train_labels, test_labels = train_test_split(
data["Text"], data["Language"], test_size=0.2, random_state=42
)
print("تعداد نمونههای آموزش:", len(train_texts))
print("تعداد نمونههای تست:", len(test_texts))
مرحله 2: استخراج ویژگیها
گزینههای موجود:
-
n-gramهای کاراکتری یا کلمهای (روش کلاسیک، سریع و سبک)
-
TF-IDF (وزندهی به کلمات بر اساس اهمیتشان)
-
Embeddings مثل Word2Vec، GloVe یا FastText
-
مدلهای ترنسفورمر مثل mBERT (برای ویژگیهای پیشرفتهتر)
📌 کد با استفاده از TF-IDF (روش مرسوم و ساده):
from sklearn.feature_extraction.text import TfidfVectorizer
# استفاده از n-gram کاراکتری
vectorizer = TfidfVectorizer(analyzer='char', ngram_range=(1,3), max_features=5000)
X_train = vectorizer.fit_transform(train_texts)
X_test = vectorizer.transform(test_texts)
print("شکل دادههای آموزشی:", X_train.shape)
مرحله 3: انتخاب و آموزش مدل
گزینهها:
-
مدلهای سنتی (ML):
-
Naive Bayes → سریع و ساده
-
SVM → دقت بالا ولی سنگینتر
-
Logistic Regression → تعادل سرعت و دقت
-
-
مدلهای یادگیری عمیق (DL):
-
CNN → استخراج الگوهای محلی در متن
-
RNN/LSTM → یادگیری توالی
-
Transformer (mBERT, XLM-R) → دقت بالا، مناسب پروژههای بزرگ
-
📌مدل کلاسیک – Naive Bayes
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
nb_model = MultinomialNB()
nb_model.fit(X_train, train_labels)
y_pred_nb = nb_model.predict(X_test)
print("نتایج Naive Bayes:")
print(classification_report(test_labels, y_pred_nb))
📌 مدل کلاسیک – SVM
from sklearn.svm import LinearSVC
svm_model = LinearSVC()
svm_model.fit(X_train, train_labels)
y_pred_svm = svm_model.predict(X_test)
print("نتایج SVM:")
print(classification_report(test_labels, y_pred_svm))
📌 مدل عمیق – LSTM با Keras
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense
# پارامترها
vocab_size = 5000
embedding_dim = 64
max_length = 100
# آمادهسازی داده برای شبکه عصبی
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
tokenizer = Tokenizer(num_words=vocab_size, char_level=True)
tokenizer.fit_on_texts(train_texts)
X_train_dl = tokenizer.texts_to_sequences(train_texts)
X_test_dl = tokenizer.texts_to_sequences(test_texts)
X_train_dl = pad_sequences(X_train_dl, maxlen=max_length)
X_test_dl = pad_sequences(X_test_dl, maxlen=max_length)
# مدل LSTM
model = Sequential([
Embedding(vocab_size, embedding_dim, input_length=max_length),
LSTM(128),
Dense(64, activation="relu"),
Dense(len(set(train_labels)), activation="softmax")
])
model.compile(loss="sparse_categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
# تبدیل برچسبها به اعداد
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y_train_enc = le.fit_transform(train_labels)
y_test_enc = le.transform(test_labels)
# آموزش مدل
model.fit(X_train_dl, y_train_enc, validation_data=(X_test_dl, y_test_enc), epochs=5, batch_size=64)
📌 مدل ترنسفورمر (mBERT با HuggingFace) – حرفهایتر
from transformers import AutoTokenizer, TFAutoModelForSequenceClassification
from tensorflow.keras.optimizers import Adam
# مدل multilingual BERT
tokenizer = AutoTokenizer.from_pretrained("bert-base-multilingual-cased")
model = TFAutoModelForSequenceClassification.from_pretrained("bert-base-multilingual-cased", num_labels=len(set(train_labels)))
# توکنایز کردن
train_encodings = tokenizer(list(train_texts), truncation=True, padding=True, max_length=64)
test_encodings = tokenizer(list(test_texts), truncation=True, padding=True, max_length=64)
import tensorflow as tf
train_dataset = tf.data.Dataset.from_tensor_slices((dict(train_encodings), y_train_enc)).batch(16)
test_dataset = tf.data.Dataset.from_tensor_slices((dict(test_encodings), y_test_enc)).batch(16)
# آموزش
optimizer = Adam(learning_rate=5e-5)
model.compile(optimizer=optimizer, loss=model.compute_loss, metrics=["accuracy"])
model.fit(train_dataset, validation_data=test_dataset, epochs=2)
مرحله 4: ارزیابی و تست
📌 معیارها:
-
Accuracy → درصد پیشبینی درست
-
Precision, Recall, F1-score → متوازنتر برای دادههای نامتوازن
-
Confusion Matrix → نشان میدهد مدل کدام زبانها را بیشتر اشتباه گرفته است
📌 کد ارزیابی برای مدلهای کلاسیک:
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
import matplotlib.pyplot as plt
print("گزارش عملکرد SVM:")
print(classification_report(test_labels, y_pred_svm))
cm = confusion_matrix(test_labels, y_pred_svm, labels=svm_model.classes_)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=svm_model.classes_)
disp.plot(xticks_rotation=90)
plt.show()
در این پروژه:
-
برای دادهها از Kaggle Language Identification Dataset استفاده کردیم.
-
ویژگیها را با TF-IDF استخراج کردیم.
-
سه انتخاب برای مدل داشتیم: Naive Bayes، SVM (ML) و LSTM، BERT (DL).
-
در نهایت با classification report + confusion matrix عملکرد مدلها را ارزیابی کردیم.