ترجمه متون در کامند لاین

میلاد زنگنه این پروژه بامزه رو برام فرستاده:

یک برنامه صد خطی AWK بازمتن و آزاد که می‌تونه سرویس ترجمه گوگل رو صدا بزنه و از همون خط فرمان، جمله‌های شما رو ترجمه کنه. کافیه
فایل فشرده رو دریافت کنین و بازش کنین و نصبش کنین و صداش بزنین:

jadi@funlife:/tmp$ axel -q https://github.com/soimort/google-translate-cli/archive/master.tar.gz
jadi@funlife:/tmp$ tar xf master.tar.gz 
jadi@funlife:/tmp$ ./google-translate-cli-master/translate "سلام گیک. حالت چطوره؟"
Hi geek. How are you?
jadi@funlife:/tmp$

البته قبلش باید بسته gawk رو نصب کرده باشین.

چرا گنو لینوکس رو دوست دارم: مارک‌آپی که سلکت کردم رو اچ تی ام ال کن

من اگر بخوام متنی طولانی بنویسم، اونو با مارک داون می نویسم. مارک داون یک شیوه صفحه بندی ساده است. مثلا اگر بخوام یک فهرست درست کنم کافیه اول هر خط یک – بذارم یا برای تیتر درست کردن کافیه زیرش خط بکشم یا اولش ### بذارم. چیزی مثل این:

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

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

Marddown.pl blogpost.markdown

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

این دستور می تونه محتویات حافظه فعلی رو به یک فایل منتقل کنه:

xclip -o > filename.txt

و اگر چیزی رو به کلیپورد بخوام اضافه کنم کافیه اونو به xclip پایپ کنم. پس این دستور می شه چیزی که من می خوام:

xclip -o > /tmp/clip.out.markdown ; Markdown.pl /tmp/clip.out.markdown | xclip

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

معلومه که این اجرای دستور رو هم می دم به یک شورتکات مثلا کنترل و شیفت و m و از این به بعد هر جا مارک‌داون نوشتم کافیه این ترکیب رو بزنم و جایی که لازمه پیست کنم. راحت و سریع و لینوکسی.

توصیه می شه:

نکات:

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

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

سعید پرسیده:

سلام جادی جان.
یه سوال داشتم ازت.
من چند مدته دارم آموزش سی شارپ رو یاد میگیرم از طریق سایت webtarget.ir
و اینجوریه که هر از چند مدت یه آموزش میزاره و من دنبال میکنم. میخ,استم بدونم راهی هست که من بدون اینکه مراجعه کنم به سایت و هر دفعه فایل های پی دی اف رو دانلود کنم بتونم با یه اسکریپت یا یه کد توی ترمینال تمام آموزهای سی شارپ رو توی یه فولدر دانلود کنم؟
ضمنا اینم آدرس یکی از فایل های پی دی اف آموزش سی شارپ هست و جاهایی که هر دفعه تغییر میکنه رو توی لینک دوم با ستاره برات مشخص میکنم.
http://dl.webtarget.ir/027-cSharpTime/session-33/cSharpTimeSession-33.pdf
http://dl.webtarget.ir/027-cSharpTime/session-**/cSharpTimeSession-**.pdf

خب.. سوال های اینجوری مثل یک پازل یا جدول بامزه هستن که جلوی تلویزیون لم می دیم و حلشون می کنیم. البته از نظر عقلی این سایت باید حتما RSS داشته باشه که بشه به سادگی دنبالش کرد ولی خب… ایده شما چیه؟ ایده من اینه که کافیه یکی از این فایل ها توی یک دایرکتوری باشه و ما روزی یکبار از اون دایرکتوری ls بگیریم و در آخرین فایل دانلود شده (بالاترین عدد در اسم ها) نگاه کنیم و عدد فایل رو جدا کنیم و بهش یکی اضافه کنیم و دانلودش کنیم. اگر فایل جدیدی بود دانلود می شه و اگر نبود چیزی دانلود نمی شه. فردا هم روز از نو روزی از نو.

برنامه ساده می شه این:

#!/usr/bin/python

import os, re

# یک ال.اس. می گیرم از فایل های مشابه اون کتاب و سورت و خط آخر رو جدا می کنم
f = os.popen('ls -1  cSharp*pdf | sort | tail -1')
lastdl = f.read()
# متغیر حاوی بخشی از اسم فایل است که عدد سریال توش قرار داره + ۱
lastNum = str(int(re.search ('cSharpTimeSession-(\d+).pdf', lastdl).group(1))+1)

# یک کامند می سازم که با دبلیوگِت شماره بعدی رو دانلود می کنه	
dlCommand = "wget http://dl.webtarget.ir/027-cSharpTime/session-" \
			+ lastNum + "/cSharpTimeSession-" \
			+ lastNum + ".pdf"
# اجراش می کنم
f = os.popen(dlCommand)

و البته اگر بخوایم به حالت های خاص جواب بدیم و مثلا خودمون اگر هیچ فایلی نبود به اولین فایل یک عدد بدیم (ظاهرا در سایتشون اولین نسخه شماره ۰۴ است) یا اگر زیر ۹ بودیم یک صفر اولش اضافه کنیم و … برنامه می شه این:

#!/usr/bin/python

import os, re

try:
	f = os.popen('ls -1  cSharp*pdf | sort | tail -1')
	lastdl = f.read()
	lastNum = int(re.search ('cSharpTimeSession-(\d+).pdf', lastdl).group(1))
except:
	lastNum = 3 #first file there is 4. so we'll assume that the current one is 3
	
if lastNum < 9:
	lastNum = "0" + str(lastNum+1)
else:
	lastNum = str (lastNum + 1)
	
dlCommand = "wget http://dl.webtarget.ir/027-cSharpTime/session-" \
			+ lastNum + "/cSharpTimeSession-" \
			+ lastNum + ".pdf"
f = os.popen(dlCommand)

منطقا این رو باید در یک کرون بذاریم یا سری اول با تکنیک watch python ./autodlcSharpbook.py دانلودش کنم که همه شماره ها رو بگیره یا مثلا اگر خروجی دستور موفقیت آمیز بود یک ایمیل بزنیم به صاحب جریان که فایل بهش اتچ باشه یا چنین چیزهایی. اونش با شما و سلیقه‌های شخصی‌تون.

پ.ن. اینم من حین نوشتن این برنامه. اصلا دلیلی که الان نوشتم این بود که دو تا مانیتور داشتم. فردا باید مانیتورم رو تحویل بدم ولی باید درخواست یک مانیتور اضافی بکنم. به نظرم هیچ چیز به اندازه دو - یا بیشتر - مانیتور کامپیوتر رو برای یک گیک لذت بخش نمی کنه. احتمالا عددی به اسم w وجود داره که اینطوری تعریف می شه «تعداد مانیتوری که یک سیستم ویندوزی باید داشته باشه تا یک علاقمند لینوکس با لذت پشتش بشینه و کار کنه»

jadi_while_programming

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

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

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

و اگر به طور دقیق تعداد کلمات و درصدهای دقیق تر رو می خواین می تونین با دانلود فایل صفحه گسترده فراوانی حروف فارسی در قانون اساسی ایران با 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 و براتون انجام می دم می فرستم. فقط متن بدون شک باید در فرمت متنی باشه. پی دی اف و اینها نیازمند تبدیل هستن.
۲- همونطور که شاهین هم در کامنت ها گفته، قانون اساسی اصلا متن خوبی برای سنجش «میزان استفاده حروف در زبان فارسی» نیست. اولا که کلمات غیرمرسومی داره و احتمالا سطح عربی اش زیاده و از اونطرف یک متن طبیعی نیست و مثلا کلمه «اصل» توش حداقل به تعداد اصول قانون اساسی استفاده شده و احتمالا هیچ رمانی اینقدر «ص» توش نداره (:

چرا گنو/لینوکس رو دوست دارم: ضبط صدای در حال پخش

یپش اومده بخواین صدایی که داره از کامپیوترتون پخش می شه رو ضبط کنین؟ مثلا حین یک بازی بخواین صدای بازی رو ضبط کنین یا بخواین آهنگی که توی یک صفحه وب در حال پخشه رو نگه دارین؟ من الان دلم خواست و لینوکس دارم پس:

  1. چون معماری سیستم درست و لایه به لایه است حتما امکان عملی این کار هست
  2. چون سیستم آزاد و بازه حتما یکی برنامه ای نوشته که اینکار رو می کنه
  3. چون سیستم با جامعه زنده است حتما کسی قبلا اینو نوشته که توش چیکار باید کرد
  4. چون ابزارها بازن حتا من توان این رو دارم که بنا به نیاز خودم تنظیمش کنم

و هر چهار مورد واقعیت داره.

منم مثل خیلی از دوستان برای سیستم صدا از PulseAudio استفاده می کنم پس با زدن

pacmd list | grep ".monitor"

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

jadi@jell:/tmp$ pacmd list | grep ".monitor"
	monitor source: 0
	name: 
	monitor_of: 0
		device.class = "monitor"
		alsa_output.pci-0000_00_1b.0.analog-stereo.monitor/#0: Monitor of Built-in Audio Analog Stereo

نشون میده که من باید به این دیوایش گوش بدم. دستور اینکه بگیم «اطلاعاتی که از فلان پالس آدیو پخش می شه رو نشون بده» دستور pacat است (قشنگیش رو دیدین؟ (: )) و در نتیجه دادن خروجی به sox باعث می شه بتونم خروجی رو به فرمت صوتی‌ای که دوست دارم تبدیل کنم:

pacat --record -d alsa_output.pci-0000_00_1b.0.analog-stereo.monitor | sox -t raw -r 44100 -s -L -b 16 -c 2 - "output.wav"

و به همین سادگی هر چیزی که از بلندگوی کامپیوتر در حال پخشه رو دقیقا با کیفیتی که به بلندگو می رسه در لایه پالس آدیو ذخیره کنم.

قرعه کشی و اعلام اسامی برندگان جایزه‌های مسابقه پیش بینی سورپرایز اوبونتو

دو سه روز قبل مسابقه ای داشتیم برای حدس سورپرایز اوبونتو و بعدش هم کسانی که جواب تا حدی درست داده بودن و قرار بود در قرعه کشی حضور داشته باشن، اعلام شدن. حالا لحظه قرعه کشی فرا رسیده! برنامه قرعه کشی رو علیرضا داوطلبانه نوشت و من هم همون رو استفاده می‌کنم. برنامه نسبتا عجیبی است که این فایل رو می‌گیره:

 3 AliBehjati
 3 Mohammad
 3 Hesam
 1 Ehsan
 1 Amir1207
 1 Ali1217
 6 Ali0202
 1 Voltan
 2 Amir0119
 1 Saeed
 2 Jamshid
 2 Matin
 3 Narcissus
 2 MassoudM

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

[jadi@jedora ghore.sh]$ cat ghore_keshi.sh 
#! /bin/bash

if [ ! -f "gklist" ]; then
    echo "Write names and scores to 'gklist' file and execute this script at the same directory"
    exit 1
fi

if [ ! -d /tmp/gk ]; then
    mkdir /tmp/gk
else
    rm /tmp/gk/*
fi
cp "gklist" /tmp/gk
cd /tmp/gk

for ((i=0; i<`cat "gklist" | wc -l`; i++)); do
    S="`cat "gklist" | head -$[i+1] | tail -1`"
    NUM="`echo "$S" | awk '{ print $1 }'`"
    NAME="$(cat "gklist" | head -$[i+1] | tail -1 | cut -d\" -f2)"
    for ((j=0; j<$NUM; j++)); do
	echo $NAME >> result
    done
done

LL="`cat "result" | wc -l`"
RANDNUM="`python -c "import random;print(random.randint(1, $LL))"`"
barande=`cat "result" | head -$RANDNUM | tail -1 | cut -d" " -f2 `
cowsay Winner of $1 $barande

نکته بسیار مهم اینه که در یک رای گیری / قرعه کشی و … تا وقتی از نرم افزار آزاد و پروسه‌های شفاف استفاده نشده یعنی یک جای کار می لنگه (منظور فقط تقلب و خباثت نیست. این لنگش(!) ممکنه سواد یا شعور یا دسترسی فنی برگزار کننده باشه).

حالا که همه پروسه‌ها شفافن و هر کسی هم به سورس برنامه انتخاباتی دسترسی داره، می ریم سراغ قرعه کشی. اگر یک سیستم درست داشتیم این بخش هم باید به شکل مستقیم در اینترنت پخش می شد ولی من به خاطر لنگیدن اینترنت درست، ضبطش کردم و آفلاین گذاشتمش روی اینترنت که شبهات به حداقل برسه. با یک خط دستور دوبار برنامه رو اجرا می کنیم برای دو جایزه: اولی تی شرت و دومی ماگ. دعا هم کنیم که برنده تکراری در نیاد! ویدئوی برگزاری رو ببینین؛ با تشکر از شرکت معظم www.aivivid.com که اسپانسری تی شرت مجری رو بر عهده داشتن



اگر هم حاکم هاتون تصمیم گرفتن که دیدن ویدئو براتون خوب نیست ونمی تونین از برنده ها مطلع بشین نگران نباشین! خودم به شکل متنی هم براتون برنده ها رو اعلام می کنم:

  • برنده اول مسعود.ام تنها شرکت کننده ما از گوگل پلاس با شانس ۲ که برنده این تی شرت میشه:
  • و برنده دوم متین – اونهم با شانس دو – که این ماگ رو از اسپانسر مسابقه یعنی سیتو دریافت می کنه

با برندگان عزیز برای گرفتن آدرس و ارسال جوایزشون تماس گرفته می شه (: خوش باشین تا مسابقه بعدی

پ.ن. ویدئو رو با این دستور گنو/لینوکسی کوچیک کردم

 $ffmpeg -i DSCN3085.AVI -ab 56k -ar 22050 -b 300k -r 15 -s 480x360 DSCN3085.flv                             

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

آپدیت: کد 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);

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

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

چرا گنو/لینوکس رو دوست دارم: شمردن کلمات به کار رفته شده در وبلاگ

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

برنامه پایتون رو اینطوری تغییر می‌دم:

#!/usr/bin/python
# -*- coding: utf8 -*- 

from xml.dom import minidom
import xml.etree.cElementTree as et
import re

tree=et.parse('wordpress.2012-12-05.xml')
root=tree.getroot();

wordCount = {}

for child in root.iter('item'):
	date = child.find('wppost_date').text[:7] #find the year and month
	body = child.find('content_encoded').text # post content
	title = child.find('title').text 	  # post title

	try:
		fulltext = title + "\n" + body # all the text in the post = title + body
	except:
		pass

	fulltext = re.sub(ur'[_»«"\'&?؟a-zA-Z‌0-9/=.*+\n-%<>:;،؛,\-)(،۱۲۳۴۵۶۷۸۹۰]', ' ', fulltext) #replace extra chars
	words = fulltext.split() # words is a list of all words in this post

	for word in words:
		wordCount[word] = wordCount.get(word, 0) + 1 # wordCount[word]++

for word in wordCount:
	thisLine = (str(wordCount[word]) + "\t" + word)
	print thisLine.encode("utf-8", "ignore")


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

...
4	همسرش
1	آکر
3	خرمش
1	ویسمن
2	خرما
1	یکباری
1	مانغو
2	احساسم
1	عصبي
61	رشد
1	رشت
1	تریلیان
5	همسرم
32	هیات
1	پورتال
2	پیشانی
6	مدیربسته
4	لری
4	وجدان
...


و البته مشخصه که خیلی طولانی‌تر. بذارین بشمریم که من کلا در زندگی چند کلمه استفاده کردم تو وبلاگم:

jadi@jeducation:~/Downloads/weblog_word_usage$ ./count_all_words.py | wc -l
27880


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

jadi@jeducation:~/Downloads/weblog_word_usage$ ./count_all_words.py | wc -l
23405


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

jadi@jeducation:~/Downloads/weblog_word_usage$ ./count_all_words.py | sort -n -r | head -20

خروجی رو براتون نمی‌ذارم چون فقط یکسری حرف ربط بی ربط است.

پروژه جانبی بسیار مهم برای زبان فارسی: همه زبان‌ها یک فایل دارن به اسم نمی دونم چی (کسی می‌دونست لطفا بگه) که توش کلمات «بی ربط» اون زبان نوشته شدن. به اصطلاح همون am و is و are یا امثال «است» و «شد» و «و» و «یا» و … که در اینجور جاها کاربرد داره (می شه اون کلمات رو از فهرست این کلمات که برنامه بهمون داده حذف کرد تا کلمات اختصاصی من به دست بیاد و نه چیزهایی که برای جمله ساختن همه استفاده می کنن). آیا چنین فایلی داریم برای زبان فارسی؟ تو خارجی‌ها اسمش چیه؟

حالا که بیست تا اولی به درد نخوردن، به جاش کل لیست رو می‌برمش توی لیبره آفیس و مثل همیشه نمودار بیشترین کلمات (غیر حرف ربط و استاندارد مثل است و باشد و شد و اینها) رو می‌کشیم تا با یک نمودار قشنگ کار رو تموم کرده باشیم:

پ.ن. این مجموعه مهمل ، یک قسمت دیگه هم داره (: کمی دیرتر ولی.