به نام خدا.

سلام.
با توجه به فراوانیِ وقت در دوران قرنطینه، بهترین و شاید باارزش ترین کار (در مقایسه با تلف کردن وقت توی اینستاگرام)، به رگبار بستنِ شما با نوشته های جدید، باشه.
چند روز پیش یه دیوانه بازی دیگه درآوردیم و یه برنامه نوشتیم که چند جمله ها رو برامان evaluate کنه. امروز هم گفتم در پیرو خطِ دیوانه بازی و به افتخار تمام دیوانه ها و جنگلی های دنیا (اولینشان خودم)، یه برنامه دیگه بنویسیم.
توی دانشگاه Cambridge یه تحقیقی رو انجام داده بودن که خیلی جالب بود. ما میخوایم توی این مقاله همون کار رو به وسیله یه برنامهء Python ولی برای زبان فارسی انجام بدیم. احتمالاً نتیجش جالب بشه.
ولی قبلش بریم و ببینیم اونا چکار کرده بودن:
این تحقیق گفته بود که اگه ما یه متن داشته باشیم و بریم توی این متن و «فقط حروف داخلی» کلمات رو بهم بریزیم (یعنی حروف اول و آخر تغییر نکنن)، به احتمال زیاد ما میتانیم بازم متن رو بخوانیم و متوجه بشیم! جالبه نه؟
عکس زیر رو ببینید و سعی کنید بخوانیدش:

اگه نتانستید بخوانیدش، این میشه ورژن معمولیش:
According to a research at Cambridge University, it doesn’t matter in what order the letters in a word are, the only important thing is that the first and last letters be at the right place. The rest can be a total mess and you can still read it without problem. This is because the human mind does not read every letter by itself, but the word as a whole.
ترجمهء خودمانیِ فارسی:
بر اساس یه تحقیق توی دانشگاه کمبریج، اهمیتی نداره که حروف به چه ترتیبی توی کلمات قرار گرفتن، تنها چیزی که مهمه اینه که حروف اول و آخر در جای درست باشن. بقیه حروف میتانن کاملاً «خَر در چمن» (یعنی همون بهم ریخته) باشن ولی با این وجود، تو بازم میتانی بدون مشکل بخوانیش. این به این دلیله که ذهن انسان، تک تکِ حروف رو نمیخوانه، بلکه به کُلِ یه کلمه، به عنوان یه واحد، نگاه میکنه.

به این قضیه میگن Typoglycemia و البته اینکه «تحت چه شرایطی، بعد از بهم زدن کلمات، متنِ حاصل، خواناتر میشه» هم یه سری چیزا هست که من دیگه راجبش اینجا حرف نمیزنم. اگه خواستید اینجا میتانید راجبش بیشتر بخوانید.
حالا ما میخوایم توی این مقاله همین کار رو با متونِ فارسی هم بکنیم و گَند بزنیم به کلمات و ببینیم نتیجه چه میشه و چقدر قابل خواندنه نتیجه.
یعنی میخوایم یه برنامه بنویسیم که:
اول برنامه رو ببینید، بعدش یه توضیح کوتاه میدم راجب بخش های مختلفش:
import random as r def dota_tekrari_poshte_ham(word): for i in range(1, len(word)): if word[i - 1] == word[i]: return True return False def clean(text): words = text.split() clean_words = [] # clean each word for k in range(len(words)): clean_word = [] # Char by char, if word length > 2 if len(words[k]) > 1: for i in range(len(words[k])): if words[k][i] not in '.,:;?!()\'"؟،': clean_word.append(words[k][i]) # print('* Clean word:', clean_word) # test clean_words.append(''.join(clean_word) if clean_word else words[k]) # print('* Clean words:', clean_words) # test return ' '.join(clean_words) def gand_word(word): if len(word) > 1 and not word.isdigit(): inner_part = list(word[1:-1]) r.shuffle(inner_part) gandide = word[0] + ''.join(inner_part) + word[-1] # print('* Gandide word:', gandide) # test if not dota_tekrari_poshte_ham(gandide): return gandide else: gandide = gand_word(word) return gandide else: return word def gand_text(text): words = clean(text).split() # print('* Words:', words) # test result = [] for word in words: result.append(gand_word(word)) # print('* Result:', result) # test return ' '.join(result) def main(): text = input('Matn ro vared kon: ') version_count = 1 print('-------------\n* VERSION #{}:\n'.format(version_count), gand_text(text)) while True: q = input('-------------\nChekar konim?\n1) Hamin matn, ye version dige.\n2) Ye matn dige.\n3) Hichi, khodafezi.\n-> Entekhab: ') if q == '1': version_count += 1 print('-------------\n* VERSION #{}:\n'.format(version_count), gand_text(text)) elif q == '2': text = input('-------------\nMatne jadid ro vared kon: ') version_count = 1 print('-------------\n*** VERSION #{} BA MATNE JADID:\n'.format(version_count), gand_text(text)) elif q == '3': print('-------------\nKHODAFEZI.') break else: print('-------------\nFAGHAT MITANI 1, 2, 3 VARED KONI.') if __name__ == '__main__': main()
همون کاری که ما میخوایم. متن رو میگیره و با حفظ شئونات (یعنی همون حروف اول و آخر)، گند میزنه بهش.
کل قضیه میشه ۵ تا function که ما رو به هدف میرسانن:
برای مثال ها از ۲ تا از جمله های همین مقاله استفاده شده.
شما هر جمله ای که دوس داشتین بهش بدین و اگه باگ یا مشکلی هم داشت، برطرفش کنید. خدا رو چه دیدی؟ شاید چند تا باگ و مشکل توی جاهای مختلف این کد باشه!
یه نکته هم اینه که اگه خواستین دیگه خیلی نتیجه های عجیب به شما بده، اون محدودیتِ دو تا حرفِ پشت سر هم رو بردارید.
اگه هم احیاناً متن های فارسی به سمت راست کوچ کردن، دلیلش ادیتورِ ویرگوله، ما بی تقصیریم.
Matn ro vared kon: بهش میگیم «بسه دیگه» و برنامه رو میبندیم و خداحافظ. ------------- * VERSION #1: بهش میگیم «بسه دگهی» و برنماه رو میدبینم و خافاحدظ ------------- Chekar konim? 1) Hamin matn, ye version digeظ 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 1 ------------- * VERSION #2: بهش میگیم «سبه دگهی» و برمناه رو منبیدیم و خدحافاظ ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 1 ------------- * VERSION #3: بهش میگیم «سبه دهیگ» و بانرمه رو مبدینیم و خافادحظ ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 2 ------------- Matne jadid ro vared kon: «این به درد عمت میخوره، یکی دیگه بهم بده». ------------- *** VERSION #1 BA MATNE JADID: «یان به درد عمت مورخیه یکی دیگه بهم بهد» ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 1 ------------- * VERSION #2: «یان به درد عمت مویرخه یکی دیگه بهم بده» ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 1 ------------- * VERSION #3: «یان به درد عمت مخریوه یکی دگیه بهم بده» ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 2 ------------- Matne jadid ro vared kon: اونم گند میزنه به کلمات و نتیجه رو در قالب یه اثر هنری به ما میده. ------------- *** VERSION #1 BA MATNE JADID: انوم گند میزنه به کمالت و نتجیه رو در قالب یه اثر هنری به ما مدیه ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 1 ------------- * VERSION #2: انوم گند منزیه به کالمت و نیجته رو در قالب یه اثر هنری به ما مدیه ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 1 ------------- * VERSION #3: انوم گند مزنیه به کملات و نجیته رو در قالب یه اثر هنری به ما مدیه ------------- Chekar konim? 1) Hamin matn, ye version dige. 2) Ye matn dige. 3) Hichi, khodafezi. -> Entekhab: 3 ------------- KHODAFEZI.
از هرکدام از اون ۲ تا جمله، ۳ ورژن رو دیدیم. شما میتانی تا هزار ورژن هم بری جلو، البته اگه جمله جالبی داشته باشی، به علاوهء حوصله زیاد و وقت زیاد!
دی مخلصات پرمنگنات.
یا علی.
برای ارتباط با من میتانید از ID تلگرام solyinho@ یا آدرس ایمیل odiwxe@gmail.com استفاده کنید.