UTF-8
unicode
Python3
漢字
人工言語

[Unicode] 部首⇄CJK統合漢字10進値の相互呼び出しをやってみた

ⵙⵓはじめに

ハードコア抽象文學者のkammulticaです.
現在,人工言語を開発しております.中間生成物を上げていきます.

使用言語:Python 3.6.5
最終目的:人工言語の運転
※人工言語自体のコンセプトはブログ,根本のコンセプトは自サイト参照のこと.


ⵞⵓ部首空間

前回は下準備として,部首名を変数名として,対応するCJK統合漢字の10進数値を要素として配列を作成しました.今回は,これらを辞書型にする部首空間の作成をおこないます.(本稿における「部首空間」とは,キーとして部首名(一, 丨, 丶……)を,要素として当該部首中のCJK統合漢字群をもつ辞書を指します)

まずは前回の配列群を2次元配列にまとめます.これは部首空間の要素となります.

部首 = [, , , 丿, , , , , , , , , , , , , , , , , , , , ,,\
       , , , , , , , , , , , , , , , , , , , , , , , , ,\
       , , 广, , , , , , , , , , , , , , , , , , , , , , ,\
       , , , , , , , , , , , , , , , , , , , , , , , , ,\
       , , , , , , , , , , , , , , , , , , , , , , , , ,\
       , , , , , , , , , , , , , , , , , , , , , , , , ,\
       , , , , , , , , , , , , , , , , , , , , , , , , ,\
       , , , , , , , , , , , , , , , , , , , , , , 鹿, , ,\
       , , , , , , , , , , , , , , ]

次に,キー値となる部首名を文字列の配列で定義します.

部首名 = ['一', '丨', '丶', '丿', '乙', '亅', '二', '亠', '人', '儿', '入', '八', '冂', '冖', '冫', '几',\
         '凵', '刀', '力', '勹', '匕', '匚', '匸', '十', '卜', '卩', '厂', '厶', '又', '口', '囗', '土',\
         '士', '夂', '夊', '夕', '大', '女', '子', '宀', '寸', '小', '尢', '尸', '屮', '山', '巛', '工',\
         '己', '巾', '干', '幺', '广', '廴', '廾', '弋', '弓', '彐', '彡', '彳', '心', '戈', '戶', '手',\
         '支', '攴', '文', '斗', '斤', '方', '无', '日', '曰', '月', '木', '欠', '止', '歹', '殳', '毋',\
         '比', '毛', '氏', '气', '水', '火', '爪', '父', '爻', '爿', '片', '牙', '牛', '犬', '玄', '玉',\
         '瓜', '瓦', '甘', '生', '用', '田', '疋', '疒', '癶', '白', '皮', '皿', '目', '矛', '矢', '石',\
         '示', '禸', '禾', '穴', '立', '竹', '米', '糸', '缶', '网', '羊', '羽', '老', '而', '耒', '耳',\
         '聿', '肉', '臣', '自', '至', '臼', '舌', '舛', '舟', '艮', '色', '艸', '虍', '虫', '血', '行',\
         '衣', '襾', '見', '角', '言', '谷', '豆', '豕', '豸', '貝', '赤', '走', '足', '身', '車', '辛',\
         '辰', '辵', '邑', '酉', '釆', '里', '金', '長', '門', '阜', '隶', '隹', '雨', '靑', '非', '面',\
         '革', '韋', '韭', '音', '頁', '風', '飛', '食', '首', '香', '馬', '骨', '高', '髟', '鬥', '鬯',\
         '鬲', '鬼', '魚', '鳥', '鹵', '鹿', '麥', '麻', '黃', '黍', '黑', '黹', '黽', '鼎', '鼓', '鼠',\
         '鼻', '齊', '齒', '龍', '龜', '龠', '他']

上2つの配列より,以下のように部首空間が定義できます.

部首空間 = dict(zip(部首名, 部首))

''' print(部首空間)
{'一': [19968, 19969, 19970, 19971, 19972, 19973, 19974, 19975, 19976, 19977,
19978, 19979, 19980, 19981, 19982, 19983, 19984, 19985, 19986, 19987, 19988, 
19989, 19990, 19991, 19992, 19993, 19994, 19995, 19996, 19997, 19998, 19999, 
20000, 20001, 20002, 20003, 20004, 20005, 20006, 20007], '丨': [20008, 20009, 
20010, 20011, 20012, 20013, 20014, 20015, 20016, 20017, 20018, 20019, 20020, 
20021], '丶': [20022, 20023, 20024, 20025, 20026, 20027, 20028, 20029, 20030],
……
'''

以上の定義から,任意の部首をもつ漢字を呼び出すことが可能になりました.続いて,任意の漢字(10進値)から部首を割り出す,いわゆる「逆引き」の関数を定義します.

def 部首検索(self, number): # 10進数値入力 → 当該部首
        for 配列取出 in 部首空間.values():
            if(number in 配列取出):
                for name, group in 部首空間.items():
                    if group == 配列取出:
                        return name
                        break
                else: # 内部ループでbreakされないかぎり続行。高速動作してる...はず。
                    continue
                break

ⵒⵓ蛇足

逆引きに関して,下のような方法で検索することもできます.が,固有の漢字に対応する部首(キー値)は1つだけであるため,計算時間で劣ります.とはいえ,応用の余地があるため残しておきます.

[key for key, values in 部首空間.items() if 30866 in values][0]