جستجو در متون غیرانگلیسی (فارسی) به کمک regex

این پست در واقع پاسخی به کامنت دوست خوبم آقا حسین هستش؛

جستجوی متون غیرانگلیسی به کمک regluar expression یا عبارات با قاعده امکانپذیر هست. فقط به کمی دقت نیاز دارد. در یک کلام با کمک داشتن کد کاراکتری حروف می‌توانیم هر متنی را در هر زبانی با کمک عبارات باقاعده بررسی کرده و در صورت نیاز تغییر بدهیم.

پیش از هر چیز، باید فرمت متنی نوشته تعیین شود. نوشته‌های فارسی موجود در دنیای دیجیتال عموما به یکی از سه دسته‌ی زیر تعلق دارند:

  • نوشته‌هایی با انکدینگ WINDOWS-ARABIC-1256 (یا به روایتی ISO-8859-6)، وب‌ سایت‌های فارسی اواخر دهه نود و اوایل قرن بیست و یکم از چنین فرمتی برای نمایش متون فارسی استفاده می‌کردند.
  • نوشته‌هایی با فرمت UTF-8 یا (unicode) که بعد از مطرح شدن استاندارد یونیکد بوجود آمدند و در حال حاضر اکثر وب سایت‌های فارسی نوشته‌های خود را در این فرمت ارائه می‌کنند..
  • نوشته‌هایی با فرمت UTF-16 یا (unicode 16) که نسل بعدی استاندارد فوق هستن و زبان‌های بیشتری پشتیبانی می‌کند. من در گوشی موبایلم (p990i) در قسمت مربوط به پیامک (اس.ام.اس سابق)، به این نوع متن برخوردم.

چطور بفهمیم متنی که در اختیار داریم، جزو کدوم دسته است؟

راه ساده‌ای برای این کار وجود دارد؛ کافی است فایل متنی خود را با مرورگر فایرفاکس باز کنید و از منوی View زیر منوی Character encoding و زیر منوی More Encodings انکدینگ‌ها را تست کنید. هر زمان که متن به درستی نمایش داده شد، انکدینگ مناسب را یافته‌اید.

firefox encoding screenshot
firefox encoding

پس از شناسایی انکدینگ مناسب، می‌بایست جدول کاراکتری مربوط به آن انکدینگ را پیدا کنید. برای اینکار می‌توانید از گوگل کمک بگیرید (جدول نمونه انکدینگ‌های فوق در پانویس۲ آمده است)

حالا بعنوان مثال فرض کنید متنی با انکدینگ UTF-8 داریم که حاوی کلماتی مثل انشاء، املاء و اشیاء و مانند اینهاست و می‌خواهیم همه‌ی این همزه‌های عربی را از انتهای این کلمات (یا هر جای دیگری که باشند) پاک کنیم تا موجبات خشنودی فرهنگستان زبان فارسی فراهم شود.

برای UTF-8، این لینک همه کاراکترها را به همراه کد هگزادسیمال نمایش می‌دهد.با مراجعه به جدول کاراکتر‌ی در این لینک و انتخاب گزینه‌ی Arabic از کادر وسط صفحه، متوجه می‌شویم در ردیف کاراکتر همزه چنین آمده:

ARABIC LETTER HAMZA d8 a1 ء U+0621

قسمت‌هایی که برای کار ما اهمیت دارد دو ستون وسط است و به خصوص ستونی که در آن نوشته شده d8 a1 این کد هگزادسیمال کاراکتر همزه است. حالا کافی است به کمک regex و یک ابزار مناسب، این کاراکتر را در متن یافته و آن را حذف نماییم. برای اجرای این عملیات من از ابزار sed کمک می‌گیرم:

sed -e "s/\xd8\xa1//g" old-text.txt > updated-text.txt

ذکر این نکته ضروری است که استاندارد UTF-8 از دو بایت فضا برای نمایش کاراکتر‌ها استفاده می‌کند در حالیکه استاندارد اسکی (بخوانید: ASCII) از یک بایت فضا برای ذخیره کاراکترها کمک می‌گیرد. درست به همین دلیل است که در اینجا از دو نشان x\ کمک گرفتیم که هر یک بخشی از کد هگزادسیمال کاراکتر همزه را اعلان می‌کنند.

نکته‌ای که در اینجا لازم می‌دانم مطرح کنم این موضوع است که در مثال‌های جایگزینی می‌توانید با خیال راحت کاراکتر‌ها را بنویسید چرا که در خروجی به همان ترتیبی که شما ذکر کردید نمایش داده خواهند شد.

اجازه بدهید با یک مثال این موضوع را بررسی کنیم، فرض کنید در متنی می‌خواهم کلمه‌ی «رضا» را با «رضا جان»جایگزین کنم. با دستور sed چنین خواهم نوشت:

sed -e "s/\xd8\xb1\xd8\xb6\xd8\xa7/\xd8\xb1\xd8\xb6\xd8\xa7 \xd8\xac\xd8\xa7\xd7\x86/g" reza.txt > reza-jan.txt

با دیدن این مثال‌ها، بیش از پیش از وجود ادیتور‌های امروزی سپاسگزار می‌شویم! ولی این فقط یک مثال ساده بود، سناریو‌های پیچیده‌تری می‌توانند وجود داشته باشند که ما را دست به دامان همین ابزارهای قدیمی و پرقدرت می‌کند.

این مثال‌ها همگی در انکدینگ UTF-8 بوده است ولی در استفاده از این الگو محدودیتی وجود ندارد. می‌توانید این کارکرد با اندکینگ‌های دیگر نیز تست کنید. (البته من تست نکردم ولی منطق امر می‌گوید می‌بایست به همین خوبی جواب بدهد)

پانویس ۱-  خواندن کد‌هایی که باید در ترمینال اجرا شوند، آسان نیست. من به یک syntax highlighter مناسب برای وردپرس احتیاج دارم ولی متاسفانه هنوز موفق نشدم گزینه‌ی مناسبی برای این کار پیدا کنم. 🙁

پانویس۲ – بعضی از این لینک‌ها مرجع این مقاله بوده‌اند و بعضی دیگر در رابطه با این مقاله هستند که دیدنشان خالی از لطف نیست.

http://www.regular-expressions.info/unicode8bit.html

http://www.utf8-chartable.de/unicode-utf8-table.pl?start=1536, UTF-8 character tables

http://en.wikipedia.org/wiki/ISO/IEC_8859-6, WINDOWS-ARABIC-1265 character table

http://www.unicode.org/charts/, UTF-16 character tables

Thanks for passing by: ↓



