چرا آزادی رو دوست دارم: فراوانی حروف فارسی در یک متن

سوال دوستانی که در مورد صفحه کلید استاندارد بحث می کنن اینه که هر حرف فارسی در متون فارسی چقدر تکرار شده؛ به عبارت دیگه هر کاراکتر چقدر به درد می خوره تو فارسی نوشتن. اینو قبلا هم یک دوست تایپیست حرفه ای ازم خواسته بود بررسی کنم. امروز حوصله کردم و جواب در مورد متنی مثل قانون اساسی اینه (پی نوشت دوم رو بخونین):

درصد استفاده از حروف فارسی در قانون اساسی

و اگر به طور دقیق تعداد کلمات و درصدهای دقیق تر رو می خواین می تونین با دانلود فایل صفحه گسترده فراوانی حروف فارسی در قانون اساسی ایران با ODF فرمت اوپن آفیس بهش برسین.

برنامه ای که اینکار رو می کنه اینه:


#!/usr/bin/perl

use utf8;
binmode STDOUT, ':utf8';
binmode STDIN, ':utf8';

@userinput = ;

$string = ''; #make a single $string from the standard input
foreach $line (@userinput) {
        $string .= $line;
}

# do some adjustments, say replacing arabic Ya with Persian Ya
$string =~ s/ي/ی/g;
$string =~ s/ك/ک/g;

#$allLetters = "آابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهیئ۱۲۳۴۵۶۷۸۹۰";
$allLetters = "آابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهیئ";

#explode and check the count of each letter
$total = 0;
for (my $key = 0; $key < length($allLetters); $key++) {
	$thisLetter = substr ($allLetters, $key, 1);
	$tedad{$thisLetter} = ()= $string =~ /$thisLetter/g; 
	$total += $tedad{$thisLetter};
}

foreach $key (sort (keys %tedad)) {
	print $key, "\t", $tedad{$key}, "\t", int($tedad{$key} / $total * 1000) / 10, "\n";
}

که همونطور که می بینین اطلاعات رو از ورودی استاندارد می گیره و تعداد هر کاراکتری که در رشته string اومده باشه رو توسط اپراتور مخفی =() می سنجه - برای همینه که می گن پرل زبون پردازش متنه و فوق العاده قشنگ و سخت برای خوندن. مثلا به این خط که قلب این برنامه است نگاه کنین:


	$tedad{$thisLetter} = ()= $string =~ /$thisLetter/g; 


میگه توی رشته فقط «همین حرف که الان داریم می شمریم» رو نگه دار و بعد با اون اپراتور جالب ببین چند تا کاراکتر توش مونده و بعد تعدادش رو بده به متغیر هشی که کلیدش همین کاراکتر است.

اینم بگم که این رو با هر چیز دیگه (مثلا برنامه های غیر آزاد) هم می شه نوشت یا روی ویندوز هم اجرا کرد ولی حالا که من کردم لوگوم رو می زنم پاش (:

نوشته های مشابه:
- بررسی سال های تولد در اطلاعات افشا شده ۳۰۰۰۰۰۰ کارت بانکی
- تعداد فراوانی حروف فارسی در نوشته‌های روزمره (ای بابا قبلا ظاهرا اینو نوشته بودم ولی یادم نبود!)

پی نوشت
۱- اگر واقعا نیاز دارین در مورد متنی این رو بدونین و امکان اجرای برنامه رو توسط خودتون ندارین، برام ایمیل کنین به jadijadi@gmail.com و براتون انجام می دم می فرستم. فقط متن بدون شک باید در فرمت متنی باشه. پی دی اف و اینها نیازمند تبدیل هستن.
۲- همونطور که شاهین هم در کامنت ها گفته، قانون اساسی اصلا متن خوبی برای سنجش «میزان استفاده حروف در زبان فارسی» نیست. اولا که کلمات غیرمرسومی داره و احتمالا سطح عربی اش زیاده و از اونطرف یک متن طبیعی نیست و مثلا کلمه «اصل» توش حداقل به تعداد اصول قانون اساسی استفاده شده و احتمالا هیچ رمانی اینقدر «ص» توش نداره (:

  • کار جالبی کردی جادی جان‌. فقط فکر نمی‌کنی که کتاب قانون نمی‌تونه مرجع خوبی برای فراوانی حروف فارسی و مقدار کاربردشون باشه؟ واژه‌های عربی زیادی توی این کتاب استفاده شدن. واژه‌های عربی‌ای که توی زبان عامیانهٔ ملت هم استفاده نمی‌شن. مثل همون قضیهٔ رجال سیاسی که بهتر می‌دونی ;-)

    • جادی

      کاملا درسته ولی متن طولانی ای بود که بهش دسترس داشتم. الان این توضیح رو به پایین جریان اضافه می کنم. منطقا این باید روی نوشته های روزمره تست بشه. مثلا یک حجم زیادی از اینترنت یا چند رمان عامه پسند.

  • سلام جادی!
    به این هم یه نگاهی بندازی بد نیست
    http://tinyurl.com/ccqukya

  • می تونی متنتو روی پیکره همشهری امتحان کنی. آدرسش اینجاست
    http://ece.ut.ac.ir/dbrg/hamshahri/fadownload-HAM2-IMG.html
    البته تا اونجا که یادمه واسه نسخه دومش باید پسورد بگیری اما نسخه اولش رایگانه.
    امتحان کردی نتایجشو اینجا هم بزار ما هم بدونیم.

    • * برنامه اتو روی پیکره همشهری امتحان کن نه متنتو:دی

    • جادی

      چیه اینا؟ دانلود کردم بعد یکسری رر فایل بود بعد پسورد خواست بعد فرم داشت که پر کنم پسورد بگیرم … حس کردم شبیه سایت های پورن ایرانی است (((: خب این روش اصلا امنش نمی کنه اگر دنبال امنیت هستن و فقط دردسر رو زیاد می کنه به نظرم. بیخیال شدم و شخصا شاید روی یک روزنامه ای چیزی تست کنم.

  • امین

    فکر کنم اگه این برنامه را برای نوشته های چندتا وبلاگ (که خودمونی مینویسن) و چندتا سایت خبری فارسی (که رسمی مینویسن) اجرا کنی، نتایج دقیقتر بشه.

  • سلام جادی!
    یه ایده جالب که به ذهن من رسید البته نه جدیده نه خفن و اونم اینه که
    یه کیبرد با استفاده از ایده ای که dvorak برای طراحی کیبردش استفاده کرده، طراحی کنیم.
    فکر میکنم با استفاده از پایگاه داده همشهری و این برنامه و اصول اولیه‌ای که dvorak گذاشته طراحی یک کیبرد جدید امکان پذیر باشه

  • alone wolf :D

    میتونی آپدیتای توییتر دوستاتو باهاش بسنجی. هم از روی فید میشه ازش استفاده کرد هم روزمره ترین و پرکاربرد ترین چیزه

  • ف

    یه پیشنهاد نسبتا بی ربط
    یه مطلب بنویس درباره غلط املایی ها در محیط مجازی.
    غلط های نادانسته و همین طور عمدی (مخصوصا عمدی، به طور خاص کسایی که توی هر خط 5 – 6 تا غلط املایی می نویسن)
    من واقعا دوست دارم بدونم دلیل و شروع این جریان کجا بوده؟ کسی می دونه؟

  • بنظرم روی یکی دو تا رمان مرجع فارسی امتحان بشه خوب جواب میده، کلیدر، سووشون، بوف کور… و البته شاعران هم بد نیست تو بررسی بیان… مثلاً فردوسی، حافظ و یا سعدی… راجع به شاعرا که مشکلی نیست ولی باید دید متن کتابا رو میشه گیر آورد یا نه…

  • رو بحث پردازش متنی تو فارسی نمیدونم چقدر کار شده، ولی بدلیل پیوستگی حروف و تفاوت استانداردهای کیبرد و همچنین عدم ثبات در قوانین املایی کار خیلی خیلی سخته، با اینحال من به نموره انگولکی همون قانون اساسی رو کردم و نتایج ذیل حاصل شد، طبیعی هست که حوصله نداشتم سراغ نیم فاصله و نمیدونم تفکیک و ترکیب کردن کلمات مشابه برم… توزیع کلمات (نه لزوماً معنی دار!!! + حرفهای اضافه) در متن قانون اساسی جمهوری اسلامی ایران:
    http://mzamani.persiangig.com/Law-Count.xlsx
    طبیعتاً من بدلیل عشق کورکورانه ام به آقامون اکسل، اینکارو با اون انجام دادم، دوستان اگر کسی خواست بگه استپهاش رو توضیح میدم…

    • مهدی

      سلام.
      میشه توضیح بدی برام با اکسل چجوری این کار انجام میشه.
      در ضمن جای ممنونم. به هر حال با این که متن های استاندارد تری وجود داشت خود این خیلی مفید بود و کلی کمک می کنه. باز هم ممنون

      • سلام، اول تکست متن رو تو اکسل کپی کردم (دقت کن بهتره تو یک ستون باشند همه خطها)، یکبار کل ستون رو Sort کن که بین خطها فاصله نمونه بعد سعی کردم تا جای ممکن تمام علائم (“:»«.,، و نظایر این) رو به اسپیس تبدیل کنم. از تب Data گزینه text to column رو انتخاب کن، بعد Delimited و بعد چک مارک اسپیس رو بزن. حالا یه ماتریس خیلی گنده داری احتمالاً، برای اینکه همشون بیان تو یه ستون باید یه ماکرو کوچولو بنویسی. Alt+F11 رو بزن، روی شیتی که روش دیتا هست در قسمت چپ کلیک کن و کد زیر رو توش پیست کن:
        Sub ToOneColumn()
        Dim m As Long, n As Long, a As Integer
        Application.ScreenUpdating = False
        Columns(1).Insert
        m = 0
        n = 1
        While Not IsEmpty(Cells(n, 2))
        a = 2
        While Not IsEmpty(Cells(n, a))
        m = m + 1
        Cells(m, 1) = Cells(n, a)
        Cells(n, a).Clear
        a = a + 1
        Wend
        n = n + 1
        Wend
        Application.ScreenUpdating = True
        End Sub
        بعد ببیندش، سپس وایسا روی اولین سلول و Alt+f8 رو بزن، و ماکرو را run کن (آخرش با خودم گفتم میشد از همون اول یه ماکرو نوشت که اینکارو بکنه ولی خب حالش نبود دیگه…) در نهایت روی ستون B یک Trim از داده های ستون A بگیر که خیالت جمع بشه، حالا هم از تو تب Insert گزینه Pivot data رو انتخاب کن و داده های ستون B رو هم تو بخش Row و هم تو بخش Values درگ کن و تاداااااااا :)
        شاد و سربلند باشی دوست من

  • افشین

    سلام.
    اپن‌آفیس، فرمت نیست! مجموعه نرم‌افزار اداری است. بهتر بود می‌نوشتید فرمت ODF

    • جادی

      بله درسته (: اصلاح کردم

  • پیمان

    سلام، یک سوال کاملا بی‌ربط به این مطلب:
    جادی عزیز بنده مدتی هست خواننده وبلاگت هستم. قصد دارم برای همیشه از ویندوز به لینوکس کوچ کنم. اطلاعات فنی‌ام در این حده که برنامه‌نویس هستم (++C ، جاوا ، PHP و … )، با کدنویسی و خط فرمان هم مشکلی ندارم. در ضمن دوست دارم با لینوکسی شروع کنم که حرفه‌ای باشه و چندان برام مهم نیست محیط خیلی گرافیکی داشته باشه.
    شما که متخصص لینوکس هستی، چه توزیعی رو به من پیشنهاد میدی؟ البته بگم که خودم قبلا با اوبونتو و openSUSE (با دسکتاپ Gnome) کار کردم و اصلا خوشم نیومد.
    با توجه به جستجوهای خودم، بین دبیان، فدورا و مینت مردد هستم.

    • جادی

      توزیع ها فرق خیلی خاصی با هم ندارن. اگر از گنوم خوشت نیومده می تونی کی دی ای رو تست کنی یا محیط های سبکی مثل ال ایکس دی ای. بین این سه تا هم که پیشنهاد کردی نظر من به دبیان نزدیکتره (: البته کمی تنظیمات اولیه بیشتر می خواد – مثل نصب کدک ها و فلش و ..

      در زندگی با لینوکس هم هیچ وقت نیاز به کدنویسی نویست مگر اینکه خودت بخوای یک برنامه ای رو توسعه بدی. ولی کامند لاین به درد می خوره – هرچند که تا حدی بدون اون هم می شه زندگی کرد. امیدوارم تست بعدی برات جذاب تر باشه (: پیشنهادم میز کار KDE است اگر از گنوم خوشت نیومده.

      • پیمان

        مرسی از راهنمایی مختصر اما در عین حال کامل و خوبی که بهم دادی. و همینطور مرسی از این وبلاگ خوبت، که نقش خیلی مهمی داشت در تصمیم من برای کوچ همیشگی به دنیای نرم‌افزارهای آزاد و لینوکس. راستی اینطور که من بعد کلی تحقیق فهمیدم، تنها راه درست و حسابی برای عبور از فیلتر در لینوکس اینه که یه وی‌پی‌ان سرور شخصی با OpenVPN داشته باشم و تو لینوکس به اون کانکت شم، آره؟ اگه غیر از این و Tor راه سومی هم هست لطفا بگو بهم، ثواب داره :)

  • الکترون

    به نظرم یکی از بهترین متن‌هایی که میشه امتحان کرد متن‌های داخل ویکی‌پدیاست. چون به غیر از اینکه از کلمات نسبتاً رایج در اون استفاده می‌شه، دستور خط فارسی تا حد زیادی در ویکی‌پدیا (در بخش مقاله‌ها) رعایت میشه که این می‌تونه برای کسایی که می‌خوان یک چیدمان خوب برای صفحه‌کلید طراحی کنن خیلی مهم باشه. همچنین فایل‌های دامپ ویکی‌پدیا رو می‌شه به صورت رایگان دانلود کرد: http://dumps.wikimedia.org/fawiki/

  • محمد هادی

    جادی میتونی اینکار رو روی نوشته های وبلاگت انجام بدی؟

  • yasin

    سلام جادی جان.اول یه سوال داشتم از شما.شما همون جادی میرمیرانی از سایت نارنجی هستید؟بعد یه سوال دیگه هم داشتم.من تازگیا لینوکس رو شروع کردم و دارم مینت استفاده میکنم ولی چون واسه c# برنامه مینویسم نمیتونم یه دفه هر چی میدونمو ول کنم و ویندوزو ولی کنم برم لینوکس.میخواستم نظر شما رو بدونم که من چی کار کنم؟آیا سعی کنیم ویندوزو ول کنم بیام لینوکس و اگه بیام کدوم نسخه رو مناسب میدونید.
    خیلی ممنون

    • جادی

      ۱- بله همونم (:‌
      ۲- سیستم عامل ابزاره. باید بر اساس هدف استفاده بشه. اگر سی شارپ برنامه نویسی می کنی خب ویندوز بهتره. ولی اگر دنبال یک زبون برنامه نویسی هستی پیشنهادم اینه که بیای دنبال دنیای لینوکس و از جماعت بزرگی که کلی کلی ازشون داریم جدا بشی و تخصص خاص داشته باشی. معلومه که توی ویندوز هم می تونی همین کار رو بکنی ولی خب پیشنهاد شخص من است که لینوکس رو بیشتر دوست دارم (: