一部の入力情報でやってみる
被覆空間とは,定義,複合,被覆空間,ハウスドルフ空間,弧状連結,局所弧状連結 被覆,登録,用語,-,被覆 空間,登録,用語,-,空間 被覆空間,登録,複合用語,-,被覆空間 被覆空間,定義,複合用語,被覆,被覆空間 被覆空間,定義,複合用語,空間,被覆空間 位相,登録,用語,-,位相 位相空間,登録,複合用語,-,位相空間 位相空間,定義,複合用語,位相,位相空間 位相空間,定義,複合用語,空間,位相空間 ハウスドルフ,登録,固有名詞,-,ハウスドルフ ハウスドルフ空間,定義,複合用語,ハウスドルフ,ハウスドルフ空間 ハウスドルフ空間,定義,複合用語,空間,ハウスドルフ空間 ハウスドルフ空間は位相空間の一つ,包含,-,位相空間,ハウスドルフ空間 弧,登録,用語,-,弧 連結,登録,用語,-,連結 弧状連結,定義,複合用語,弧,弧状連結 弧状連結,定義,複合用語,連結,弧状連結 局所,登録,用語,-,局所 局所弧状連結,定義,複合用語,局所,局所弧状連結 局所弧状連結,定義,複合用語,弧状連結,局所弧状連結
infile <- read.table("input2.txt", sep = ",", fill =TRUE) # 行列の方が好きなので行列にする infile.m <- as.matrix(infile) # 1,2,3列目を分離する feature1 <- infile.m[,1] feature2 <- infile.m[,2] feature3 <- infile.m[,3] # 1,2,3列のユニークを取って、それを連番ID化する feature1.uni <- unique(feature1) feature2.uni <- unique(feature2) feature3.uni <- unique(feature3) # 連番を取り出す feature1.val <- apply(outer(feature1,feature1.uni,"=="),1,which,TRUE) feature2.val <- apply(outer(feature2,feature2.uni,"=="),1,which,TRUE) feature3.val <- apply(outer(feature3,feature3.uni,"=="),1,which,TRUE) # エッジに関係するところだけを取り出す infile.m <- infile.m[,4:length(infile.m[1,])] # ノードをユニークにする unique.word <- unique(c(infile.m)) unique.word <- unique.word[which(unique.word != "")] # ノードの名前に順序idをつける v.name <- unique.word # エッジリストを名前と順序idとで作る el.name <- el.id <- NULL # エッジの性質をfeature情報から与える el.type <- NULL # 行ごとに要素数を数えて for(i in 1:length(infile.m[,1])){ num.kids <- length(which(infile.m[i,] != ""))-1 for(j in 1:num.kids){ el.name <- rbind(el.name,c(infile.m[i,1],infile.m[i,1+j])) el.type <- c(el.type,feature2.val[i]) } } el.id <- matrix(0,length(el.name[,1]),length(el.name[1,])) for(i in 1:length(v.name)){ el.id[which(el.name == v.name[i])] <- i } library(igraph) g <- graph.empty(length(v.name), directed =TRUE) #g <- set.vertex.attribute(g, "name", value = unique.word) g <- add.edges(g, c(t(el.id))) plot(g, layout = layout.kamada.kawai(g)) # グラフを絵にするには、ノードの座標を決める必要がある # layoutはその座標を決めるルールのこと # 座標決めルールの一つkamada.kawai法を用いることとする coords <- layout.kamada.kawai(g) # グラフとして描く plot(g,layout = coords) # ノードの名前を文字列にするために別の方法をとる # ノードに色を付けよう v.col <- rep(1,length(coords[,1])) plot(coords,cex = 2, pch = 19, col = v.col) # エッジを描く # エッジにも色を付けよう #e.col <- rep(1,length(el.id[,1])) # エッジの色はfeature由来の数字とする e.col <- el.type segments(coords[el.id[,1],1],coords[el.id[,1],2],coords[el.id[,2],1],coords[el.id[,2],2], col = e.col) # 文字列を重ねる par(new =TRUE) # ノードから少しずらした位置に文字列を描かせる coords2 <- cbind(coords[,1],coords[,2]-0.1) text(coords2,unique.word,xlim = range(coords[,1]),ylim=range(coords[,2]))
人間が入力時に感じる困難について
- 用語が溜まってきて、そろそろ嫌になってくる、と友人が言った
- 僕は気にしないんだけど
- この「友人(人間)の嫌だな」という感じは何だろう?と聞いたら、次のように説明してくれた
- すべての用語を支えきれない感じ
- これ以上用語が増えると、今までと同じように用語間の関係を逐次確認できない感じ
- 「用語の全ペア」について、つなぐかつながないかの判断を保留にし続けるのがつらい感じ
- 僕にも入力時に同じような困難を感じることがあるだろうか
- 100万用語を一度に受け付けようとすると、頭が真っ白になるかもしれない
- 「じゃあ、この『嫌な感じ」には対処法を作らないといけないね」、と友人との間でコンセンサスができた
『被覆空間〜空間と群の織りなす世界』
- 文章がある
- 友人は教えてくれる
- 友人がそこから「数学的」な用語を拾って教えてくれる
- 友人がそこから「数学的」な用語を結びつける「ルール」に名前をつけて教えてくれる
- 友人がそこから「数学的」な用語の組み合わせがどの「ルール」でつながっているのかを教えてくれる
- 僕と友人は、それを僕に「入力」するのによいやり方は何かを考えるところから始める
- 言葉を拾って、ルールらしいか、用語らしいかも、初めは判然としないが、後で修正することも考慮してやってみよう
- 被覆
- 空間
- 被覆空間
- ルール:「2つの(もしくは)複数の用語を連結する。第1用語が第2用語を修飾している」
- ルール:「定義」する、という作業があるらしく、これはルールだ
- 位相
- 空間
- 位相空間
- ハウスドルフ
- 空間
- ハウスドルフ空間
- 弧
- 弧状
- 連結
- 弧状連結
- 局所
- 局所弧状連結
- ルール:「かつ」
- 全射
- 連続
- 写像
- 連続写像
- 全射連続写像
- 点
- ルール:「条件」、「条件を満たす」
- 開
- 近傍
- 開近傍
- 互いに交わらない
- 集合
- 開集合
- 集まり
- ルール:「存在する」
- ルール:「同じ」
- 相
- 同相
- 同相写像
- 被覆写像
- 被覆空間
- ファイバー
- 添字
- 添字集合
- 濃度
- 度
- 被覆度
- 概念
- 族(開集合の)
- 「覆う」
- 開被覆
初めから良い眺めを持とうとしない
- 数学の基礎として数字を学ぶとき、「自然数」という言葉を一緒に学んだわけではないんだよ、と友人が教えてくれた
- ひとつひとつ取り込んで、いつの間にか取り込んだものが根を張るようにつながりあって、その上に、それらを束ねる言葉が与えられたりしてまとまりがよくなるような感じだよ、と
- その方法で入力を受け付けてみることにする
- 今日の知識は、『数学セミナー2013年1月号』の特集「被覆のはなし」から
数学の分類
- 数学の分類はとても難しい
- こんな議論やこんな議論もある
- 難しいので、格納してから考えるのに向いている
- 僕は、まず、何かしらで知識をつけることが必要だと思うので、岩波書店基礎数学の列挙をスタート地点とすることにした
- 5分類されている名称で4分類)
- さらに細分類されていて、
- 入力ファイルを作ろう
数学分類,分岐,学問名,-,数学 数学分類,分岐,分野名,数学,代数学,解析学,幾何学,線型代数学 代数学分類,分岐,亜分野名,代数学,群論,加群,ガロア理論,ホモロジー代数,保型関数,可換環論,数論 線型代数学分類,分岐,亜分野名,線型代数学,線形空間,アフィン幾何,ジョルダン標準形,テンソル代数,二次形式,線型不等式,群の表現論 解析学分類,分岐,亜分野名,解析学,集合,位相,関数解析,解析,複素解析,確率論,現代解析,フーリエ解析,常微分方程式,偏微分方程式,楕円型方程式,非線型発展方程式,超関数論,スペクトル理論 幾何学分類,分岐,亜分野名,幾何学,微分幾何学,多様体論,位相幾何学,代数幾何学,組合せ位相幾何学,微分位相幾何学,Lie群,複素多様体論
- Rに読み込んでグラフにしてみよう
- まだまだ、チューニングが必要なのだが
infile <- read.table("input.txt", sep = ",", fill =TRUE) # 行列の方が好きなので行列にする infile.m <- as.matrix(infile) # 1,2,3列目を分離する feature1 <- infile.m[,1] feature2 <- infile.m[,2] feature3 <- infile.m[,3] # 1,2,3列のユニークを取って、それを連番ID化する feature1.uni <- unique(feature1) feature2.uni <- unique(feature2) feature3.uni <- unique(feature3) # 連番を取り出す feature1.val <- apply(outer(feature1,feature1.uni,"=="),1,which,TRUE) feature2.val <- apply(outer(feature2,feature2.uni,"=="),1,which,TRUE) feature3.val <- apply(outer(feature3,feature3.uni,"=="),1,which,TRUE) # エッジに関係するところだけを取り出す infile.m <- infile.m[,4:length(infile.m[1,])] # ノードをユニークにする unique.word <- unique(c(infile.m)) unique.word <- unique.word[which(unique.word != "")] # ノードの名前に順序idをつける v.name <- unique.word # エッジリストを名前と順序idとで作る el.name <- el.id <- NULL # エッジの性質をfeature情報から与える el.type <- NULL # 行ごとに要素数を数えて for(i in 1:length(infile.m[,1])){ num.kids <- length(which(infile.m[i,] != ""))-1 for(j in 1:num.kids){ el.name <- rbind(el.name,c(infile.m[i,1],infile.m[i,1+j])) el.type <- c(el.type,feature2.val[i]) } } el.id <- matrix(0,length(el.name[,1]),length(el.name[1,])) for(i in 1:length(v.name)){ el.id[which(el.name == v.name[i])] <- i } library(igraph) g <- graph.empty(length(v.name), directed =TRUE) #g <- set.vertex.attribute(g, "name", value = unique.word) g <- add.edges(g, c(t(el.id))) plot(g, layout = layout.kamada.kawai(g)) # グラフを絵にするには、ノードの座標を決める必要がある # layoutはその座標を決めるルールのこと # 座標決めルールの一つkamada.kawai法を用いることとする coords <- layout.kamada.kawai(g) # グラフとして描く plot(g,layout = coords) # ノードの名前を文字列にするために別の方法をとる # ノードに色を付けよう v.col <- rep(1,length(coords[,1])) plot(coords,cex = 2, pch = 19, col = v.col) # エッジを描く # エッジにも色を付けよう #e.col <- rep(1,length(el.id[,1])) # エッジの色はfeature由来の数字とする e.col <- el.type segments(coords[el.id[,1],1],coords[el.id[,1],2],coords[el.id[,2],1],coords[el.id[,2],2], col = e.col) # 文字列を重ねる par(new =TRUE) # ノードから少しずらした位置に文字列を描かせる coords2 <- cbind(coords[,1],coords[,2]-0.1) text(coords2,unique.word,xlim = range(coords[,1]),ylim=range(coords[,2]))
プリントを読み込む
- プリントはテキスト形式で電子化されている
- 電子化されていると、僕は『読む』ことができる
- ここに、参考になる『読み方』がある
- 格納するのは、すべてをID管理するためだ
- IDが必要なのは、「知識名」「知識形式」「子(本体)」「親子関係」だ
- IDはすべて「a」の「i」のように、種類(a)とその連番(i)とで管理されるべきだ
- 第1列を「知識名」ベクトルに格納しよう
- 「知識名」はその知識名で表されるサブ(ハイパー)グラフ全体である
- したがって、「知識名」に対応してグラフオブジェクトを作って保持しておくことが必要だ
- グラフはノードの集合とエッジの集合だ
- 第2列を「知識形式」ベクトルに格納しよう
- 第5以上列は「ノード」ベクトルに格納する
- 第3列は格納した「ノード属性」ベクトルに格納しよう
- ノード属性はもう少し複雑になるかもしれないので、格納の仕方を変更するかもしれないことに注意しよう
- 第4列の情報は、第5以上列との関係の情報だから、それを「エッジ情報」としよう
- エッジ情報は「親」「子」のペアだ
- エッジにも属性があるかもしれない
- 第2列の知識形式と関係するかもしれない
- エッジの属性は向きと重みが考えられる
- 向きと重み以外のエッジ属性も現れるかもしれないので、格納の仕方を変更する必要が出るかもしれないので注意しよう