Distribution of persian letters

This code will use the dump of Persian wikipedia to find some stats about the persian letters distribution and frequency. It is done by www.Jadi.net and published under GPLv3 Licence

extracting a huge farsi file from wikipedia

First of all, this part reads the wikipedia dump and spits only the TEXT of articles. This will use a random number generator to keep only the 10% of articles.


In [5]:
%matplotlib inline

In [1]:
import xml.etree.ElementTree as etree
import re
import random

inFile = '/home/jadi/w/wikipedia/fawiki-20150807-pages-articles.xml'

random.seed()
counter = 0

for event, elem in etree.iterparse(inFile, events=('start', 'end', 'start-ns', 'end-ns')):
    if random.random() < 0.9: #only work on 10% of articles
        try:
            elem.clear()
        except:
            pass
        continue

    thisTxt = None
    try:
        if elem.tag.endswith('/}text'):
            thisTxt = elem.text
            elem.clear()
    except:
        continue
        
    if not thisTxt:
        elem.clear()
        continue
        
print thisTxt[1:10000]


  File "<string>", line unknown
ParseError: no element found: line 100001, column 0

Removing tags

Will read the output text file from the previous step, will remove whatever between tags because tags are repeatative wikipeida syntax. We will also replace some arabic chars with persian equvalents


In [2]:
import re

inputText = '/home/jadi/w/wikipedia/wiki_fa.txt'
f = open(inputText, 'r')
alltext = f.read()
text = alltext
text=re.sub("\n", " ", text)
text=re.sub("\[+", "[", text)
text=re.sub("\]+", "]", text)
text=re.sub("\{+", "{", text)
text=re.sub("\}+", "}", text)
text=re.sub("{.*?}", " ", text)
text=re.sub("\<.*?\>", " ", text)
text=re.sub("\[.*?\]", " ", text)
text=re.sub("\s+", " ", text)

# changing some arabic chars to correct persian ones
text=re.sub(u"ي", u"ی", text)
text=re.sub(u"ك", u"ک", text)


print text[1:10000]