5 دیدگاه برای “جستجو در متون غیرانگلیسی (فارسی) به کمک regex”

  1. سلام قربان
    من یه سئوال دارم
    اگه ممکنه جوابشو برام ایمیل بزنید
    قربان من خیلی گشتم تو اینترنت برای گرفتن UTF-16
    چون ویندوزهام UTF-8 دارن
    من رشتم تاریخ ایران باستانه و نیاز به یونیکد اوستایی و میخی دارم
    UTF-16 این پشتیبانیرو میکنه ولی من هر کاری کردم نتونستم بدست بیارمش
    خواستم بدونم چطور میتونم داشته باشمش
    سپاسگزارو پدرود ٬ پاینده ایران

    [پاسخ]

  2. پوریا جان، ای کاش بیشتر توضیح می‌دادی که چرا به این استاندارد نیاز داری و سناریو چیه؟
    به هر شکل به طور مختصر می‌تونم اینجوری بگم که UTF-16 استانداردی برای نوشتن و نمایش متون هستش و توی این استاندارد زبان فارسی باستان هم لحاظ شده. در مورد اینکه «ویندوزها UTF-8 دارن»، باید بگم این بیشتر به نرم افزار برمی‌گرده (تا سیستم عامل)، استاندارد UTF-16 توی ویندوز ۷ هم وجود داره (البته احتمال می‌دم توی ویندوز xp سرویس پک۲ هم باشه) این انکدینگ توی notepad هم پشتیبانی شده، منتها نکته‌ای که هست اینه که این استاندارد با اسم unicode معرفی شده. البته notepad در حالت پیش فرض از استاندارد ascii برای ذخیره کردن فایل‌های متنی استفاده می‌کنه که موقع ذخیره کردن فایل این انکدینگ قابل تغییر هستش.
    در مورد جدول مربوط به کد کاراکترهای مربوط به زبان فارسی باستان انتهای همین مقاله، آخرین لینک در واقع کد کاراکتر‌های مربوط به انکدینگ utf-16 رو معرفی کردم. از این لینک pdf مربوط به هر دسته کاراکتری که توی انکدینگ utf-16 باشه قابل دانلوده.
    برای زبان فارسی باستان (old persian) توی همون صفحه این لینک ارائه شده:
    http://www.unicode.org/charts/PDF/U103A0.pdf
    اگه هم با نمایش متنی که با انکدینگ utf-16 نوشته شده مشکل وجود داره، توی مقاله توضیح دادم که چطور می‌شه انکدینگ فایرفاکس رو تغییر داد. دو تا انکدینگ مربوط به utf-16 اونجا هست، با کمی سعی و خطا می‌شه نمایش صحیح رو بدست آورد.
    این چیزی بود که به نظرم رسید، پوریا اگه بیشتر در مورد سناریو توضیح داده بودی، شاید بهتر می‌شد کمک کرد.
    موفق باشی

    [پاسخ]

  3. سلام علی جون
    آقا ۸ ماه گذشت ما هنوز نتونستیم با یونیکد یه متن اوستایی یا میخی بنویسیم
    آخرین آپدیت ویندوز ۷ هم گرفتیم ولی utf-16 نداره
    سری پیش که بت ایمیل دادم گفتم میخوام اسم (فایل) هامو اوستایی بنویسم که اشتباه نوشته بودم
    منظورم فولدر هام بود
    آقا اگه زحمتی نیست یه راهی به ما بگو ما utf-16 رو داشته باشیمو ویندوزمون ساپورتش کنه.
    فدات علی جون
    خیلی آقایی

    [پاسخ]

    ali پاسخ در تاريخ بهمن ۱۳ام, ۱۳۹۰ ۱۲:۰۳ ق.ظ:

    به به آقا پوریای خودمون؛
    پشتکار شما ستودنیه، دستی هم به سر من بکشین 😉
    خیلی دوست دارم در این مورد یه پست بنویسم. ولی تا اون موقع شما منبع پست رو داشته باشین. این لینک به شما کمک می‌کنه که بتونین صفحه‌ کلید سفارشی خودتون رو برای لینوکس بنویسین. متنش زیاد هم مشکل نیست. من هم سعی می‌کنم چنین چیزی بسازم (شاید تونستم شما رو به دام لینوکس باندازم 🙂 ) ولی اگه زودتر از من موفق شدین لایوت صفحه کلید فارسی میخی رو بسازید، اگه دوست داشتین به منم بدین تا همینجا بگذاریمش که هر کسی خواست بتونه دانلودش کنه و توی لینوکس صفحه کلید میخی رو داشته باشه 🙂

    http://hektor.umcs.lublin.pl/~mikosmul/computing/articles/custom-keyboard-layouts-xkb.html

    [پاسخ]

  4. سلام علیکم
    تا جایی که خاطراتم یاری می‌کنه من تونسته بودم با نوشتن کارکتر‌های معمول فارسی با دستور sed کار بکنم. فکر نکنم نیاز به این همه کار سخت داشته باشه.

    [پاسخ]

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *