Table of Contents
ایدهٔ کلی خودکارسازی پردازش متن
در فصل اصلی «خودکارسازی با پایتون» با مفهوم کلی خودکارسازی آشنا شدهاید. در این بخش تمرکز ما فقط روی یک نوع خاص از خودکارسازی است: کارهای تکراری روی متن.
منظور از «متن» هر چیزی است که از کاراکترها ساخته شده باشد:
فایلهای متنی (.txt)، لاگها، ایمیلهای ذخیرهشده، خروجی یک برنامه، یا حتی متنهایی که کاربر در برنامه وارد میکند.
برخی کارهای متنی که معمولاً خودکار میکنیم:
- پیدا کردن کلمات یا الگوها در متنهای بزرگ
- تمیز کردن متن (حذف فاصلههای اضافی، کاراکترهای ناخواسته و …)
- جایگزینی خودکار کلمات یا عبارات
- استخراج اطلاعات (مثل شماره تلفن، ایمیل، تاریخ، کد ملی و …)
- تولید گزارش متنی بر اساس فایلهای ورودی
در این فصل با مثالهای ساده نشان میدهیم چطور این کارها را به کمک پایتون انجام دهید.
آمادهسازی متن: خواندن و نوشتن
جزئیات کامل کار با فایلها در فصل «کار با فایلها» آمده است، اما برای پردازش متن معمولاً این الگو را زیاد میبینید:
- باز کردن فایل
- خواندن محتوا در یک متغیر رشتهای
- پردازش رشته
- نوشتن نتیجه در یک فایل جدید (در صورت نیاز)
مثال: خواندن کل متن یک فایل و چاپ چند خط اول:
with open("input.txt", "r", encoding="utf-8") as f:
text = f.read()
print("طول متن:", len(text), "کاراکتر")
print("ابتدای متن:")
print(text[:200]) # چاپ ۲۰۰ کاراکتر اول
در تمام مثالهای این فصل فرض میکنیم متن را در متغیری مثل text در اختیار داریم، فرقی نمیکند از کجا آمده است.
تمیزکاری ساده روی متن (Cleaning)
بسیاری از اسکریپتهای پردازش متن با چند کار ساده شروع میشوند:
- حذف فاصلهها و خطهای خالی اضافی
- یکدست کردن حروف (مثلاً همه کوچک)
- حذف کاراکترهای خاص
حذف فاصلهها و خطهای خالی
مثال: حذف فاصلههای اضافی ابتدا و انتهای هر خط و حذف خطوط کاملاً خالی:
clean_lines = []
for line in text.splitlines():
stripped = line.strip() # حذف فاصلههای ابتدا و انتهای خط
if stripped: # اگر خط خالی نبود
clean_lines.append(stripped)
clean_text = "\n".join(clean_lines)
print(clean_text[:200])ایدهٔ مهم:
splitlines()→ تبدیل متن به لیستی از خطوطstrip()→ پاک کردن فاصلهها در ابتدا و انتهای خط- سپس متن جدید با
"\n".join(...)ساخته میشود.
یکدست کردن حروف
در بسیاری از جستوجوها و مقایسهها، حروف بزرگ/کوچک مهم نیست. برای ساده شدن کار:
normalized = text.lower() # همه حروف کوچک
# یا
normalized = text.upper() # همه حروف بزرگبعد از نرمالسازی، جستوجوی کلمات راحتتر میشود.
جستوجو در متن
دو نوع جستوجو رایج است:
- جستوجوی ساده یک کلمه/عبارت
- جستوجوی الگو (کمی پیچیدهتر، با استفاده از Regex در فصل کتابخانهها)
در اینجا فقط روشهای ساده و مبتدی را میبینیم.
شمردن تعداد وقوع یک کلمه
text = "سلام سلام دنیا، سلام پایتون!"
count = text.count("سلام")
print("تعداد 'سلام':", count)اگر متن طولانی است و میخواهید نسبت به حروف کوچک/بزرگ حساس نباشید:
text_lower = text.lower()
count = text_lower.count("سلام")پیدا کردن موقعیت اولین وقوع
pos = text.find("دنیا")
if pos != -1:
print("کلمه در موقعیت", pos, "پیدا شد.")
else:
print("پیدا نشد.")
find، اگر رشته را پیدا نکند -1 برمیگرداند.
جایگزینی خودکار متن
سادهترین روش خودکارسازی روی متن، جایگزینی است:
- اصلاح خودکار غلطهای تایپی
- جایگزینی نام قدیمی یک محصول با نام جدید در دهها فایل
- حذف کلمات یا عبارات ممنوع
جایگزینی یک واژه
text = "Python 2 دیگر پشتیبانی نمیشود. Python 2 قدیمی است."
new_text = text.replace("Python 2", "Python 3")
print(new_text)
همهٔ وقوعهای "Python 2" به "Python 3" تبدیل میشود.
چند جایگزینی پشتسرهم
replacements = {
"پایتون": "Python",
"سلام": "Hello",
}
new_text = text
for old, new in replacements.items():
new_text = new_text.replace(old, new)
print(new_text)
الگوی مهم اینجاست: روی متن حلقه میزنیم و هر بار یک replace انجام میدهیم.
شکستن متن به کلمات و جملات
برای بسیاری از پردازشها لازم است متن را به اجزای کوچکتر بشکنیم:
- کلمهها
- جملهها
- خطوط
شکستن به کلمهها (Tokenization ساده)
روش ابتدایی: استفاده از split بر اساس فاصله:
words = text.split() # بر اساس فضای خالی (space، newline و…)
print("تعداد کلمات:", len(words))
print("۵ کلمهٔ اول:", words[:5])با همین روش ساده میتوانید آمار بگیرید:
word_count = {}
for w in words:
w = w.strip(".,!?؛،") # حذف نشانهگذاری ساده
if not w:
continue
word_count[w] = word_count.get(w, 0) + 1
print("تعداد دفعات هر کلمه:")
for w, c in word_count.items():
print(w, ":", c)این نوع شمارشِ فرکانس کلمات، پایهٔ بسیاری از تحلیلهای متنی است.
شکستن به خطوط و جملات
شکستن به خطوط:
lines = text.splitlines()
print("تعداد خطوط:", len(lines))شکستن ساده به «جملات» بر اساس نقطه (روش بسیار خام):
sentences = text.split(".")
for s in sentences:
s = s.strip()
if s:
print("جمله:", s)برای شکستن حرفهایتر (مثلاً توجه به نقطه در اختصارات)، بعداً در فصل کتابخانهها با ابزارهای قویتر آشنا میشوید.
مثال: ساخت یک گزارش ساده از یک فایل متنی
در این مثال یک فایل متنی میخوانیم و چند آمار ساده تولید میکنیم:
- تعداد کاراکترها
- تعداد خطوط
- تعداد کلمات
- ۱۰ کلمهٔ پرتکرار
def analyze_text(path):
with open(path, "r", encoding="utf-8") as f:
text = f.read()
num_chars = len(text)
lines = text.splitlines()
num_lines = len(lines)
words = text.split()
num_words = len(words)
# شمارش فرکانس کلمات
word_count = {}
for w in words:
w = w.strip(".,!?؛،()[]{}:\"'") # ساده
w = w.lower()
if not w:
continue
word_count[w] = word_count.get(w, 0) + 1
# مرتبسازی بر اساس بیشترین تکرار
sorted_words = sorted(word_count.items(), key=lambda x: x[1], reverse=True)
print("تعداد کاراکترها:", num_chars)
print("تعداد خطوط:", num_lines)
print("تعداد کلمات:", num_words)
print("۱۰ کلمهٔ پرتکرار:")
for word, count in sorted_words[:10]:
print(word, ":", count)
analyze_text("input.txt")این اسکریپت یک نمونهٔ واقعی از «خودکارسازی پردازش متن» است:
- شما یک بار کد را مینویسید.
- بعد میتوانید روی هر فایل متنی اجرا کنید و سریعاً گزارش بگیرید.
مثال: پاکسازی لاگ و استخراج خطوط مهم
فرض کنید فایلی دارید که شامل لاگ یک برنامه است و خطوط خطا با کلمهٔ "ERROR" شروع میشوند. میخواهید فقط همان خطوط در یک فایل جدید ذخیره شوند.
def extract_errors(input_path, output_path):
with open(input_path, "r", encoding="utf-8") as f:
lines = f.readlines()
error_lines = []
for line in lines:
if line.startswith("ERROR"):
error_lines.append(line)
with open(output_path, "w", encoding="utf-8") as f:
f.writelines(error_lines)
print("تعداد خطاها:", len(error_lines))
extract_errors("app.log", "errors.log")این کار اگر دستی انجام شود بسیار خستهکننده است، ولی با یک اسکریپت کوچک قابل تکرار و سریع میشود.
مثال: ویرایش گروهی فایلهای متنی
فرض کنید دهها فایل .txt در یک پوشه دارید و میخواهید در همهٔ آنها یک عبارت را جایگزین کنید (مثلاً تغییر نام شرکت).
ایدهٔ کلی:
- پیدا کردن همهٔ فایلهای متنی در یک پوشه (جزئیات بیشتر در فصل خودکارسازی با فایلها و پوشهها).
- خواندن هر فایل →
replace→ نوشتن نتیجه.
یک نمونهٔ ساده:
import os
def batch_replace_text(folder, old, new):
for name in os.listdir(folder):
if not name.endswith(".txt"):
continue
path = os.path.join(folder, name)
with open(path, "r", encoding="utf-8") as f:
text = f.read()
new_text = text.replace(old, new)
with open(path, "w", encoding="utf-8") as f:
f.write(new_text)
print("بهروزرسانی شد:", name)
batch_replace_text("texts", "CompanyOld", "CompanyNew")این نمونه یک کاربرد خیلی رایج خودکارسازی متن در کار روزمره است.
نکتههای عملی در خودکارسازی متن
- همیشه قبل از اجرای اسکریپتهای ویرایشی روی تعداد زیاد فایل، نسخهٔ پشتیبان بگیرید.
- روی یک یا دو فایل نمونه اول تست کنید، بعد روی کل مجموعه اجرا کنید.
- اگر زبان فارسی پردازش میکنید:
- حواستان به فاصلههای نیمفاصله و کاراکترهای مشابه (مثل «ی» عربی و فارسی) باشد.
- برای یکدستسازی حرفهایتر بعداً میتوانید از کتابخانههای مخصوص متن فارسی استفاده کنید.
- نام متغیرها را طوری انتخاب کنید که از روی آنها بفهمید متن کدام مرحله است (
raw_text,clean_text,normalized_text, ...).
با همین ابزارهای ساده میتوانید دهها کار تکراری متنی را خودکار کنید؛ هر جا دیدید جملهٔ «هر بار باید دستی این متنها را درست کنم» را میگویید، احتمالاً میشود برای آن یک اسکریپت پایتون نوشت.