رتبه موضوع:
  • 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
جست و جوی متون غیر انگلیسی (فارسی) به کمک regex
#1
Wink 
جستجوی متون غیرانگلیسی به کمک regluar expression یا عبارات با قاعده امکانپذیر هست. فقط به کمی دقت نیاز دارد. در یک کلام با کمک داشتن کد کاراکتری حروف می‌توانیم هر متنی را در هر زبانی با کمک عبارات باقاعده بررسی کرده و در صورت نیاز تغییر بدهیم.
پیش از هر چیز، باید فرمت متنی نوشته تعیین شود. نوشته‌های فارسی موجود در دنیای دیجیتال عموما به یکی از سه دسته‌ی زیر تعلق دارند:
  • نوشته‌هایی با انکدینگ WINDOWS-ARABIC-1256 (یا به روایتی ISO-8859-6)، وب‌ سایت‌های فارسی اواخر دهه نود و اوایل قرن بیست و یکم از چنین فرمتی برای نمایش متون فارسی استفاده می‌کردند.
  • نوشته‌هایی با فرمت UTF-8 یا (unicode) که بعد از مطرح شدن استاندارد یونیکد بوجود آمدند و در حال حاضر اکثر وب سایت‌های فارسی نوشته‌های خود را در این فرمت ارائه می‌کنند..
  • نوشته‌هایی با فرمت UTF-16 یا (unicode 16) که نسل بعدی استاندارد فوق هستن و زبان‌های بیشتری پشتیبانی می‌کند. من در گوشی موبایلم (p990i) در قسمت مربوط به پیامک (اس.ام.اس سابق)، به این نوع متن برخوردم.
چطور بفهمیم متنی که در اختیار داریم، جزو کدوم دسته است؟
راه ساده‌ای برای این کار وجود دارد؛ کافی است فایل متنی خود را با مرورگر فایرفاکس باز کنید و از منوی View زیر منوی Character encoding و زیر منوی More Encodings انکدینگ‌ها را تست کنید. هر زمان که متن به درستی نمایش داده شد، انکدینگ مناسب را یافته‌اید.

[عکس: firefox-encoding-screenshot1.png]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 بوده است ولی در استفاده از این الگو محدودیتی وجود ندارد. می‌توانید این کارکرد با اندکینگ‌های دیگر نیز تست کنید. (البته من تست نکردم ولی منطق امر می‌گوید می‌بایست به همین خوبی جواب بدهد)
منبع
یک مثقال عمل بهتر است از یک خروار حرف.
پاسخ


موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  غلط یاب فارسی فایرفاکس ehsan.eba 0 2,920 04-09-2012, 12:19 AM
آخرین ارسال: ehsan.eba
  ساغر، نرم‌افزار شعر فارسی کلاه سفید 0 2,672 05-25-2011, 03:16 PM
آخرین ارسال: کلاه سفید

پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان