قانون زیف و زندگی روزمره با محوریت کلمات وبلاگ

آپدیت: کد R و فایل اطلاعاتی رو اضافه کردم به ته پست.


این پست حاوی
ریاضیات است

چه عنوانی (: اگر خواننده وبلاگ باشین می دونین که چند وقت پیش به درخواست مهدی ، تعداد استفاده از کلمه مهمل در وبلاگ رو شمردیم و بعد در یک پست مهمان بامزه، هادی بنایی که توی دانشگاه سوئد درس می خونه یکسری داده کاوی روی دیتاها کرد تا نشون بده که بدون نظریه می شه با اعداد هر چیز مهملی گفت و بعدش هم توی یک پست آخر، رفتیم سراغ شمردن کلمات و کاربردشون توی وبلاگ.

اما ماجرا ادامه داره (: اینبار امین صفاری پیشنهاد کرده که قانون زیف رو روی داده‌ها تست کنیم. برای من فرصت خوبی شد که هم قانون زیف رو یاد بگیرم و هم با کمک امین، قدم‌های اولم توی R رو بردارم. ما توی مطلب آخرمون رسیدیم به یک جدول از سیصد کلمه پر کاربرد وبلاگ و تعداد استفاده از اون‌ها. ظاهرا این ترکیب خوبیه برای قانون زیف.

قانون زیف می گه که

اگر تمام کلمات یک کتاب را بشماریم و از زیاد به کم مرتب کنبم به این نتیجه می‌رسیم که رتبهٔ هر کلمه با فراوانی(بسامد) همان کلمه نسبت عکس دارد، یعنی تعداد بارهایی که هر کلمه در متن ظاهر می‌شود با رتبهٔ همان کلمه در متن رابطه معکوس دارد. این نسبت در کلمات کل متن برقرار است. که به قانون زیف معروف شده‌است. بر طبق زیف کلمه‌ای که در رتبهٔ ۱ قرار دارد دوبرابر بیشتر از کلمه‌ای در متن ظاهر می‌شود که در رتبهٔ ۲ قرار دارد و ۳ برابر بیشتر از کلمه‌ای ظاهر می‌شود که در رتبهٔ ۳ قرار دارد و همینطور تا آخر.

و مدعی می شه این مربوطه به جریان کمترین کوشش. یعنی ما سعی می کنیم کارها رو به سادگی انجام بدیم و در یک کتاب این یعنی استفاده از کلمات تکراری. رابطه پیشرفته‌تر توی تئوری به این شکل بیان می شه:

f(k;s,N)=(1/(k^s))/(H(n,1))

که k میشه Rank و N میشه تعداد کلمات و تابع H هم میشه تابع اعداد هارمونیک.

این تابع رو روی یک نمودار با دو محور لگاریتیمی می کشیم تا نشون بده که هر کاربرد پر کاربردترین کلمه در یک متن تقریبا دو برابر کاربرد دومین کلمه پر کاربرد است و سه برابر کاربرد سومین کلمه و …

حالا اگر جدولی بسازیم که توش هر کلمه و تعداد ظاهر شدن اون در متن باشه و این رو به ترتیب نزولی سورت کنیم و بهشون از یک تا مثلا سیصد شماره ردیف بدیم، جدولی خواهیم داشت از هر کلمه، رتبه و تعداد استفاده اون در متن. اگر این اطلاعات رو با استفاده از برنامه R (یا هر چیز دیگه!) روی نمودار لگاریتمی – لگاریتمی ببریم به این می‌رسیم:

بررسی قانون زیف برای وبلاگ جادی

و بعدش توضیحات امین رو می خونیم:

توی ساده ترین حالت s برابر ۱ هست.
برای داده های تو هم اگر از مجموعه ۳۰۰ تایی استفاده کنی نتیجه بهتری میگیری (البته تا اونجایی که میدونم این نسبت رو بعضی از قسمتهای مجموعه داده کار نمیکنه)
عدد S هرچی به ۱ نزدیک تر باشه مدل بهتری بر اساس توزیع زیپف هست چون تکرار کلمات در زبانهای طبیعی خیلی heavy-tailed هست. (زبان شناس ها اینو به صورت اینکه مغز انسان بیشتر دوست داره کلمات تکراری استفاده بکنه تا جدید توجیح میکنن)
به نظر من ۰.۷۹ برای مجموعه داده های تو خیلی خوبه چون اینو باید در نظر بگیری که این مجموعه کلمات از یک متن یک پارچه (مثل کتاب) نیامدن و مربوط به پست های متفاوت هستن.

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

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

پ.ن.۲. کد R برای خوندن فایل و کشیدن نمودار چنین چیزی است (کد رو امین نوشته)

Jadi<-read.csv("/home/khikho/Downloads/300.first.words.csv",sep="\t")
plot(sort(Jadi$count/sum(Jadi$count), decreasing=TRUE), xlab="rank", ylab="density",log="xy")
x<-(1:300)
xp<-(1/(x^0.79))/(sum(1/(x^0.79)))
xp1<-(1/(x))/(sum(1/(x)))
lines(xp,co=2)
lines(xp1,co=4)
legend("topright", c("s=1","s=0.79"), cex=0.8,col=c("blue","red"),lty=1);

و فایل سیصد کلمه پر کاربرد با تعداد استفاده شون هم اینجاست

پ.ن.۳. لعنت به سانسورچی (:

  • واقعا لذت بردم از خواندن این پست، پست خوب مثل فیلم خوب چیزیه که وقتی خوندن یا دیدنش رو تموم کردی، حیاتش در ذهن تو شروع بشه. بخش جالب امکان بسط دادن این قوانین ریاضی به سایر پدیده هایی زندگی است که اونها رو تصادفی و بدون نظم میدونیم. قبلا مطالبی خونده بودم که فرم های بسیار پیچیده و درهم برهم کوه ها، فراکتال های بسیار ساده ریاضی هستند و حتی زمانی که بعضی از فراکتال ها را برای تولید تصاویر گرافیکی و تجربه بسط می دادند ، مدلهایی دقیق همانند کوه ها یا مجمع الجزایری در اقیانوس، گیاهان و … پدیدار میشد.
    جادی جان ، ادامه بده این پست های حاوی ریاضیات رو … :)

  • Abolfazl

    واقعا عالی بود. ممنون.

  • خیلی خوب بود
    باید R رو یاد بگیرم :)

  • این که “آدم ها بنا به اصل کمترین کوشش سعی می کنن جهان اطرافشون رو شکل بدن ” خیلی جالبه.:))

  • Navid Ht

    چه قانون جالبی!
    اسم R هم خیلی میشنوم این اواخر چیز جالب و مفیدی‌ه.
    پست خوبی بود ممنون.

  • امید

    هیچ وقت از ریاضی خوشم نیومد چون کاربرد چیزایی رو که خوندم نفهمیدم.
    دوست داشتم به جای پی نوشت آخر مینوشتی لعنت به این نظام آموزشی

  • یه کار دیگه هم میشه کرد ، بیا کلمات و تعداد تکرارهاشون رو در بیار ، بعد بر اساس ستون دوم به صورت سعودی مرتبشون کن ، ببینیم از powerlow هم پیروی میکنه یا نه ، بر اساس این قانون کلمه هایی که کمتر تکرار شدن ، نقش مهم تری رو تو متن بازی می کنن ، چک کردن این که نقششون تو متن چقد مهمه هم سادست ، میشه دید که کلمه چقدر با موضوع تاپیک ربط داره …

  • *powerlaw

  • کامیار

    خوب بود جادی مثل همیشه ممنون در ضمن برای تو دوستانی که می خوان برای کشیدن نمودار زبون آر رو یاد بگیرن یه پیشنهاد بهتر دارم این رو به حساب تعصب من روی پایتون نگذارید ولی خدایی این پروژه خیلی خوبیه که در کلی از پروژه های بزرگ علمی داره ازش استفاده میشه مثلا موسسه تحقیقاتی سرن رو که همه می شناسید.
    matplotlib.org

  • ناشناس

    این همه مطلب نوشتی و توضیح ندادی که رتبه یعنی چی؟ رتبه از چه لحاظ؟ اعصابم خورد شد! :/

    • جادی

      ناشناس : رتبه یعنی مثلا اول ،‌دوم،‌… و در جمله «اگر تمام کلمات یک کتاب را بشماریم و از زیاد به کم مرتب کنبم به این نتیجه می‌رسیم که رتبهٔ هر کلمه» یعنی اگر بشمری که هر کلمه در متن چند بار استفاده شده و بعد از زیاد به کم مرتب کنی و کنارش بنویسی ۱، ۲، ۳، ۴، … اون یک و دو و سه و چهار می شن «رتبه» اون (:

      اینکه «از چه لحاظ» رو در جمله بالایی توضیح دادیم : شمردن تمام کلمات و مرتب کردنشون از استفاده از استفاده زیاد به کم (:

      • جادی

        ناشناس: توی متن بازم توضیح در مورد رتبه اضافه کردم (: امیدوارم واضح تر شده باشه

        • ناشناس

          ممنون جادی عزیز که این همه لطف داری و معذرت از بابت لحن طلب کارانه ام
          ولی خوب وقتی کلمات رو بر اساس فرکانس مرتب کنیم و به این صورت رتبه بدیم، با این تعریف که رتبه ی هر کلمه با فرکانس رابطه ی مستقیم داره نه عکس!!! چون هر چی فرکانس اش بالاتر باشه، رتبه اش بالاتر میاد!!! چند بار متن رو از بالا تا پایین خوندم، نمی دونم… :/
          یه چیزی هم هست که اگر قرار بوده چیز بامعنایی گفته بشه (که قطعاً همینطور بوده)، بدیهی که تعریف رتبه از فرکانس مستقل بوده باشه که تعریف تو اینطور نیست!… :/

          • جادی

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

  • nimar

    خیلی چالب بود
    تشکر

  • ناشناس

    جادی! بابا! این باگ کامنت گذاری رو یه نگاهی بهش بکن، غیر از من هم کسای دیگه گفتن، من باز نمی تونم کامنت بزار، حالا خود این کامنت رو چطوری پست کنم؟!

    • جادی

      خب مشکل اینه که من نمی تونم بازتولیدش کنم. اگر نتونم برای خودم تکرارش کنم نمی تونم هم حلش کنم ):

  • ناشناس

    “تعداد استفاده از کلمات مهمل” تصحیح شود به ” تعداد استفاده از کلمه ی مهمل”

    • جادی

      انجام شد (:

  • ناشناس

    url پست هم ghanoone صحیح است!

  • محمد

    سلام
    خوبین؟
    من یه سوالی داشتم برای فیلتر کردن داده ها به کمک پایتون..
    یعنی یسری داده تجربی دارم که توش نویز هستو باید این نویزهارو حذف کنم..
    نمیدونم شما تجربه ای در این زمینه داشتین یا میتونین منو راهنمایی کنین؟
    ممنون میشم اگه کمک کنید.. من تازه برنامه نویسی با استفاده از پایتون رو شروع کردم.
    خیلی ممنون

  • محمد

    راستی اینو میخواستم خصوصی از خودتون بپرسم اما ایمیل شمارو نداشتم.. اگر ممکنه به ایمیلم پاسخ بدین.. بینهایت ممنونم

  • MJafar Mash

    این ویدیوی خیلی جالب از مایکل استیونز رو فک کنم بد نباشه به پست اضافه کنی :)

  • Naeim Rezaeian

    سلام ، ممنون از مطلب خوبتون – یک س.ال داشتم میشه بگید چرا مقدار s را یک بار 1 و یک بار 0.79 گرفته اید ؟
    سول دیگه ای هم داشتم ، با توجه به قانون زیف چطور میشه حساب کرد که در یک متن بهتره یک هر کلمه چند بار تکرار بشه ؟