یه سری متن دارم میخوام طبقه بندی کنم. داده آموزشی ندارم. میشه این کار را کرد؟
1 پاسخ
بله، اگر دادهای برای یادگیری (training) ندارید، چند روش برای **دستهبندی (classification) بدون یادگیری** وجود دارد:
### 1. **استفاده از مدلهای از پیش آموزشدیدهشده (Pre-trained Models)**
میتوانید از مدلهای زبان بزرگ (LLM) مثل **GPT** یا **BERT** که از قبل روی مقادیر زیادی داده آموزش دیدهاند، استفاده کنید. این مدلها بدون نیاز به یادگیری جدید، میتوانند متن را دستهبندی کنند.
📌 **مثال:** استفاده از OpenAI GPT برای تشخیص نوع متن:
```python
import openai
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are a text classifier."},
{"role": "user", "content": "این یک متن سیاسی است یا ورزشی؟ 'تیم ملی ایران در جام جهانی بازی میکند'"}
]
)
print(response["choices"][0]["message"]["content"])
```
---
### 2. **دستهبندی مبتنی بر کلمات کلیدی (Rule-Based Classification)**
اگر دستههای مشخصی دارید، میتوانید از **کلمات کلیدی** برای دستهبندی استفاده کنید.
📌 **مثال:** دستهبندی یک متن به دو گروه "ورزشی" و "سیاسی"
```python
def classify_text(text):
sports_keywords = ["فوتبال", "ورزش", "تیم", "مسابقه", "لیگ"]
politics_keywords = ["دولت", "انتخابات", "مجلس", "سیاست", "رییسجمهور"]
if any(word in text for word in sports_keywords):
return "ورزشی"
elif any(word in text for word in politics_keywords):
return "سیاسی"
else:
return "نامشخص"
text = "تیم ملی ایران در جام جهانی بازی میکند"
print(classify_text(text)) # خروجی: ورزشی
```
---
### 3. **استفاده از الگوریتمهای بدون نیاز به یادگیری (Unsupervised Learning)**
اگر چندین متن دارید اما **برچسب ندارید**، میتوانید از **روشهای خوشهبندی (Clustering)** مانند **K-Means یا DBSCAN** استفاده کنید.
📌 **مثال:** خوشهبندی متون با TF-IDF و K-Means
```python
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
texts = [
"تیم پرسپولیس قهرمان لیگ شد",
"انتخابات ریاستجمهوری برگزار شد",
"بازیکنان تیم ملی به اردو رفتند",
"سیاستهای جدید اقتصادی اعلام شد"
]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(texts)
kmeans = KMeans(n_clusters=2, random_state=42)
clusters = kmeans.fit_predict(X)
for text, cluster in zip(texts, clusters):
print(f"{text} → دسته {cluster}")
```
💡 در اینجا مدل بهطور خودکار متون را به ۲ دسته گروهبندی میکند، بدون نیاز به دادهی یادگیری.
---
### **جمعبندی**
✔ **اگر مدل آماده مثل GPT در دسترس دارید:** از آن برای دستهبندی متن استفاده کنید.
✔ **اگر دستههای سادهای دارید:** روش کلمات کلیدی مناسب است.
✔ **اگر چندین متن دارید ولی برچسب ندارید:** خوشهبندی (Clustering) گزینهی خوبی است.
استفاده از word embedding
میتوان از **Word Embedding** برای دستهبندی متن بدون یادگیری (بدون داده برچسبدار) استفاده کرد. در این روش، ابتدا کلمات یا جملات را به **بردارهای عددی** تبدیل کرده و سپس از **تحلیل فاصلهی برداری (Vector Similarity)** یا **خوشهبندی (Clustering)** برای دستهبندی استفاده میکنیم.
---
## **روشهای دستهبندی با Word Embedding بدون یادگیری:**
### **1. استفاده از مدلهای آمادهی Word Embedding (مثل Word2Vec, FastText, GloVe)**
اگر دادهی یادگیری ندارید، میتوانید از مدلهای از پیش آموزشدیدهشده مانند **Word2Vec** یا **FastText** که روی دادههای بزرگ (مثل Wikipedia) آموزش دیدهاند، استفاده کنید.
📌 **مثال: استفاده از Word2Vec (مدل Google)**
```python
import gensim.downloader as api
model = api.load("word2vec-google-news-300") # دانلود مدل آماده
word = "football"
similar_words = model.most_similar(word, topn=5)
for word, similarity in similar_words:
print(word, similarity)
```
🔹 در اینجا، کلمات مشابه با "football" (مثل soccer, match, player) نمایش داده میشوند. این میتواند برای دستهبندی کلمات به کار رود.
---
### **2. تبدیل جملات به بردار و محاسبه شباهت (Cosine Similarity)**
برای دستهبندی، میتوان بردار یک متن را محاسبه کرده و با بردار دستههای مشخص مقایسه کرد.
📌 **مثال: دستهبندی یک متن بر اساس شباهت به بردارهای از پیش تعیینشده**
```python
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
import gensim.downloader as api
model = api.load("glove-wiki-gigaword-50") # مدل آماده GloVe
def get_sentence_vector(sentence):
words = sentence.split()
vectors = [model[word] for word in words if word in model]
return np.mean(vectors, axis=0) if vectors else np.zeros(50)
categories = {
"ورزشی": get_sentence_vector("تیم فوتبال ورزش مسابقه"),
"سیاسی": get_sentence_vector("دولت انتخابات سیاست مجلس")
}
text = "تیم ملی ایران قهرمان شد"
text_vector = get_sentence_vector(text)
# محاسبه شباهت متنی
similarities = {category: cosine_similarity([text_vector], [vec])[0][0] for category, vec in categories.items()}
predicted_category = max(similarities, key=similarities.get)
print(f"دستهبندی متن: {predicted_category}")
```
✅ در اینجا، متن بر اساس **فاصلهی کسینوسی** با بردار دستههای مختلف مقایسه و دستهبندی میشود.
---
### **3. استفاده از Sentence Embedding برای متنهای طولانی (مثل SBERT)**
اگر متنها بلندتر هستند، **Word2Vec یا GloVe کافی نیستند**. در این صورت میتوان از **Sentence Transformers (SBERT)** استفاده کرد که جملهها را به بردار تبدیل میکند.
📌 **مثال: دستهبندی متن با SBERT**
```python
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
model = SentenceTransformer("all-MiniLM-L6-v2") # مدل آماده SBERT
categories = {
"ورزشی": model.encode("اخبار ورزشی، مسابقات، تیمها"),
"سیاسی": model.encode("سیاست، دولت، انتخابات، احزاب")
}
text = "جام جهانی فوتبال امسال برگزار میشود"
text_vector = model.encode(text)
# محاسبه شباهت
similarities = {category: cosine_similarity([text_vector], [vec])[0][0] for category, vec in categories.items()}
predicted_category = max(similarities, key=similarities.get)
print(f"دستهبندی متن: {predicted_category}")
```
💡 این روش برای متون طولانی دقت بالاتری دارد.
---
### **جمعبندی**
✔ **اگر دستهبندی کلمات ساده است:** از **Word2Vec یا FastText** استفاده کنید.
✔ **اگر جملات کوتاه دارید:** از **Cosine Similarity + Word2Vec/GloVe** استفاده کنید.
✔ **اگر متون طولانی هستند:** **SBERT** بهترین گزینه است.