Kahibaro
Discord Login Register

خودکارسازی پردازش متن

ایدهٔ کلی خودکارسازی پردازش متن

در فصل اصلی «خودکارسازی با پایتون» با مفهوم کلی خودکارسازی آشنا شده‌اید. در این بخش تمرکز ما فقط روی یک نوع خاص از خودکارسازی است: کارهای تکراری روی متن.

منظور از «متن» هر چیزی است که از کاراکترها ساخته شده باشد:
فایل‌های متنی (.txt)، لاگ‌ها، ایمیل‌های ذخیره‌شده، خروجی یک برنامه، یا حتی متن‌هایی که کاربر در برنامه وارد می‌کند.

برخی کارهای متنی که معمولاً خودکار می‌کنیم:

در این فصل با مثال‌های ساده نشان می‌دهیم چطور این کارها را به کمک پایتون انجام دهید.


آماده‌سازی متن: خواندن و نوشتن

جزئیات کامل کار با فایل‌ها در فصل «کار با فایل‌ها» آمده است، اما برای پردازش متن معمولاً این الگو را زیاد می‌بینید:

  1. باز کردن فایل
  2. خواندن محتوا در یک متغیر رشته‌ای
  3. پردازش رشته
  4. نوشتن نتیجه در یک فایل جدید (در صورت نیاز)

مثال: خواندن کل متن یک فایل و چاپ چند خط اول:

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])

ایدهٔ مهم:

یک‌دست کردن حروف

در بسیاری از جست‌وجوها و مقایسه‌ها، حروف بزرگ/کوچک مهم نیست. برای ساده شدن کار:

normalized = text.lower()    # همه حروف کوچک
# یا
normalized = text.upper()    # همه حروف بزرگ

بعد از نرمال‌سازی، جست‌وجوی کلمات راحت‌تر می‌شود.


جست‌وجو در متن

دو نوع جست‌وجو رایج است:

  1. جست‌وجوی ساده یک کلمه/عبارت
  2. جست‌وجوی الگو (کمی پیچیده‌تر، با استفاده از 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 در یک پوشه دارید و می‌خواهید در همهٔ آن‌ها یک عبارت را جایگزین کنید (مثلاً تغییر نام شرکت).

ایدهٔ کلی:

  1. پیدا کردن همهٔ فایل‌های متنی در یک پوشه (جزئیات بیشتر در فصل خودکارسازی با فایل‌ها و پوشه‌ها).
  2. خواندن هر فایل → 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")

این نمونه یک کاربرد خیلی رایج خودکارسازی متن در کار روزمره است.


نکته‌های عملی در خودکارسازی متن

با همین ابزارهای ساده می‌توانید ده‌ها کار تکراری متنی را خودکار کنید؛ هر جا دیدید جملهٔ «هر بار باید دستی این متن‌ها را درست کنم» را می‌گویید، احتمالاً می‌شود برای آن یک اسکریپت پایتون نوشت.

Views: 5

Comments

Please login to add a comment.

Don't have an account? Register now!