藏文字构件识别算法

本文介绍了基于Python实现的藏文字符构件识别算法,通过正则表达式和规则匹配,对藏文字符的前加字、上加字、基字、下加字、元音、后加字和再后加字等进行识别,为藏文信息处理提供基础。文章提供了两种模式的输出,一是控制台输出,二是保存到CSV文件。算法详细覆盖了一到七个字符的藏字结构,包括48种现代藏字结构。
摘要由CSDN通过智能技术生成

提示:本文章是上一篇全藏字生成结果进行构件的识别,文章内容借鉴于藏文信息处理的原理与应用那本书。


一:问题描述

        本文章是上一篇全藏字的构建进行识别,全文共输出18785个藏字。藏字由三十个辅音字母和四个元音符号(简称为元音)拼写组合而成,藏文的纵向叠加只是在基字的上下,而前加字、后加字、再后加字均为无叠加的单一辅音字母。在现代藏文文法中,对藏文字符构成藏字有很严格的约束,一个藏字可由一到七个字符构成,其中基字是构成藏字必不可少的构件,其它位置上构件的有无因字而不同。所以藏文字符的构件与藏文音节字中的序列无关,不能只从构件的序列识别出构件,而要从构件的长度、藏字的结构等来识别构件。构件识别是藏文排序、构建统计等操作的前提,对藏文信息处理技术的发展有着重要的意义。除去特殊的 藏字“ཧྥ”及该字构成的藏字外,藏字的结构可细分为 48 种。本实验按照藏文音节中构件的长度,结合现代藏字的48种结构及现代藏文Unicode编码特性,设计程序识别全藏字集中每个藏字的构件。

        现代藏字可由前加字、上加字、基字、下加字、元音、后加字和再后加字构成。其中,基字是构成藏字必不可少的构件,其它构件因字而异。每个藏字由 1 至 7个构件构成。

二:编译环境

        平台:PyCharm,Visual Studio Code

三:算法实现

        主要用Python实现全藏字构件识别的算法,两种模式实现:控制台输出和保存到csv文件中。

1:基于正则【RE】

        构件识别结果输出到控制台。

# 白玛旺久Python编程库
# @TIME:      11:15
# @FILE:      re_code.py
import re

def goujian_fenlei():
    three_jhz = ['བགས', 'མབས', 'གགས', 'བངས', 'དངས', 'གངས', 'འངས',
                 'གམས', 'མམས', 'བབས', 'མངས', 'གབས', 'བམས', 'འམམ']
    data_2 = input("请输入识别的藏字:")
    str = data_2
    if (str != ""):
        goujian_str = {"原字": str, "前加字": None, "上加字": None, "基字": None, "下加字": None,
                       "再下加字": None, "元音": None, "后加字": None, "再后加字": None}
        # 判断构件数,一个构件
        for str in re.split(r"[་།\n]", str):
            if len(str) == 1:
                for jizi in str:
                    goujian_str["基字"] = jizi[0]
                # 二级构件的样式
            elif len(str) == 2:
                if (re.compile(r'[རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ]').findall(str)):
                    goujian_str["上加字"], goujian_str["基字"] = str[0], str[1]
                elif (re.compile(r'[ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ྱ ྲ ླ ྭ]').findall(str)):
                    goujian_str["基字"], goujian_str["下加字"] = str[0], str[1]
                elif (re.compile(r'[ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][གངདནབམའརལས]').findall(str)):
                    goujian_str["基字"], goujian_str["后加字"] = str[0], str[1]
                elif (re.compile(r'[ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ི ུ ེ ོ]').findall(str)):
                    goujian_str["基字"], goujian_str["元音"] = str[0], str[1]
                else:
                    continue
            # 三级构件的样式
            elif len(str) == 3:
                if (re.compile(r'[གདབམའ][ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][གངདནབམའརལས]').findall(str)):
                    if (str[0] in ['ག', 'ད', 'བ', 'མ', 'འ']) and \
                            (str not in three_jhz):
                        goujian_str['前加字'], goujian_str['基字'], goujian_str['后加字'] = \
                            str[0], str[1], str[2]
                    else:
                        goujian_str['基字'], goujian_str['后加字'], goujian_str['再后加字'] = \
                            str[0], str[1], str[2]
                elif (re.compile(r'[གདབམའ][ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ི ུ ེ ོ]').findall(str)):
                    goujian_str["前加字"], goujian_str["基字"], goujian_str["元音"] = str[0], str[1], str[2]
                elif (
                        re.compile(r'[གདབམའ][རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ]').findall(
                            str)):
                    goujian_str["前加字"] = str[0]
                    goujian_str["上加字"] = str[1]
                    goujian_str["基字"] = str[2]
                elif (re.compile(r'[གདབམའ][ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ྱ ྲ ླ ྭ]').findall(str)):
                    goujian_str["前加字"] = str[0]
                    goujian_str["基字"] = str[1]
                    goujian_str["下加字"] = str[2]
                elif (
                        re.compile(
                            r'[རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ི ུ ེ ོ]').findall(
                            str)):
                    goujian_str["上加字"] = str[0]
                    goujian_str["基字"] = str[1]
                    goujian_str["元音"] = str[2]
                elif (
                        re.compile(
                            r'[རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ྱ ྲ ླ ྭ]').findall(
                            str)):
                    goujian_str["上加字"] = str[0]
                    goujian_str["基字"] = str[1]
                    goujian_str["下加字"] = str[2]
                elif (
                        re.compile(
                            r'[རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][གངདནབམའརལས]').findall(
                            str)):
                    goujian_str["上加字"], goujian_str["基字"], goujian_str["后加字"] = str[0], str[1], str[2]
                elif (re.compile(r'[ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ྱ ྲ ླ ྭ][ི ུ ེ ོ]').findall(str)):
                    goujian_str["基字"], goujian_str["下加字"], goujian_str["元音"] = str[0], str[1], str[2]
                elif (re.compile(r'[ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ྱ ྲ ླ ྭ][གངདནབམའརལས]').findall(str)):
                    goujian_str["基字"], goujian_str["下加字"], goujian_str["后加字"] = str[0], str[1], str[2]
                elif (re.compile(r'[ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ི ུ ེ ོ][གངདནབམའརལས]').findall(str)):
                    goujian_str["基字"] = str[0]
                    goujian_str["元音"] = str[1]
                    goujian_str["后加字"] = str[2]
                else:
                    goujian_str['基字'], goujian_str['下加字'], goujian_str['再下加字'] = \
                        str[0], str[1], str[2]
            # 四个构件的识别
            elif len(str) == 4:
                if (
                        re.compile(
                            r'[གདབམའ][རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ི ུ ེ ོ]').findall(
                            str)):
                    goujian_str["前加字"], goujian_str["上加字"], goujian_str["基字"], goujian_str["元音"] = str[0], str[1], \
                                                                                                   str[
                                                                                                       2], str[3]
                elif (re.compile(r'[གདབམའ][ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ྱ ྲ ླ ྭ][ི ུ ེ ོ]').findall(str)):
                    goujian_str["前加字"], goujian_str["基字"], goujian_str["下加字"], goujian_str["元音"] = str[0], str[1], \
                                                                                                   str[
                                                                                                       2], str[3]
                elif (re.compile(r'[གདབམའ][ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ི ུ ེ ོ][གངདནབམའརལས]').findall(str)):
                    goujian_str["前加字"], goujian_str["基字"], goujian_str["元音"], goujian_str["后加字"] = str[0], str[1], \
                                                                                                   str[
                                                                                                       2], str[3]
                elif (
                        re.compile(
                            r'[གདབམའ][རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ྱ ྲ ླ ྭ]').findall(
                            str)):
                    goujian_str["前加字"], goujian_str["上加字"], goujian_str["基字"], goujian_str["下加字"] = str[0], str[1], \
                                                                                                    str[
                                                                                                        2], str[3]
                elif (
                        re.compile(
                            r'[གདབམའ][རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][གངདནབམའརལས]').findall(
                            str)):
                    goujian_str["前加字"], goujian_str["上加字"], goujian_str["基字"], goujian_str["后加字"] = str[0], str[1], \
                                                                                                    str[
                                                                                                        2], str[3]
                elif (re.compile(r'[གདབམའ][ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ྱ ྲ ླ ྭ][གངདནབམའརལས]').findall(str)):
                    goujian_str["前加字"], goujian_str["基字"], goujian_str["下加字"], goujian_str["后加字"] = str[0], str[1], \
                                                                                                    str[
                                                                                                        2], str[3]
                elif (re.compile(r'[གདབམའ][ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][གངདནབམའརལས][དས]').findall(str)):
                    goujian_str["前加字"], goujian_str["基字"], goujian_str["后加字"], goujian_str["再后加字"] = str[0], str[1], \
                                                                                                     str[2], str[3]
                elif (
                        re.compile(
                            r'[རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ྱ ྲ ླ ྭ][ི ུ ེ ོ]').findall(
                            str)):
                    goujian_str["上加字"], goujian_str["基字"], goujian_str["下加字"], goujian_str["元音"] = str[0], str[1], \
                                                                                                   str[
                                                                                                       2], str[3]
                elif (re.compile(
                        r'[རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ི ུ ེ ོ][གངདནབམའརལས]').findall(
                    str)):
                    goujian_str["上加字"], goujian_str["基字"], goujian_str["元音"], goujian_str["后加字"] = str[0], str[1], \
                                                                                                   str[
                                                                                                       2], str[3]
                elif (re.compile(
                        r'[རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ྱ ྲ ླ ྭ][གངདནབམའརལས]').findall(
                    str)):
                    goujian_str["上加字"], goujian_str["基字"], goujian_str["下加字"], goujian_str["后加字"] = str[0], str[1], \
                                                                                                    str[
                                                                                                        2], str[3]
                elif (
                        re.compile(
                            r'[རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][གངདནབམའརལས][དས]').findall(
                            str)):
                    goujian_str["上加字"], goujian_str["基字"], goujian_str["后加字"], goujian_str["再后加字"] = str[0], str[1], \
                                                                                                     str[2], str[3]
                elif (re.compile(r'[ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ི ུ ེ ོ][གངདནབམའརལས][དས]').findall(str)):
                    goujian_str["基字"], goujian_str["元音"], goujian_str["后加字"], goujian_str["再后加字"] = str[0], str[1], \
                                                                                                    str[
                                                                                                        2], str[3]
                elif (re.compile(r'[ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ྱ ྲ ླ ྭ][ི ུ ེ ོ][གངདནབམའརལས]').findall(str)):
                    goujian_str["基字"], goujian_str["下加字"], goujian_str["元音"], goujian_str["后加字"] = str[0], str[1], \
                                                                                                   str[
                                                                                                       2], str[3]
                elif (re.compile(r'[ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ྱ ྲ ླ ྭ][གངདནབམའརལས][དས]').findall(str)):
                    goujian_str["基字"], goujian_str["下加字"], goujian_str["后加字"], goujian_str["再后加字"] = str[0], str[1], \
                                                                                                     str[2], str[3]
                else:
                    break
            # 五个构件的识别
            elif len(str) == 5:
                if (re.compile(
                        r'[གདབམའ][རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ྱ ྲ ླ ྭ][ི ུ ེ ོ]').findall(
                    str)):
                    goujian_str["前加字"], goujian_str["上加字"], goujian_str["基字"], goujian_str["下加字"], goujian_str[
                        "元音"] = \
                        str[0], str[1], str[2], str[3], str[4]
                elif (re.compile(
                        r'[གདབམའ][རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ྱ ྲ ླ ྭ][གངདནབམའརལས]').findall(
                    str)):
                    goujian_str["前加字"], goujian_str["上加字"], goujian_str["基字"], goujian_str["下加字"], goujian_str[
                        "后加字"] = \
                        str[0], str[1], str[2], str[3], str[4]
                elif (re.compile(
                        r'[གདབམའ][རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ི ུ ེ ོ][གངདནབམའརལས]').findall(
                    str)):
                    goujian_str["前加字"], goujian_str["上加字"], goujian_str["基字"], goujian_str["元音"], goujian_str[
                        "后加字"] = \
                        str[0], str[1], str[2], str[3], str[4]
                elif (re.compile(
                        r'[གདབམའ][རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][གངདནབམའརལས][དས]').findall(
                    str)):
                    goujian_str["前加字"], goujian_str["上加字"], goujian_str["基字"], goujian_str["后加字"], goujian_str[
                        "再后加字"] = \
                        str[0], str[1], str[2], str[3], str[4]
                elif (
                        re.compile(r'[གདབམའ][ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ྱ ྲ ླ ྭ][ི ུ ེ ོ][གངདནབམའརལས]').findall(
                            str)):
                    goujian_str["前加字"], goujian_str["基字"], goujian_str["下加字"], goujian_str["元音"], goujian_str[
                        "后加字"] = \
                        str[0], str[1], str[2], str[3], str[4]
                elif (re.compile(r'[གདབམའ][ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ྱ ྲ ླ ྭ][གངདནབམའརལས][དས]').findall(str)):
                    goujian_str["前加字"], goujian_str["基字"], goujian_str["下加字"], goujian_str["后加字"], goujian_str[
                        "再后加字"] = \
                        str[0], str[1], str[2], str[3], str[4]
                elif (re.compile(r'[གདབམའ][ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ི ུ ེ ོ][གངདནབམའརལས][དས]').findall(str)):
                    goujian_str["前加字"], goujian_str["基字"], goujian_str["元音"], goujian_str["后加字"], goujian_str[
                        "再后加字"] = \
                        str[0], str[1], str[2], str[3], str[4]
                elif (re.compile(
                        r'[རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ྱ ྲ ླ ྭ][ི ུ ེ ོ][གངདནབམའརལས]').findall(
                    str)):
                    goujian_str["上加字"], goujian_str["基字"], goujian_str["下加字"], goujian_str["元音"], goujian_str[
                        "后加字"] = \
                        str[0], str[1], str[2], str[3], str[4]
                elif (re.compile(
                        r'[རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ྱ ྲ ླ ྭ][གངདནབམའརལས][དས]').findall(
                    str)):
                    goujian_str["上加字"], goujian_str["基字"], goujian_str["下加字"], goujian_str["后加字"], goujian_str[
                        "再后加字"] = \
                        str[0], str[1], str[2], str[3], str[4]
                elif (re.compile(
                        r'[རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ི ུ ེ ོ][གངདནབམའརལས][དས]').findall(
                    str)):
                    goujian_str["上加字"], goujian_str["基字"], goujian_str["元音"], goujian_str["后加字"], goujian_str[
                        "再后加字"] = \
                        str[0], str[1], str[2], str[3], str[4]
                elif (
                        re.compile(r'[ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ྱ ྲ ླ ྭ][ི ུ ེ ོ][གངདནབམའརལས][དས]').findall(str)):
                    goujian_str["基字"], goujian_str["下加字"], goujian_str["元音"], goujian_str["后加字"], goujian_str[
                        "再后加字"] = \
                        str[0], str[1], str[2], str[3], str[4]
                else:
                    break
            # 六个构件识别
            elif len(str) == 6:
                if (re.compile(
                        r'[གདབམའ][རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ྱ ྲ ླ ྭ][ི ུ ེ ོ][གངདནབམའརལས]').findall(
                    str)):
                    goujian_str["前加字"], goujian_str["上加字"], goujian_str["基字"], goujian_str["下加字"], goujian_str[
                        "元音"], \
                    goujian_str["后加字"] = str[0], str[1], str[2], str[3], str[4], str[5]
                elif (
                        re.compile(
                            r'[གདབམའ][ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཞཟའཡརལཤསཧཨ][ྱ ྲ ླ ྭ][ི ུ ེ ོ][གངདནབམའརལས][དས]').findall(
                            str)):
                    goujian_str["前加字"], goujian_str["基字"], goujian_str["下加字"], goujian_str["元音"], goujian_str[
                        "后加字"], \
                    goujian_str["再后加字"] = str[0], str[1], str[2], str[3], str[4], str[5]
                elif (re.compile(
                        r'[གདབམའ][རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ི ུ ེ ོ][གངདནབམའརལས][དས]').findall(
                    str)):
                    goujian_str["前加字"], goujian_str["上加字"], goujian_str["基字"], goujian_str["元音"], goujian_str[
                        "后加字"], \
                    goujian_str["再后加字"] = str[0], str[1], str[2], str[3], str[4], str[5]
                elif (re.compile(
                        r'[གདབམའ][རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ྱ ྲ ླ ྭ][གངདནབམའརལས][དས]').findall(
                    str)):
                    goujian_str["前加字"], goujian_str["上加字"], goujian_str["基字"], goujian_str["下加字"], goujian_str[
                        "后加字"], \
                    goujian_str["再后加字"] = str[0], str[1], str[2], str[3], str[4], str[5]
                elif (re.compile(
                        r'[རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ྱ ྲ ླ ྭ][ི ུ ེ ོ][གངདནབམའརལས][དས]').findall(
                    str)):
                    goujian_str["上加字"], goujian_str["基字"], goujian_str["下加字"], goujian_str["元音"], goujian_str[
                        "后加字"], \
                    goujian_str["再后加字"] = str[0], str[1], str[2], str[3], str[4], str[5]
            # 七个构件识别
            else:
                if (re.compile(
                        r'[གདབམའ][རལས][ྐ ྑ ྒ ྔ ྕ ྖ ྗ ྙ ྟ ྠ ྡ ྣ ྤ ྥ ྦ ྨ ྩ ྪ ྫ ླྦ ྮ ྯ ྰ ྴ ྶ ྷ ྸ][ྱ ྲ ླ ྭ][ི ུ ེ ོ][གངདནབམའརལས][དས]').findall(
                    str)):
                    goujian_str["前加字"], goujian_str["上加字"], goujian_str["基字"], goujian_str["下加字"], goujian_str[
                        "元音"], \
                    goujian_str["后加字"], goujian_str["再后加字"] = str[0], str[1], str[2], str[3], str[4], str[5], str[6]
                else:
                    break
        print(goujian_str)
    else:
        print("输入有误请重新输入")


if __name__ == '__main__':
    goujian_fenlei()

1:部分结果的输出

{'原字': 'ཀ', '前加字': None, '上加字': None, '基字': 'ཀ', '下加字': None, '再下加字': None, '元音': None, '后加字': None, '再后加字': None}
{'原字': 'དས', '前加字': None, '上加字': None, '基字': 'ད', '下加字': None, '再下加字': None, '元音': None, '后加字': 'ས', '再后加字': None}
{'原字': 'རྒ', '前加字': None, '上加字': 'ར', '基字': 'ྒ', '下加字': None, '再下加字': None, '元音': None, '后加字': None, '再后加字': None}
{'原字': 'ནར', '前加字': None, '上加字': None, '基字': 'ན', '下加字': None, '再下加字': None, '元音': None, '后加字': 'ར', '再后加字': None}
{'原字': 'གྱ', '前加字': None, '上加字': None, '基字': 'ག', '下加字': 'ྱ', '再下加字': None, '元音': None, '后加字': None, '再后加字': None}
{'原字': 'སེམ', '前加字': None, '上加字': None, '基字': 'ས', '下加字': None, '再下加字': None, '元音': 'ེ', '后加字': 'མ', '再后加字': None}
{'原字': 'གངས', '前加字': None, '上加字': None, '基字': 'ག', '下加字': None, '再下加字': None, '元音': None, '后加字': 'ང', '再后加字': 'ས'}
{'原字': 'གགས', '前加字': None, '上加字': None, '基字': 'ག', '下加字': None, '再下加字': None, '元音': None, '后加字': 'ག', '再后加字': 'ས'}
{'原字': 'རྒང', '前加字': None, '上加字': 'ར', '基字': 'ྒ', '下加字': None, '再下加字': None, '元音': None, '后加字': 'ང', '再后加字': None}
{'原字': 'བསམ', '前加字': 'བ', '上加字': None, '基字': 'ས', '下加字': None, '再下加字': None, '元音': None, '后加字': 'མ', '再后加字': None}
{'原字': 'རྒྱ', '前加字': None, '上加字': 'ར', '基字': 'ྒ', '下加字': 'ྱ', '再下加字': None, '元音': None, '后加字': None, '再后加字': None}
{'原字': 'བརྒ', '前加字': 'བ', '上加字': 'ར', '基字': 'ྒ', '下加字': None, '再下加字': None, '元音': None, '后加字': None, '再后加字': None}
{'原字': 'བརྒྱན', '前加字': 'བ', '上加字': 'ར', '基字': 'ྒ', '下加字': 'ྱ', '再下加字': None, '元音': None, '后加字': 'ན', '再后加字': None}
{'原字': 'བསྒྲིགས', '前加字': 'བ', '上加字': 'ས', '基字': 'ྒ', '下加字': 'ྲ', '再下加字': None, '元音': 'ི', '后加字': 'ག', '再后加字': 'ས'}
{'原字': 'སེམས', '前加字': None, '上加字': None, '基字': 'ས', '下加字': None, '再下加字': None, '元音': 'ེ', '后加字': 'མ', '再后加字': 'ས'}
{'原字': 'གོངས', '前加字': None, '上加字': None, '基字': 'ག', '下加字': None, '再下加字': None, '元音': 'ོ', '后加字': 'ང', '再后加字': 'ས'}
{'原字': 'བསྕོལ', '前加字': 'བ', '上加字': 'ས', '基字': 'ྕ', '下加字': None, '再下加字': None, '元音': 'ོ', '后加字': 'ལ', '再后加字': None}
{'原字': 'ཟླུམ', '前加字': None, '上加字': None, '基字': 'ཟ', '下加字': 'ླ', '再下加字': None, '元音': 'ུ', '后加字': 'མ', '再后加字': None}
{'原字': 'སྨྱོན', '前加字': None, '上加字': 'ས', '基字': 'ྨ', '下加字': 'ྱ', '再下加字': None, '元音': 'ོ', '后加字': 'ན', '再后加字': None}
{'原字': 'ཕྱྭ', '前加字': None, '上加字': None, '基字': 'ཕ', '下加字': 'ྱ', '再下加字': 'ྭ', '元音': None, '后加字': None, '再后加字': None}
{'原字': 'གྲྭ', '前加字': None, '上加字': None, '基字': 'ག', '下加字': 'ྲ', '再下加字': 'ྭ', '元音': None, '后加字': None, '再后加字': None}

2:基于规则

        输出的结果保存到csv文件当中。

# 白玛旺久Python编程库
# @TIME:      12:49
# @FILE:      diejia_csv.py
import csv


def cut(tibetan):
    tibetan_len = len(tibetan)
    tibetan_att = {'原字': tibetan, '前加字': None, '上加字': None, '基字': None, '下加字': None,
                   '再下加字': None, '元音': None, '后加字': None, '再后加字': None}
    # 判断叠字,元音
    tibetan_pile = []
    first = True
    i = 0
    while i < tibetan_len:
        if u'\u0F40' <= tibetan[i] < u'\u0F6D':  # 除叠字、元音外的普通字
            if first is not True:
                tibetan_att['后加字'] = tibetan[i]
                i += 1
                if i < tibetan_len:
                    tibetan_att['再后加字'] = tibetan[i]
                else:
                    break
        elif u'\u0F8D' <= tibetan[i] < u'\u0FBD':  # 叠字
            if first:  # 遇到第一个叠字
                if i == 2:
                    tibetan_att['前加字'] = tibetan[0]
                tibetan_pile.append(tibetan[i - 1])
                first = False
                tibetan_pile.append(tibetan[i])
            else:  # 除第一个叠字之外其他叠字
                tibetan_pile.append(tibetan[i])
        else:  # 元音
            tibetan_att['元音'] = tibetan[i]
            if first is True:  # 元音无叠字
                tibetan_att['基字'] = tibetan[i - 1]
                if i == 2:
                    tibetan_att['前加字'] = tibetan[0]
            first = False
            # 元音有无叠字都要处理
            i += 1
            if i < tibetan_len:
                tibetan_att['后加字'] = tibetan[i]
            else:
                break
            i += 1
            if i < tibetan_len:
                tibetan_att['再后加字'] = tibetan[i]
            else:
                break
        i += 1
    # 判断叠字
    if tibetan_pile:
        if len(tibetan_pile) == 2:
            if tibetan_pile[1] in ['ྱ', 'ྲ', 'ྭ', 'ླ']:
                tibetan_att['基字'], tibetan_att['下加字'] = tibetan_pile[0], tibetan_pile[1]
            else:
                tibetan_att['上加字'], tibetan_att['基字'] = tibetan_pile[0], tibetan_pile[1]
        else:
            if ''.join(tibetan_pile) in ['ཕྱྭ', 'གྲྭ']:
                tibetan_att['基字'], tibetan_att['下加字'], tibetan_att['再下加字'] = \
                    tibetan_pile[0], tibetan_pile[1], tibetan_pile[2]
            else:
                tibetan_att['上加字'], tibetan_att['基字'], tibetan_att['下加字'] = \
                    tibetan_pile[0], tibetan_pile[1], tibetan_pile[2]
    # 判断无叠字无元音(长度5,6,7一定有元音,叠字)
    if first is True:
        if tibetan_len == 4:
            tibetan_att['前加字'], tibetan_att['基字'], tibetan_att['后加字'], tibetan_att['再后加字'] \
                = tibetan[0], tibetan[1], tibetan[2], tibetan[3]
        elif tibetan_len == 2:
            tibetan_att['基字'], tibetan_att['后加字'] = tibetan[0], tibetan[1]
        elif tibetan_len == 1:
            tibetan_att['基字'] = tibetan
        else:  # 长度为3
            if (tibetan[0] in ['ག', 'ད', 'བ', 'མ', 'འ']) and \
                    (tibetan not in ['བགས', 'མབས', 'གགས', 'བངས', 'དངས', 'གངས', 'འངས',
                                     'གམས', 'མམས', 'བབས', 'མངས', 'གབས', 'བམས', 'འམམ']):
                tibetan_att['前加字'], tibetan_att['基字'], tibetan_att['后加字'] = \
                    tibetan[0], tibetan[1], tibetan[2]
            else:
                tibetan_att['基字'], tibetan_att['后加字'], tibetan_att['再后加字'] = \
                    tibetan[0], tibetan[1], tibetan[2]
    return tibetan_att


