提示:本文章是上一篇全藏字生成结果进行构件的识别,文章内容借鉴于藏文信息处理的原理与应用那本书。
一:问题描述
本文章是上一篇全藏字的构建进行识别,全文共输出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:总结
本章涉及的所有现代藏字结构识别结合藏文本身的文法规则进行程序设计。