iconlang – 視認性・識別性向上のための新しい表意文字体系

Language: Japanese | English

= “word” = “god” = “begin”

= “in” = “the” = “was” = “and” = “with” = “-ing”

例文:
, ,
= “In the begining was the Word, and the Word was with God, and the Word was God.”

iconlangとは何か

“iconlang”(アイコンラング) は、英語などアルファベット表記のあらゆる言語の単語を、漢字のように、幾何学的模様から成る単一の画像によって表現する新しい「表意文字」の体系で、画像でハッシュ値を表現する「identicon」をベースとしています。上記の例文では、英語の各単語(および動詞の活用語尾)をそれぞれ一枚の画像によって表現しています。これによって文字の識別性が向上し、表記スペースや認識時間も短縮するのため、訓練することにより英語(もしくは他の言語)の文を非常に高速に読むことができるようになります。

この”iconlang”という試みの背景として、コンピュータやインターネットの発展と、それに伴う文字の使用状況の変化があります。言語の「文字」というものに対する要求も変わってきていると考えています。例えば、日本語の「きれい」という単語の表記の統計を取ると、以前は画数の少ない「奇麗」が主流であったのに対し、コンピュータによる仮名漢字変換では変換のためのコストが同じなので、近年では画数が多くてもイメージを重視して「綺麗」という表記が増えてきているそうです(国立国語研究所調べ)。

極論を言うと、文字は、電子機器で入力でき、読めさえすれば、必ずしも手で書ける必要性は無いのです。紙の書籍よりも電子ブックが徐々に普及している現代においてはなおさらです。文字が白黒の線画でできている理由は、単にそれがこれまで手書きされていたというだけで、それが視認性や識別性の上で最も適切な形であるかについての議論は十分なされていません。”iconlang” は、これを実証する実験的な試みです。

例えば、道路標識に”stop” と書いてあるより、 とだけ印刷されていたほうが、(それを認識できたとすれば)視認性・識別性は高いのではないでしょうか。店が開いている(open)か閉まっている(close)かを表すのに、店の入り口にの札をかけておけば、遠くからでもわかりやすいかもしれません。”yesterday” や “tomorrow” のような長い単語も、 と書いたほうが読みやすいですし、スペースも節約できます。

iconlang の特徴

  • ラテン文字アルファベット(A-Z)から成るあらゆる単語文字列を幾何学模様に変換できるため、アルファベット表記の言語(おそらく地球上のメジャーな言語のほとんど)全てに対応が可能。
  • 視認性に優れており、白黒線画の「従来の文字」に比べて高速な識別が可能。また、審美的にも優れている。
  • 文字列から機械的に幾何学模様を生成できるため、従来のアイコンなどを使用した人工言語のように人手で語彙を考える必要がない。

そもそも identicon とは何か

“iconlang” のアイデアは、基本的に”identicon” に基づいています。”identicon” は、ハッシュ値をキルト模様の画像によって視覚的に表記するためのシステムで、以下のページで紹介されています。

Identicon

http://www.radiumsoftware.com/0702.html

“identicon” の Python 実装はここで見つけられます。PIL (Python Image Library) に依存しています。http://coderepos.org/share/browser/lang/python/misc/identicon.py

identicon の詳細

identicon のアルゴリズムでは、32ビットのハッシュ値を、下のテーブルのように、各ビット範囲の部分へと分解します。各部分はそれぞれ異なる役割を持ちます。

ビット範囲(幅) 役割
1- 2 (2) middleType
3 (1) middleInvert
4- 7 (4) cornerType
8 (1) cornerInvert
9-10 (2) cornerTurn
11-14 (4) sideType
15 (1) sideInvert
16-17 (2) sideTurn
18-22 (5) blue
23-27 (5) green
28-32 (5) red
計 32 ビット

ちなみに、上で紹介した identicon の Python 実装にはバグがあります. decode() 関数は以下のようになるべきです。

        def decode(self, code): 
             # decode the code  

            middleType  = self.MIDDLE_PATCH_SET

    middleInvert= (code >> 2) & 0x01
    cornerType = (code >> 3) & 0x0F
    cornerInvert= (code >> 7) & 0x01
    cornerTurn = (code >> 8 ) & 0x03

    sideType = (code >> 10) & 0x0F
    sideInvert = (code >> 14) & 0x01
    sideTurn = (code >> 15) & 0x03
    blue = (code >> 17) & 0x1F

    green = (code >> 22) & 0x1F
    red = (code >> 27) & 0x1F
    ...

1枚の identicon は、9つ(3 x 3)の「パッチ」から構成されます。各パッチは、三角形や四角形などの、単純な幾何学的模様によって描写されます。真ん中のパッチ “middle” は、上下左右に線対称な図形(上記 identicon 紹介ページの 1, 5, 9, 16番のパッチ)から構成され、そのタイプと色の反転は、それぞれ “middleType” と “middleInvert” のビットによって制御されます。角のパッチ “corner” と、辺の真ん中にあるパッチ “side” は、タイプ Type, 色の反転 Invert, そして回転 Turn によって制御されます。パッチ全体の色は、blue, gren, red の各ビットの値から RGB の値を計算して決定します。オリジナルの identicon の実装では、それぞれ 5 ビットによって表現されています。

iconlang の詳細

ここでは、iconlang が上記の identicon をベースとして、どのように単語に幾何学的模様を対応づけるかについて説明します。iconlang のアルゴリズムは、以下の2ステップに分けることができます。

  1. 単語からハッシュ値を計算
  2. ハッシュ値からキルト模様を生成

単語からハッシュ値の計算

iconlang が単語からハッシュ値を計算する時には、「綴りの似ている単語はハッシュ値も近くなるが、単語同士のハッシュ値が同じになるのは極力避ける」という方針に基づいています。具体的には、入力単語中の文字トライグラムに基づき、以下のステップでハッシュ値を求めています。

  1. 単語から文字ユニグラム, バイグラム, トライグラムのリストを求めます。その際には、単語の先頭および末尾にそれぞれ終端文字を追加します。例えば、”dog”という単語については、先頭・終端文字を追加し”^dog$”とした後、”d” “o” “g” “^d” “do” “og” “g$”, “^do” “dog” “og$” の、計10個の文字Nグラムを生成します。これらの文字Nグラムは、生成された順に番号がついています。
  2. それぞれの文字Nグラムについて、その「値」を求めます。これは、文字Nグラムを「28進数」(アルファベット26文字および先頭・終端文字)として計算した結果です。それぞれの文字と10進数の対応は以下の通りです。これは衝突(異なる単語のハッシュ値が同じになること、もしくは、生成されたキルト模様が同じになること)がなるべく少なくなるようにランダムにマッピングを生成した結果で、ここには改善の余地があります。

    CHAR_LOOKUP = {“k”:24, “v”:12, “w”:22, “a”:20, “l”:9, “b”:18, “m”:14, “x”:11, “y”:13, “n”:10, “c”:4, “z”:19, “o”:17, “d”:8, “$”:5, “e”:21, “p”:6, “f”:2, “q”:0, “g”:27, “r”:1, “^”:23, “h”:15, “s”:3, “t”:26, “i”:25, “j”:16, “u”:7}

  3. 生成するハッシュ値を h = 0 とします。h の 「Nグラムの値+Nグラムの番号」ビット目を反転する、という操作を、単語から生成された全てのNグラムに対して行います。「Nグラムの値+Nグラムの番号」がハッシュ幅(iconlang のハッシュ幅は、以下で説明するように、34ビットです)をオーバーした場合、34で割った余り (modulo) を使用します。この操作の後の h が最終的なハッシュ値です。

ハッシュ値からキルト模様を生成

ハッシュ値を求めた後、キルト模様を生成するアルゴリズムは、基本的には identicon と同じです。ただ、iconlang では、「文字」としての視認性を高めるために、2点の変更を加えています。一つは、角のパッチ “corner” にマスクを適用し、かならずしも点対称の模様を生成するわけではなくしたこと。もう一つは、色のビット幅を狭め、近似色による混乱を避けたことです。

iconlang の各ビットの解釈は、以下のようになります。ボールド部分が identicon との差異です。

ビット範囲(幅) 役割
1- 2 (2) middleType
3 (1) middleInvert
4- 7 (4) cornerType
8 (1) cornerInvert
9-10 (2) cornerTurn
11-14 (4) sideType
15 (1) sideInvert
16-17 (2) sideTurn
18-20 (3) blue
21-23 (3) green
24-26 (3) red
27-34 (8) corner masks
34 ビット

corner masks は、iconlang で導入された新しい要素で、8ビットからなります。各ビットは角および辺中心の合計8枚のパッチに対応しており、該当ビットが 0 であるならそのパッチは描写されません(すなわちその部分が欠ける)。

iconlang の Python 実装

上記のアルゴリズムに基づき、単語から iconlang の画像を生成する Python スクリプトを公開しています。

iconlang.py (Google Code によりホスト)

https://code.google.com/p/mhagiwara/source/browse/trunk/misc/iconlang/iconlang.py

word2code() 関数によって単語をハッシュ値に変換、そのハッシュ値から render_identicon() 関数により画像を生成しています。生成された画像は PIL の Image オブジェクトで、save() メソッドにより保存できます。

iconlang の 画像ファイル

LDV (Longman Defining Vocabulary) など重要語リストおよび頻度を考慮して選択した英語の重要語リスト 1000 に対して生成したidenticon の画像を配布しています。

iconlang の画像リスト (lilyx.net でホスト)

iconlang の画像リスト (Google Code によりホスト)

iconlang の サンプル

ここでは、iconlang のアルゴリズムによって生成された幾何学的画像の例を示しています。おおよそ、iconlang の模様には以下の特徴があります:

  • 異なる単語には異なる模様が生成される。
  • 綴りの似た単語には似た模様が生成される。
  • 綴りの複雑な長い単語には複雑な模様が生成される。

数字: =zero =one =two =three =four =five
=six =seven =eight =nine =ten

冠詞: =a =an =the

代名詞: =I =you =he =she =we =they =it

be 動詞: =be =been =am =are =is =was =were

 

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>