/ / &nbsp;''' ''' &ndash; ''' ''' &ndash; ''' ''' &ndash; ''' ''' /هفته /هفته } نگاره‌های برگزیدهٔ روزهای اخیر: &ndash; &ndash; ''' ''' &ndash; ''' ''' __NOTOC__ __NOEDITSECTION__ عملی که شما درخواست کرده‌اید فقط می‌تواند توسط کاربران با وضعیت «توسعه‌دهنده» انجام شود. به $1 مراجعه کنید. شرمنده! ویکی مشکلات فنی دارد، و نمی‌تواند با کارگزار پایگاه داده تماس بگیرد. ویکی‌پدیا است که با همکاری خوانندگانش نوشته می‌شود. این وب‌گاه است، یعنی هر کسی، از جمله ''خود شما'' می‌توانید با کلیک کردن روی پیوند '''ویرایش''' که در همهٔ مقالات می‌آید، آن را ویرایش کنید. == گشت و گذار در ویکی‌پدیا == ویکی‌پدیا اطلاعات زیادی دربارهٔ انواع و اقسام موضوعات دارد. برای آزمایش به بروید، موضوعی که برایتان جذاب است را انتخاب و شروع به کندوکاو کنید. در بالای هر صفحه نیز قسمتی برای جستجو وجود دارد تا بتوانید اطلاعات را به سرعت پیدا کنید. اگر چیزی را خواندید و به‌واقع برایتان جالب بود، یادداشتی در قسمت مقاله بنویسید. برای این کار اول پیوند '''بحث ''' را انتخاب کنید (در نوار بالای صفحه به دنبال آن بگردید) تا به صفحهٔ بحث بروید. سپس '''ویرایش''' را در صفحهٔ بحث انتخاب کنید. آگاهی از نظر شما مایهٔ خوشحالی ماست. اگر ما به موضوعی نپرداخته‌ایم یا برای پیدا کردن چیزی دردسر دارید، از بپرسید یا موضوع را به فهرست اضافه کنید. ''رجوع شود به'': == ویرایش == هر کسی می‌تواند صفحات ویکی‌پدیا را ویرایش کند. (حتی این صفحه را!) کافی است پیوند '''ویرایش''' را در بالا یا پایین صفحه‌ای که فکر می‌کنید نیازمند ویرایش است انتخاب کنید. صلاحیت خاصی لازم نیست، حتی لازم نیست به سیستم شوید. برای تمرین این کار، بدون ریسک خراب کردن یک مقالهٔ واقعی سری به بزنید. جایی که می‌توانید هر چقدر دلتان می‌خواهد تمرین ویرایش کنید. برای تمرین ویرایش یک صفحهٔ موجود مثل همین صفحه، آن را در «صفحه تمرین» کپی کنید. اگر می‌خواهید بیشتر بدانید، و را ببینید تا اطلاعات ضروری برای اعضای این پروژه را یاد بگیرید. یک راه ساده برای کمک، استفاده از ویکی‌پدیا است، درست مانند هر دانشنامهٔ دیگر؛ با این تفاوت که هر وقت به ایرادی برخوردید -مثلاً به یک غلط املایی یا یک جملهٔ نامفهوم- پیوند «ویرایش این صفحه» را انتخاب کنید و درستش کنید. . هرگونه بهبودی را اعمال کنید. زیاد نگران اشتباه کردن نباشید. اشتباهات کوچک را همیشه می‌توانید بعدتر اصلاح کنید یا دیگران اصلاح کنند. شاید این مسأله کمی ترسناک به نظر برسد. برای توضیح دلیل عملی بودن این سیستم، را ببینید. ویکی‌پدیا با وجودِ داشتن تعداد زیادی مقاله، همچنان به خاطر اضافه شدن مقالات جدیدی که کسانی مثل شما می‌نویسند، در حال رشد است. شما می‌توانید یا یکی از مقالات موجود را انتخاب کرده، بخشی جدیدی به آن اضافه کنید. بهتر است نگاهی به ‌های ما بیاندازید. به خصوص سیاست که به این معناست که مقالات نباید جانبدارانه باشند و باید دیدگاه‌های مختلف دربارهٔ موضوع را منصفانه و دلسوزانه بیان کنند. اگر متوجه شدید که تغییرات شما را اصلاح یا حذف می‌کنند، برای پیدا کردن علت تاریخچهٔ صفحه، صفحهٔ بحث خودتان و صفحهٔ بحث مقاله را ببینید. تمام مشارکت‌ها در ویکی‌پدیا تحت (GFDL) منتشر می‌شوند. این اجازه‌نامه قابلیت توزیع آزاد ویکی‌پدیا را برای همیشه تضمین می‌کند (برای اطلاع بیشتر را ببنید). == به ما بپیوندید == همه می‌توانند ویرایش کنند اما اگر می‌خواهید دائم ویرایش کنید، درست کردن حساب دارد. اگر می‌خواهید عضو شوید برای خودتان . == مراجعات == === اطلاعات عمومی و راهنماها === * * - راهنمای ویرایش، شروع مقالهٔ جدید و چیزهای بسیار دیگر * - پرسش‌های رایج در مورد پایگاه * - واژه‌نامهٔ اصطلاحات متداول در ویکی‌پدیا * * === شهروندی در ویکی‌پدیا === ==== گوشهٔ آموزشی ==== * * * * * ==== کندوکاوهای عمیق‌تر ==== * * === جامعهٔ ویکی‌پدیا === * * - فهرست‌های مختلف از مشارکت‌کنندگان. اگر دوست دارید می‌توانید نامتان را اضافه کنید. ''این نوشتار به واژه «اطّلاعات» به مفهومی که در طول (آگاهی) و (دانش) به کار می‌رود، می‌پردازد. برای دیگر کاربردها را ببینید. '' '''اطّلاع''' یا '''آگاهش''' در کوتاه‌ترین تعریف، «داده‌های پردازش نشده» است. داده‌ها مواد خام بالقوه معنی‌داری هستند که ما آن‌ها را در راستای شناخت و فهم هر مفهوم مادی یا غیر مادی، به واسطه روش‌های پژوهشی، و با استفاده از ابزارهای شناختی به دست می‌آوریم. داده یک شرح مقدماتی از یک پدیده، اتفاق، فعالیت و یا تعاملات است که ثبت شده است، دسته‌بندی شده و ذخیره شده است؛ اما سازماندهی نشده و برای یک منظور مشخص آماده نشده است. داده‌ها عناصر اصلی اطلاعات هستند. داده‌ها در صورتی به اطلاعات تبدیل می‌شوند که افراد بخواهند برای درک بیشتر از آنها استفاده کنند. اطلاعات، داده‌های خلاصه‌ای هستند که گروه‌بندی، ذخیره، پالایش و سازماندهی شده‌اند تا بتوانند معنی‌دار شوند. اطلاعات زمانی ارزش پیدا می‌کنند که برای یک بُعد خاص، یک فرد خاص، یک هدف خاص و در زمان خاص گردآوری و آماده شوند، لذا اطلاعاتی که برای یک مدیر، جنبه اطلاعاتی دارد، برای مدیر دیگر ممکن است اصلاً ارزشی نداشته باشد. بدین ترتیب، اطلاعات، آگاهی‌های به دست آمده از عنصرها و رویدادهای جهان هستی است. به زبان محدود تکنیکی، مجموعه‌ای از نمادهای زبانی معنی‌دار و پیوسته دربارهٔ موجودات است. در زبان انگلیسی، اطلاعات از نظمی ساختاری و ذاتی خبر می‌دهد. از منظر ، اطّلاعات مفهومی چندشکلی و چندمعنایی است. == جستارهای وابسته == === مفاهیم در طول اطلاعات === * * رابطه علم و دانش با پیشرفت بشر === مفاهیم در عرض اطلاعات === * * * * * * * * * * * * اهداف علم اطلاعات و دانش‌شناسی راهبردهای اطلاعات == منابع == * Earl Morrogh, Information Architecture, An Emerging 21st Century Profession, Pearson Education, Inc. , 2003. ISBN 0-13-096746-7 * Alan Liu (2004). ''The Laws of Cool: Knowledge Work and the Culture of Information'', University of Chicago Press * Bekenstein, Jacob D. (2003, August). Information in the . ''Scientific American''. * (2011). The Information: A History, a Theory, a Flood. Pantheon, New York, NY. * Shu-Kun Lin (2008). 'Gibbs Paradox and the Concepts of Information, Symmetry, Similarity and Their Relationship', ''Entropy'', 10 (1), 1-5. Available online at . * Luciano Floridi, (2005). 'Is Information Meaningful Data?', ''Philosophy and Phenomenological Research'', 70 (2), pp. &nbsp;351 – 370. Available online at * Luciano Floridi, (2005). 'Semantic Conceptions of Information', ''The Stanford Encyclopedia of Philosophy'' (Winter 2005 Edition), Edward N. Zalta (ed.). Available online at * Sandro Nielsen: 'The Effect of Lexicographical Information Costs on Dictionary Making and Use', ''Lexikos'' 18/2008, 170-189. * Stewart, Thomas, (2001). Wealth of Knowledge. Doubleday, New York, NY, 379 p. * Young, Paul. The Nature of Information (1987). Greenwood Publishing Group, Westport, Ct. ISBN 0-275-92698-2. == پیوند به بیرون == * * Review by Luciano Floridi for the Stanford Encyclopedia of Philosophy * * This essay is continually revised in the light of ongoing research. *

now lets keep ONLY persian chars

$ sed 's/[^آئابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی‌ ]*//g' wiki_fa_only_text.txt > wiki_only_farsi_chars.txt

Doing stats


In [3]:
f = open('/home/jadi/w/wikipedia/wiki_only_farsi_chars.txt', 'r')
alltext = f.read()
alltext = alltext.decode("utf-8")

Alphabet distribution

most frequest letters


In [14]:
allchars = {}
for i in range(0, len(alltext)):
    allchars[alltext[i]] = allchars.get(alltext[i], 0) + 1

allwordsnum = allchars[' ']
totalcharsnum = len(alltext) - allchars[' ']
del allchars[' ']
del allchars['\n']

import numpy as np
from matplotlib import pyplot as plt

letters = u'آابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی'
lettervals =  []
letterlist = []
for letter in list(letters):
    print letter, allchars[letter]
    lettervals.append(allchars[letter]*1.0/totalcharsnum*100)

width = 1/1.5
plt.figure(figsize=(20,10))
plt.bar( range(len(lettervals)), lettervals, width)
plt.xticks([x+0.3 for x in range(len(lettervals))], list(letters), fontsize=18 )
plt.title(u'Percentage of persian letters\n10% of wikipedia articles are tested', fontsize=34)
plt.ylabel('Percent', fontsize=20)
plt.xlabel('Letter', fontsize=20)
plt.show()


آ 193306
ا 3908207
ب 1191550
پ 210176
ت 1510602
ث 59821
ج 287223
چ 92149
ح 211581
خ 291213
د 1861543
ذ 50086
ر 2525170
ز 551658
ژ 34366
س 1129394
ش 692128
ص 140904
ض 57585
ط 142536
ظ 38914
ع 392996
غ 174189
ف 372662
ق 287271
ک 728996
گ 348562
ل 729613
م 1541968
ن 1831045
و 1606199
ه 1638034
ی 2915877

Most frequent initial letters, first letter of words


In [15]:
allwords = alltext.split()

initialchars = {}
for word in allwords:
    initialchars[word[0]] = initialchars.get(word[0], 0) + 1

import numpy as np
from matplotlib import pyplot as plt

letters = u'آابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی'
lettervals =  []
letterlist = []
print 'Initial letters'
for letter in list(letters):
    print letter, allchars[letter]
    lettervals.append(initialchars[letter]*1.0/allwordsnum*100)

width = 1/1.5
plt.figure(figsize=(20,10))
plt.bar( range(len(lettervals)), lettervals, width)
plt.xticks([x+0.3 for x in range(len(lettervals))], list(letters) , fontsize=18)
plt.title(u'Percentage of persian initial letters\n10% of wikipedia articles are tested', fontsize=34)
plt.ylabel('Percent', fontsize=20)
plt.xlabel('Initial Letter', fontsize=20)
plt.show()


Initial letters
آ 193306
ا 3908207
ب 1191550
پ 210176
ت 1510602
ث 59821
ج 287223
چ 92149
ح 211581
خ 291213
د 1861543
ذ 50086
ر 2525170
ز 551658
ژ 34366
س 1129394
ش 692128
ص 140904
ض 57585
ط 142536
ظ 38914
ع 392996
غ 174189
ف 372662
ق 287271
ک 728996
گ 348562
ل 729613
م 1541968
ن 1831045
و 1606199
ه 1638034
ی 2915877

most frequent final letters (last letter of words)


In [16]:
allwords = alltext.split()

finalchars = {}
for word in allwords:
    finalchars[word[-1]] = finalchars.get(word[-1], 0) + 1

# lets repeat for final letters
import numpy as np
from matplotlib import pyplot as plt

letters = u'آابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی'
lettervals =  []
letterlist = []
print 'Final letters'
for letter in list(letters):
    print letter, allchars[letter]
    lettervals.append(finalchars[letter]*1.0/allwordsnum*100)

width = 1/1.5
plt.figure(figsize=(20,10))
plt.bar( range(len(lettervals)), lettervals, width)
plt.xticks([x+0.3 for x in range(len(lettervals))], list(letters), fontsize=18 )
plt.title(u'Percentage of persian final letters\n10% of wikipedia articles are tested', fontsize=34)
plt.ylabel('Percent', fontsize=20)
plt.xlabel('Final Letter', fontsize=20)
plt.show()


Final letters
آ 193306
ا 3908207
ب 1191550
پ 210176
ت 1510602
ث 59821
ج 287223
چ 92149
ح 211581
خ 291213
د 1861543
ذ 50086
ر 2525170
ز 551658
ژ 34366
س 1129394
ش 692128
ص 140904
ض 57585
ط 142536
ظ 38914
ع 392996
غ 174189
ف 372662
ق 287271
ک 728996
گ 348562
ل 729613
م 1541968
ن 1831045
و 1606199
ه 1638034
ی 2915877