# 分类完的数据保存到csv文件里
def fun(datas):
    header = ['原字', '前加字', '上加字', '基字', '下加字', '再下加字', '元音', '后加字', '再后加字']  # 数据列名
    data = datas  # 字典数据
    with open('存储csv文件路径', 'a', newline='', encoding='utf-16') as f:
        writer = csv.DictWriter(f, fieldnames=header)  # 提前预览列名,当下面代码写入数据时,会将其一一对应。
        writer.writeheader()  # 写入列名
        writer.writerows(data)  # 写入数据


def tongji_Tibet_str():
    pass


if __name__ == '__main__':
    all_tivet = []
    with open("读取全藏字文件的路径", 'r', encoding='utf-16') as ff:
        for a in list(i.strip() for i in ff.readlines()):
            print(cut(a))  # 打印控制台
            all_tivet.append(cut(a))
    fun(all_tivet)  # 保存到csv文件里

1:部分识别结果的保存

原字

前加字

上加字

基字

下加字

再下加字

元音

后加字

再后加字

NULL

NULL

NULL

NULL

NULL

NULL

NULL

ནར

NULL

NULL

NULL

NULL

NULL

NULL

གྱ

NULL

NULL

NULL

NULL

NULL

NULL

སེམ

NULL

NULL

NULL

NULL

NULL

གངས

NULL

NULL

NULL

NULL

NULL

རྒང

NULL

NULL

NULL

NULL

NULL

རྒྱ

NULL

NULL

NULL

NULL

NULL

བརྒ

NULL

NULL

NULL

NULL

NULL

བརྒྱན

NULL

NULL

NULL

NULL

བསྒྲིགས

NULL

བསྕོལ

NULL

NULL

NULL

སྨྱོན

NULL

NULL

NULL

ཕྱྭ

NULL

NULL

NULL

NULL

NULL

གྲྭ

NULL

NULL

NULL

NULL

NULL


3:总结

        本章涉及的所有现代藏字结构识别结合藏文本身的文法规则进行程序设计。

        

好的,我可以为您编写这个程序。以下是Java代码示例: ```java import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class TibetanSyllableRecognition { public static void main(String[] args) { Map<String, Integer> syllableCountMap = new HashMap<>(); // 用于统计每个构件字符出现的次数 Scanner scanner = new Scanner(System.in); System.out.print("请输入藏文:"); String tibetan = scanner.nextLine(); int length = tibetan.length(); for (int i = 0; i < length; i++) { StringBuilder syllable = new StringBuilder(); char currentChar = tibetan.charAt(i); syllable.append(currentChar); if (isTibetanSyllable(currentChar)) { // 如果当前字符是一个藏文构件字符 if (i + 1 < length && isTibetanSyllable(tibetan.charAt(i + 1))) { // 如果后续字符也是一个藏文构件字符 syllable.append(tibetan.charAt(i + 1)); i++; } String syllableStr = syllable.toString(); syllableCountMap.put(syllableStr, syllableCountMap.getOrDefault(syllableStr, 0) + 1); // 统计该构件字符出现的次数 } } System.out.println("每个构件字符出现的次数如下:"); for (String syllable : syllableCountMap.keySet()) { System.out.println(syllable + ": " + syllableCountMap.get(syllable)); } } private static boolean isTibetanSyllable(char c) { return c >= 0x0F00 && c <= 0x0FFF; // 藏文构件字符的Unicode编码范围 } } ``` 该程序会读取用户输入的藏文,并使用藏文音节构件识别算法识别每个构件字符,最终统计每个构件字符出现的次数并输出。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BaiMaWang7iu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值