برنامه نویسی

[Development Tips] چگونه تعداد ضربات را با حروف چینی بدست آوریم؟

Summarize this content to 400 words in Persian Lang

پس زمینه

در طول توسعه یک خط فال ساده، با این مشکل جالب روبرو شدم. اگر فقط چند کاراکتر چینی خاص باشد، می‌توانیم یک فرهنگ لغت را در اسکریپت کدگذاری کنیم، اما اگر بخواهیم تعداد ضربه‌ها را برای هر کاراکتر چینی دریافت کنیم، چه؟

کتابخانه pypinyin

from pypinyin import pinyin, Style

def get_strokes_count(chinese_character):
pinyin_list = pinyin(chinese_character, style=Style.NORMAL)
strokes_count = len(pinyin_list[0])
return strokes_count

character = input(“Please enter a Chinese character:”)
strokes = get_strokes_count(character)
print(“Character'{}’stroke numbers:{}”.format(character, strokes))

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

پایگاه داده Unihan

پایگاه داده Unihan یک پایگاه داده با حروف چینی است که توسط کنسرسیوم یونیکد نگهداری می شود که کاملاً قابل اعتماد به نظر می رسد و ابزارهای آنلاین را نیز ارائه می دهد.

در جستجوی آنلاین خود Unihan Database Lookup دریافتم که نتایج پرس و جو شامل موارد زیر است kTotal Strokes فیلد، که داده های تعداد ضربه های مورد نیاز ما است.به عنوان پایگاه داده رسمی یونیکد، نسخه فعلی به طور کامل نیازهای اساسی پرس و جوهای حروف چینی را برآورده می کند.

خوب! یک قدم به موفقیت نزدیک تر!

دریافت اطلاعات سکته مغزی از پایگاه داده Unihan

من در ابتدا قصد داشتم درخواست های پرس و جو را مستقیماً از طریق جستجو ارسال کنم، اما بسیار کند بود و آدرس در خارج از کشور چین است. من متوجه شدم که خود فایل پایگاه داده بزرگ نیست، بنابراین آن را مستقیما دانلود کردم.

متحد شوید

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

با جستجوی نتایج، ما به آن نیاز داریم kTotal Strokes میدان در منبع سپاه. این فایل را اکسترکت کنید.من regex را روی regex101 آزمایش کردم تا قسمت یونیکد مورد نظر و قسمت تعداد ضربه را استخراج کنم و آنها را جداگانه برای پرس و جو ذخیره کردم.

کد نویسی

استخراج اطلاعات سکته مغزی

file = Path(“Stroke/Unihan_IRGSources.txt”)
output = Path(“Stroke/unicode2stroke.json”)
stroke_dict = dict()
with open(file,mode=”r”) as f:
for line in f:
raw_line = line.strip()
pattern = r”(U\+.*)\skTotalStrokes.*\s(\d+)”
result = re.findall(pattern=pattern, string=raw_line)
if len(result) == 0:
continue
unicode_key = result[0][0] unicode_stroke = result[0][1] print(f”{unicode_key}: {unicode_stroke}”)
stroke_dict[unicode_key] = unicode_stroke

with open(file=output, mode=”w”, encoding=”utf-8″) as f:
json.dump(stroke_dict,f, ensure_ascii=False, indent=4)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای دسترسی آسان به json صادر می شود.

نوشتن تابع اکتساب

with open(output) as f:
unicode2stroke = json.load(f)

def get_character_stroke_count(char: str):
unicode = “U+” + str(hex(ord(char)))[2:].upper()
return int(unicode2stroke[unicode])

test_char = “阿”
get_character_stroke_count(char=test_char)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگام بدست آوردن، توجه داشته باشید که یونیکد کاراکتر را به کد هگزادسیمال متناظر خود تبدیل می کند

موفقیت! نتیجه مورد انتظار به دست آمده است!

پس زمینه

در طول توسعه یک خط فال ساده، با این مشکل جالب روبرو شدم. اگر فقط چند کاراکتر چینی خاص باشد، می‌توانیم یک فرهنگ لغت را در اسکریپت کدگذاری کنیم، اما اگر بخواهیم تعداد ضربه‌ها را برای هر کاراکتر چینی دریافت کنیم، چه؟

کتابخانه pypinyin

from pypinyin import pinyin, Style

def get_strokes_count(chinese_character):
    pinyin_list = pinyin(chinese_character, style=Style.NORMAL)
    strokes_count = len(pinyin_list[0])
    return strokes_count

character = input("Please enter a Chinese character:")
strokes = get_strokes_count(character)
print("Character'{}'stroke numbers:{}".format(character, strokes))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

پیپینین اشتباه است

پایگاه داده Unihan

پایگاه داده Unihan یک پایگاه داده با حروف چینی است که توسط کنسرسیوم یونیکد نگهداری می شود که کاملاً قابل اعتماد به نظر می رسد و ابزارهای آنلاین را نیز ارائه می دهد.

در جستجوی آنلاین خود Unihan Database Lookup دریافتم که نتایج پرس و جو شامل موارد زیر است kTotal Strokes فیلد، که داده های تعداد ضربه های مورد نیاز ما است.
به عنوان پایگاه داده رسمی یونیکد، نسخه فعلی به طور کامل نیازهای اساسی پرس و جوهای حروف چینی را برآورده می کند.

خوب! یک قدم به موفقیت نزدیک تر!
unihan_lokup

دریافت اطلاعات سکته مغزی از پایگاه داده Unihan

من در ابتدا قصد داشتم درخواست های پرس و جو را مستقیماً از طریق جستجو ارسال کنم، اما بسیار کند بود و آدرس در خارج از کشور چین است. من متوجه شدم که خود فایل پایگاه داده بزرگ نیست، بنابراین آن را مستقیما دانلود کردم.

متحد شوید

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

Unihan_files.png

با جستجوی نتایج، ما به آن نیاز داریم kTotal Strokes میدان در منبع سپاه. این فایل را اکسترکت کنید.
من regex را روی regex101 آزمایش کردم تا قسمت یونیکد مورد نظر و قسمت تعداد ضربه را استخراج کنم و آنها را جداگانه برای پرس و جو ذخیره کردم.

کد نویسی

  • استخراج اطلاعات سکته مغزی
file = Path("Stroke/Unihan_IRGSources.txt")
output = Path("Stroke/unicode2stroke.json")
stroke_dict = dict()
with open(file,mode="r") as f:
    for line in f:
        raw_line = line.strip()
        pattern = r"(U\+.*)\skTotalStrokes.*\s(\d+)"
        result = re.findall(pattern=pattern, string=raw_line)
        if len(result) == 0:
            continue
        unicode_key = result[0][0]
        unicode_stroke = result[0][1]
        print(f"{unicode_key}: {unicode_stroke}")
        stroke_dict[unicode_key] = unicode_stroke

with open(file=output, mode="w", encoding="utf-8") as f:
    json.dump(stroke_dict,f, ensure_ascii=False, indent=4)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای دسترسی آسان به json صادر می شود.

  • نوشتن تابع اکتساب
with open(output) as f:
    unicode2stroke = json.load(f)

def get_character_stroke_count(char: str):
    unicode = "U+" + str(hex(ord(char)))[2:].upper()
    return int(unicode2stroke[unicode])

test_char = ""
get_character_stroke_count(char=test_char)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگام بدست آوردن، توجه داشته باشید که یونیکد کاراکتر را به کد هگزادسیمال متناظر خود تبدیل می کند

موفقیت! نتیجه مورد انتظار به دست آمده است!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا