Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

ⵙⵓはじめに

ハードコア抽象文學者の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]
kammultica
ハードコア抽象文學者。 目下、人工言語の開発にあたっております。 [Twitter] https://twitter.com/kammulticae
https://spinaltox.org
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした