Wednesday, January 2, 2013

マルコフ行列の中の著者達 Part 2 (11): 付録


付録 A: Unicode and Python 2.7.x


今回 Python 2 にて Unicode の処理をする必要が生じた.これは日本語の Web page やドイツ語の Web page の処理のためである.実際には英語の Web pageにも accent のある文字が出現することがあるので,Unicode は避けて通れなかった.プログラムの開発中に,UnicodeDecodeError と UnicodeEncodeError というexception に悩まされたので,これを解説しておく.

How the Unicode encodes characters?


Unicode は私の理解するところ,2つの map を使う coding system である.これはどのようにこの体系を理解するかにもよる.私はこの調査をするまではこのことを知らなかったので UTF-8 などという coding system があると誤解していた.UTF-8 というのは Unicode をどのように codeするのかという mapping の手法の一つであって,Unicode そのものではない.

  • Unicode: a map from characters to code (numbers)
  • UTF-X:   a map from Unicode encoded data to a specific data

Unicode そのものは code point と呼ばれる番号と文字の Description の単一のmapである.たとえば. 0x0061 'a'; LATIN SMALL LETTER A である.ここで0x0061 という数字が code point である.これが font に map されると,図形としての文字が表示される.図形としての文字は glyph と呼ばれる.Unicodeのmap は bijection であるので,文字 a は code point 0x0061 へmap されるとも言える.

この code point が Unicode,つまりある数を特定の文字への code している.しかし通常この Unicode の code point は使われない.通常使われないという意味は,テキストファイルにこの番号が save されることはまずないということである.通常もう一つの map,Unicode Transformation Format (UTF)が使われる.UTF-8, UTF-16 と endian information などが存在する.実際にはこのtransformation format に encode されたバイト列がファイルに save される.私はこのような用法が一般なので Unicode は Uni の code ではないと考えていた.Unicode の coding そのものは唯一であるが,それを実際に使う時のmapping が複数あるという意味では Uni ではない.したがって,Unicode はUni な code であるが,UTF-8, UTF-16 などは複数ある mapping の一つである.これは Unicode をそのまま使った場合に英語の Text などのサイズが増大する問題を避けるために生じた問題である.

これらの知識は [2] によった.

Python 2.7.x's Unicode representation


Python 2.x において文字列を表現するデータ型としては str 型と unicode 型がある.str 型は 8-bit の任意のデータ保持できるが,より ASCII の処理に適している.それぞれのデータ型は異なる encode への変換が可能である [2].

では,結局ほとんど同じであるのならば,文字列という一つのコンセプトを表現するために,なぜ違うデータ型が存在するのであろうか.これはおそらく歴史的な理由で,初期の python は Unicode のサポートをしていなかったため,2つのデータ型ができてしまったようである.実際,Python 3 では str 型が Unicodeを直接内部で利用可能なために,この違いはなくなっているようである.

Python 2.7 ではしかし,これが print (stream) に渡る時に問題を引き起こすことがある.Python 2.7.xにおける encode とdecode, そして文字型間の関係を図 8に示す.

Figure 8: Relationship between Unicode type and 8-bit str type in Python 2.7.x.
Python 2.7.x の unicode 型には encode method があり,str 型には decodemethod がある.これによって相互の変換が可能であるが,encode 手法によっては exception が発生する.encode 時に起きる exception がUnicodeEncodeError であり,decode 時に起きる exception がUnicodeDecodeError である.なかなかややこしい.例によって説明しよう.

まずは unicode 型の文字列を定義する.

uc = u'Wächter'
print type(uc)
-> <type 'unicode'>

これを utf-8 で str 型に encode する.

s = uc.encode('utf-8', 'ignore')
print type(s)
-> <type 'str'>

print statement は str をとるので,unicode 型が与えられると encode が呼ばれる.

print uc
-> UnicodeEncodeError: 'ascii'
codec can't encode character
u'\xe4' in position 1: ordinal
not in range(128)
uc には ascii に encode できない文字が含まれているので,error が発生した.ここで発生した error は encode の error であることに注意すること.

しかし,error を無視するように指定して encode を行えばこれは機能する.

print uc.encode('utf-8', 'ignore')
-> 'Wächter'

複雑な case としては,encode された str 型がまた decode される場合がある.

print u'{0}'.format(uc.encode('utf-8', 'ignore'))
-> UnicodeDecodeError: 'ascii'
codec can't decode byte 0xc3 in
position 1: ordinal not in
range(128)

ここでは format が str 型をとったが,それが unicode 型に対するものであったので,decode が呼ばれた.しかし,そこには decode の 'ascii' が扱えない文字が入っていたため exception が発生した.ここでは encode exceptionではないことに注意されたい.したがって,次のように最後に encode する場合にはこれは機能する.

print u'\{0\}'.format(uc).
encode('utf-8', 'ignore')
-> Wächter

付録 B: Contribution to Wikipedia


今回の実験の副作用として Wikipedia にある List の間違いが判明したので,これを修正し,Wikipedia への貢献を行なった.

今回の実験では隣接行列を生成し,eigenanalysis を用いてその行列を解析した.eigenanalysis では matrix の basis が独立していることが望ましい.しかし,今回のような matrix では一般には full rank のmatrix は望めない.たとえば,著者へのリンクのない著者の Page やリンクが張られていない page, root nodeからの同じpage への linkなどの間違いが避けられないからである.PageRank アルゴリズムはこれに対処する方法が組込まれているが,root node のリンクの間違いは簡単に修正できるので,ここではduplicated link の check を行い,それを除いた.

Duplicated link は間違いもあるが,Pseudonym が link されている場合もあるので目視でそのチェックを行なった.

Wikipedia への貢献が行えたことは個人的に嬉しい.


参考文献

[2] Python documentation 2.7.3, Unicode HOWTO http://docs.python.org/2/howto/unicode.html

マルコフ行列の中の著者達 Part 2 (10): どの著者がもっとも人々に影響を与えたのか? 実験編


結論

どの著者が Literature に影響を及ぼしているかを調べるため,Wikipedia のlink 構造を抽出し,それに PageRank アルゴリズムを適用した.その結果は表に示した通りである.また異なる言語の Wikipedia のデータを同じカテゴリ(今回の例では著者)に関して適用することで,各言語の Wikipedia 間の違いを見ることができた.

個人的に面白いなと思ったのは,たとえばイギリスの著作家に Winston Churchil や Issac Newton が入っていることである.今回始めて Winston Churchil はノーベル文学賞受賞者であることを知った.

Computational Literature


私は最近,言語や文学を理解するために,情報科学あるいは数学的なアプローチを用いている.Bren'e Brown は彼女の TED talk で ``Maybe stories arejust data with a soul.'' と述べた.もしかしたらそうかもしれないと思う.ただし,私は soul が data にかすかな影を落としているように思えてならない.もちろん,現状ではこの影から soul を再構成することなど到底できそうにない.それでも,すばらしい作品は私の心を動かす.本を読むというのは,ある意味,ただ単なるデータ,シンボルの列,を読んでいるだけなのに,感動が起こることは確かにある.私はこの魂の影がデータの中にあるのではないかと思って,このようなアプローチを試してみることがある.今回の著者の文学界への影響というものも,その一種の試みである.私はこのアプローチを何と呼んで良いのかわからないのだが,他に良い名前を思いつくまで仮に,これを計算機を用いた文学へのアプローチという意味で, Computational literature と呼んでいる.

Future work


議論で述べたこと含めてまとめておく.


  • Wikipedia の著者による bias はあるのか
  • どのように自動でデータを取得するか.カテゴリの問題を避ける方法はあるか.
  • PageRank 以外のグラフ構造解析アルゴリズムを用いてはどうか.
  • Marix が full rank でないことなど,ネットワーク構造をさらに数学的に調べたら面白いかもしれない.
  • 他の言語の Wikipedia で他の言語の著者に関しても興味がある.
  • この手法は著者に限ったことではないので,音楽家や政治家など興味ある対象があれば調べてみたい.


二部に渡る長い話におつきあい下さった方,どうもありがとうございます.この話はあと一回,Python の Unicode 処理についての付録で終わりたいと思います.

謝辞

英語と内容の両者に関してアドバイスを下さった Andy K., 昼食時にこの趣味のProject に様々なヒントを与えてくれた友人達,そしてこの Project のきっかけとなった質問をしてくれた Rebecca M. に感謝する.

マルコフ行列の中の著者達 Part 2 (9): どの著者がもっとも人々に影響を与えたのか? 実験編


今回も結果に関する議論の続きである.

No link found problem

ドイツ語の Wikipedia での日本の作家には人物の Link 切れの問題が印象として残った.これは数を調べたわけではなく,調査中に見うけた問題である.伸ばす音の人物のリンクが切れていることが多いという印象を持った.たとえば,良寛(Ryōkan)に言及している page がリンクのキーを Ryokan にしたり,漱石(Sōseki)に言及している page が Soseki にリンクを張ったりしているため,リンク先の page が見つからない.このような伸ばす音のある作家へのリンク切れが目についた.

Cross reference between Wikipedia


ドイツ語と英語の Wikipedia では,同じ Latin 文字の表示を用いているため,cross reference を作成することが容易であった.しかし,日本語はイギリスの著作家であってもキーとして日本語の文字を利用しているため,Crossreference をプログラムで作成するには,日本語から英語への変換の map が必要である.これを正しく作成することは手間がかかるので,今回は見送った.

Correlating with other data


友人と議論しているうちに,今回の結果と他のデータとの組合せをみたい項目がいくつかでてきた.


  • Nobel prize winner と Pagerank の結果の関係
  • Wikipedia の著者と Pagerank の結果の関係.特に Wikipedia の著者による bias というものがあるのかどうかに興味がある.


Johann Wolfgang von Goethe is 10th in Japanese Wiki


Johann Wolfgang von Goethe が日本語の Wiki では10 位と意外な低さだったことである.しかし,日本語の ドイツ文学に関するPage でネットワークを構成するページはわずか 31 ページしかないので,わずかなページが強い影響を示す可能性がある.ちなみに日本語の Wiki でのドイツ文学者の一位は Gerhart Hauptmannである.

長かったこのテーマも終わりに近付いてきたようだ.次回は結論を述べよう.

マルコフ行列の中の著者達 Part 2 (8): どの著者がもっとも人々に影響を与えたのか? 実験編


Wikipedia's Category problem

ここで言うカテゴリ問題とは,期待した人物が Wikipedia によっては異なるカテゴリに属しており,データの取得に失敗している問題である.以下のsubsection で示すような問題が判明した.これらに関しては何の処理もしていないので,たとえば,「Shakespeare が日本の Wikipedia 解析の結果では英国の文学者としては存在しない」というような問題でもそのまま結果に示した.

私は趣味でこのような調査をしているため,データの取得はできる限り自動で行いたい.そのため,今後どうやって自動でデータを取得するかは課題として残った.

No Shakespeare in Japanese Wikipedia result


Shakespeare はドイツ語,英語共に英国の著者としては一位であったが,日本語の Wikipedia の結果には Shakespeare が存在しない.調べた所,日本語のWikipedia では Shakespeare というカテゴリが存在し,イギリスの著作者に分類されていない.そのため,今回のようにroot page を指定した方法ではこれらの作家は存在しないことになってしまった.

図 7 にこの Page を示す.

Figure 7: The category of English authors page in ja.wikipedia.org as of 2012-11-19.


  • イギリスの小説家のカテゴリ
  • ハーバート・ジョージ・ウェルズ
  • シェイクスピア
  • ジョージ・バーナード・ショウ
  • ジョージ・ゴードン・バイロン
  • ウィリアム・ブレイク
  • オスカー・ワイルド

これらが同列の階層に位置するため,ウェルズ,シェイクスピア,ショウ,バイロン,ブレイク,ワイルドはイギリスの小説家に分類されていない.これは日本語の Wikipedia 固有の問題であり,他の言語の Wikipedia にはない問題である.(ここで問題というのは,我々が「イギリスの小説家一覧」という一覧にこれらの人物も入っていると仮定したことから生じる.我々は実験を始める前にこの仮定は妥当だと考えた.)

No Shiki Masaoka in the Japanese Wikipedia result


日本語 Wikipedia では正岡子規が存在していない.調べたところ,正岡子規は日本の歌人俳人のカテゴリに属し,日本の著作家のカテゴリには属していなかった.したがって,日本の歌人俳人は今回の調査では漏れている.これは英語とドイツ語の Wikipedia の両者で正岡子規が top に rank されたにもかかわらず,日本語の Wikipedia の結果に現れなかったので気がついた.他の言語とのWikipedia の結果との比較が有効であった例の一つである.

Not available in other Wikipedia problem


Wikipedia によっては国による著者の分類をしていないものがある.ドイツ語のWikipediaには British の著作者があるが,英語の Wikipedia では英語の作家というカテゴリなので,アメリカやオーストラリアの作家も含まれてしまい,結果,ずいぶん異なるリストの比較になってしまう.比較を困難にするもう一つの要素は,言語による作家のリストの充実度の違いである.たとえば,ドイツ語の Wikipedia には 5975 人ものドイツ語の著作家がリストされているが,一方,日本語の Wikipedia にはドイツ語の著者としてリストされているのは 136 人である.

表 7, 8 には Wikipedia 間の結果の相互比較があるが,この表に n.a. として示されるものがこの問題の存在を示している.表 8 には 40 人中 16 人もの n.a. がある.つまり,これらはドイツ語の Wikipedia の英国の作家には分類されているが,英語の Wikipedia では存在しないか,英語の作家には分類されていない.

その他にも興味深いと思われる問題があったので次回ももう少し議論を続ける.