haskellでつくる自然言語処理ガジェット€¦ · data.listの関数...
TRANSCRIPT
Haskellでつくる自然言語処理ガジェット
次世代の自然言語処理向けプログラミング言語の勉強会
「今日のやること」
1.Haskellの紹介
2.開発(勉強)環境構築
0.勉強会の目的・方針説明
「勉強会の目的」
•「自然言語処理(文章の分析、および自由な加工)」と
•「目に見える形での具体的なHaskell製のGUIプログラム」を通して
•「Haskellっぽいこと」を勉強していきます。
内容 Haskellっぽいこと
Data.Listの関数基本文法、型、高階関数、ラムダ式、スコープ等
S式のParser作成と操作
再帰、モナド、データ型(型クラスとか)、(圏論)
GUI IORef, 並列・並行プログラミング
自然言語処理ガジェット
「勉強会の方針」
・プログラミング初心者を大事にする
・参加者が各々で何かを持ち帰る形
・プログラミング初心者が最初の言語としてもHaskellのコアな部分を学べる内容・要点のみざっくりと・知的好奇心をくすぐり、後でご自身で勉強したくなる系のをものふんわりとご紹介
みなさん、ご協力をお願いします。
初心者も経験者も(そして私自身も)勉強会に参加して何かを持ち帰る、そんな形にしたい。
・標準ライブラリ以外のライブラリは極力使わない(勉強が目的)
「Haskellて何ぞ?」
・プログラミング言語の一つ
・純粋関数型言語(強そう)Purely Functional Language
・高い抽象度(数学っぽい)
・主流言語とは異なる文化
・難しいと誤解される言語
A Bf
・高度先端分野向け言語(ポテンシャル枠)
・量子コンピューティング・ロボティクス・A.I.(後述)
Quipper(量子コンピューティング)
Yampa(ロボティクス)
「プログラミング言語いろいろ」
・Lisp、C、Haskellは先端言語
主流言語(バランスのよい言語)
・主流言語は先端言語のよいとこ取り
輸出
輸出
簡略化
・簡略化(書きやすさ)・Lisp :カッコが多すぎ・C :マシンに寄りすぎ・Haskell :文法が厳しすぎる
・Lisp :万能(真のA.I.言語、マクロ)・C :最速(マシンに近い)・Haskell :抽象度高い(関数型言語の右翼)
・概念の輸入・Lisp :ラムダ、ガベージコレクション・Haskell :参照透明、遅延評価、Fusion、型推論
簡略化
簡略化
子孫
先祖
「A.I.向け言語 Haskell」
・Haskellは純粋関数型言語
・関数が大事(数学っぽい。圏論)
・型理論(これがポイント)
・not 流行りのA.I.(機械学習)
・ロジックが扱えるA.I.
この勉強会では残念だが触れない
GPU向けライブラリ(Accelerate)の更新が止まっている。
「A.I.向け言語 Haskell」 ー型理論
・型理論(Type Theory)
・種類・分類みたいなもの(抽象化)
・型推論(型が違う、コンパイルエラー)
・型レベルでの証明 => 個々レベルでの証明
・証明
0, 2, 4, 6, … :: 偶数
1, 3, 5, 7, … :: 奇数
個々の要素 型
偶数と奇数の和は奇数
型レベルでの証明
0 + 1は奇数4 + 7は奇数
…
個々レベルでの証明
・思考の省略
・個々の証明からの開放
・より高度なレベルでの議論可能にaとbは異なるなぜなら、a : A and b : Bだから
「A.I.向け言語 Haskell」 ー抽象化の威力
・つるかめ算、植えき算
・方程式の世界
・方程式による思考の省略がもたらしたもの
・関数の概念
・変数
つるとかめが合わせて10匹います。足の数は合計28本です。つるの数は?
・解析幾何
n + m = 102 * n + 4 * m = 26
f (n, m) = N_constg (n, m) = N2_const
デメリット ー速度がまだ遅い言語 Haskell
やっぱり速いのはC,C++
ただし数学的な関数の組み合わせ
map, fold, filter, zip …
等式の変換ができるので、最適化をかけやすい
並列・並行計算に強いと言われる。ループの区別(map, fold)
が、個人的にはまだまだという印象
最適化証明の自動化(これには総当りがやれるようになる、量子コンピューティングが必要と見る)
for (int i = 0; i < imax; i++) {
arr [i] = f (arr [i]);
}
double tvar = tvar0;
for (int i = 0; i < imax; i++) {
tvar = f (arr [i], tvar);
}
arr’ = map f arr
tvar’ = foldl’ f tvar arr
並列
直列
デメリット ー記号遊び言語 Haskell
記号遊びの感がある場合がある。
抽象化によるフットワークの良さを殺しかねないくらいの記号遊び
勉強会ではこのあたりは拘泥しない予定
> pl (a,b) -> a:b:[] uncurry ((. return) . (:))
> pl a b c -> a*b+2+c ((+) .) . flip flip 2 . ((+) .) . (*)
> pl f (a,b) -> (f a, f b) (`ap` snd) . (. fst) . (flip =<< (((.) . (,)) .))
> pl f g (a,b) -> (f a, g b) flip flip snd . (ap .) . flip flip fst . ((.) .) . flip . (((.) . (,)) .)
> unpl flip flip snd . (ap .) . flip flip fst . ((.) .) . flip . (((.) . (,)) .) ( aa f -> ( p w -> ((,)) (aa (fst p)) (f w)) >>= ao -> snd >>= an -> return (ao an))
もっと型理論な言語 ーAgda
数学的な等式証明とかはAgdaとかCoqという
定理証明系言語が実は強い。
今回はAgdaの環境も構築しておく。
「他の関数型プログラミング言語との関係」
・型なしλ計算(緩い)
・単純型付けλ計算(中間)
・依存型(ガチガチ)
型理論 やれること
・メタプログラミング
・実用的プログラミング(Agdaと比較)
・数学の証明とか(A.I.とか言っているのも実はHaskellではなく
Agda)
備考
・ご先祖(1958)
・委員会の存在(良い血筋)
・Haskell拡張・インストールに
要Haskell
・構文が似てる
構文解析に強い言語 Haskell
プログラミングはS式で表現される自然言語はS式(左記)も表現される
こういうS式みたいのをHaskellだとかんたんに構文解析できる(Parsing)
右はオードリー・タンさん(台湾のIT相)Haskellを使って、Perlという言語のコンパイラを中学生の時に書いた。
(コンパイラは人間の書いたプログラムを構文解析して機械語に翻訳するもの)
"[([],ROOT) ["" [([0],S) ["" [([0,0],NP) ["" ([0,0,0],PRP) (It)]],"" [([0,1],VP) ["" ([0,1,0],VBZ) (is),"" [([0,1,1],VP) ["" ([0,1,1,0],VBN) (based),"" [([0,1,1,1],PP) ["" ([0,1,1,1,0],IN) (on),"" [([0,1,1,1,1],NP"" [([0,1,1,1,1,1],PP) ["" ([0,1,1,1,1,1,0],IN) (between),"" [([0,1,1,1,1,1,1],NP)]]]]]]]]]]],"" ([0,2],.) (.)]]]]"
(1 + (3 * 4))は、(+ 1 (* 3 4))と書ける
(f x (g y z)) みんな関数
外部ライブラリの利用
英文 日本語文
文字列
Z
外部
Haskell内部
Stanford Mecab
parser
S式形態素解析修正
意味論
形態素解析器・Stanford parser(英文)
・Mecab(日本語文)
S式(Lispの式)
名詞、動詞、前置詞等を特定
情報科学では最重要概念関数はS式で表現できる文章もS式で表現できる
外部ライブラリの結果修正(後述)高度なA.I.(意味論)
ガジェット 高度なA.I.
Data.List
HaskellでGUI
定番がないGUI。大別すると以下の2つ
1.他言語の定番ライブラリのラッパー
Gtk, Qt …
2.FRP
(Functional Reactive Programming)Javascriptコードを吐いたりする(AltJS)
ガジェットの実行速度を考慮して今回は最初は1をやる最初は2でやっていたが、描画が遅かった。自分では解決できなかった。
HaskellでGUI – Gtk2hs
Gtk2(C言語)のラッパーであるGtk2hsを利用
チュートリアルが充実(書籍・Web)
Functional Reactive Programming
ロボティクス
Excel
Elm
ある変数変化が、他の変数の変化を惹起するのを、関数で表現
税率 0.1
価格 価格(税込み)
300 330
500 550
7000 7700
y1
y2
y2 = f (y 1)
インパルス
y2はy1に従属
意識されないが有名なのはExcel
ロボティクスやGUIにも応用されている。
勉強会で扱うガジェット
・シンタクスハイライトにヒントを得た
・速読が通用しない系の文書に有効
教科書、論文、公文書、図鑑
「一例としての有価証券報告書」
「一例としての有価証券報告書」
勉強会で扱うガジェット
・シンタクスハイライトにヒントを得た
・速読が通用しない系の文書に有効
教科書、論文、公文書、図鑑
・名詞句の特定がとくに重要
「名詞句単位での着色?何ぞ?」
・技書博は 技術書を頒布される方のみサークル出展いただけます。・出展者は各自の良識の範囲で技術を定義し、自らがもつ技術を共有する場としてご利用ください。・ここでの技術とは、出展者の方が技術であると信じるものであれば分野を問いません。・多くの参加者が望むような内容でなくとも、あなたが強く推したいと思う技術をぜひお持ちください。・また技術を受け取ったエンジニアにとって実りのあるものであることを価値基準としてください。・著しく秩序を欠いた内容でない限り、運営事務局では出展に際して個別の判断や制限は行いません。・私たち運営事務局は、エンジニアによるアウトプットを推進し、知識の共有によってより良いエンジニアコミュニティを築き、また参加される皆さんが共に成長することを望んでいます
「名詞句単位での着色?何ぞ?」
・技書博は 技術書を頒布される方のみサークル出展いただけます。・出展者は各自の良識の範囲で技術を定義し、自らがもつ技術を共有する場としてご利用ください。・ここでの技術とは、出展者の方が技術であると信じるものであれば分野を問いません。・多くの参加者が望むような内容でなくとも、あなたが強く推したいと思う技術をぜひお持ちください。・また技術を受け取ったエンジニアにとって実りのあるものであることを価値基準としてください。・著しく秩序を欠いた内容でない限り、運営事務局では出展に際して個別の判断や制限は行いません。・私たち運営事務局は、エンジニアによるアウトプットを推進し、知識の共有によってより良いエンジニアコミュニティを築き、また参加される皆さんが共に成長することを望んでいます
「名詞句単位での着色?何ぞ?」
名詞句=指示代名詞(「それ」)で置き換え可能単位
・技書博は 技術書を頒布される方のみサークル出展いただけます。・出展者は各自の良識の範囲で技術を定義し、自らがもつ技術を共有する場としてご利用ください。・ここでの技術とは、出展者の方が技術であると信じるものであれば分野を問いません。・多くの参加者が望むような内容でなくとも、あなたが強く推したいと思う技術をぜひお持ちください。・また技術を受け取ったエンジニアにとって実りのあるものであることを価値基準としてください。・著しく秩序を欠いた内容でない限り、運営事務局では出展に際して個別の判断や制限は行いません。・私たち運営事務局は、エンジニアによるアウトプットを推進し、知識の共有によってより良いエンジニアコミュニティを築き、また参加される皆さんが共に成長することを望んでいます
「名詞句単位での着色?何ぞ?」
名詞句=指示代名詞(「それ」)で置き換え可能単位
資料作成時に意識すると、なにか見えてきます。
・技書博は それ のみ それ いただけます。・出展者は それ で技術を定義し、 それ を それ としてご利用ください。・ここでの技術とは、出展者の方が それ であれば分野を問いません。・多くの参加者が望むような内容でなくとも、 それ をぜひお持ちください。・また技術を受け取ったエンジニアにとって それ を価値基準としてください。・ それ でない限り、運営事務局では出展に際して個別の判断や制限は行いません。・私たち運営事務局は、 それ を推進し、それ によってより それ をを築き、また参加される皆さんが それ を望んでいます
「圏論とかが使えそうな予感」"[([],ROOT) ["" [([0],S) ["" [([0,0],NP) ["" ([0,0,0],PRP) (It)]],"" [([0,1],VP) ["" ([0,1,0],VBZ) (is),"" [([0,1,1],VP) ["" ([0,1,1,0],VBN) (based),"" [([0,1,1,1],PP) ["" ([0,1,1,1,0],IN) (on),"" [([0,1,1,1,1],NP) ["" [([0,1,1,1,1,0],NP) ["" ([0,1,1,1,1,0,0],DT) (a),"" [([0,1,1,1,1,0,1],ADJP) ["" ([0,1,1,1,1,0,1,0],RB) (recently),"" ([0,1,1,1,1,0,1,1],VBN) (discovered)]],"" ([0,1,1,1,1,0,2],NN) (connection)]],"" [([0,1,1,1,1,1],PP) ["" ([0,1,1,1,1,1,0],IN) (between),"" [([0,1,1,1,1,1,1],NP) ["" ([0,1,1,1,1,1,1,0],JJ) (homotopy),"" ([0,1,1,1,1,1,1,1],NN) (theory),"" ([0,1,1,1,1,1,1,2],CC) (and),"" ([0,1,1,1,1,1,1,3],NN) (type),"" ([0,1,1,1,1,1,1,4],NN) (theory)]]]]]]]]]]]],"" ([0,2],.) (.)]]]]"
(0,(([],ROOT),Nothing))(1,(([0],S),Nothing))(2,(([0,0],NP),Nothing))(3,(([0,0,0],PRP),Just "It"))(4,(([0,1],VP),Nothing))(5,(([0,1,0],VBZ),Just "is"))(6,(([0,1,1],VP),Nothing))(7,(([0,1,1,0],VBN),Just "based"))(8,(([0,1,1,1],PP),Nothing))(9,(([0,1,1,1,0],IN),Just "on"))(10,(([0,1,1,1,1],NP),Nothing))(11,(([0,1,1,1,1,0],NP),Nothing))(12,(([0,1,1,1,1,0,0],DT),Just "a"))(13,(([0,1,1,1,1,0,1],ADJP),Nothing))(14,(([0,1,1,1,1,0,1,0],RB),Just "recently"))(15,(([0,1,1,1,1,0,1,1],VBN),Just "discovered"))(16,(([0,1,1,1,1,0,2],NN),Just "connection"))(17,(([0,1,1,1,1,1],PP),Nothing))(18,(([0,1,1,1,1,1,0],IN),Just "between"))(19,(([0,1,1,1,1,1,1],NP),Nothing))(20,(([0,1,1,1,1,1,1,0],JJ),Just "homotopy"))(21,(([0,1,1,1,1,1,1,1],NN),Just "theory"))(22,(([0,1,1,1,1,1,1,2],CC),Just "and"))(23,(([0,1,1,1,1,1,1,3],NN),Just "type"))(24,(([0,1,1,1,1,1,1,4],NN),Just "theory"))(25,(([0,2],.),Just "."))
忘却関手?(圏論の概念)
脱構造
「圏論とかが使えそうな予感」"[([],ROOT) ["" [([0],S) ["" [([0,0],NP) ["" ([0,0,0],PRP) (It)]],"" [([0,1],VP) ["" ([0,1,0],VBZ) (is),"" [([0,1,1],VP) ["" ([0,1,1,0],VBN) (based),"" [([0,1,1,1],PP) ["" ([0,1,1,1,0],IN) (on),"" [([0,1,1,1,1],NP) ["" [([0,1,1,1,1,0],NP) ["" ([0,1,1,1,1,0,0],DT) (a),"" [([0,1,1,1,1,0,1],ADJP) ["" ([0,1,1,1,1,0,1,0],RB) (recently),"" ([0,1,1,1,1,0,1,1],VBN) (discovered)]],"" ([0,1,1,1,1,0,2],NN) (connection)]],"" [([0,1,1,1,1,1],PP) ["" ([0,1,1,1,1,1,0],IN) (between),"" [([0,1,1,1,1,1,1],NP) ["" ([0,1,1,1,1,1,1,0],JJ) (homotopy),"" ([0,1,1,1,1,1,1,1],NN) (theory),"" ([0,1,1,1,1,1,1,2],CC) (and),"" ([0,1,1,1,1,1,1,3],NN) (type),"" ([0,1,1,1,1,1,1,4],NN) (theory)]]]]]]]]]]]],"" ([0,2],.) (.)]]]]"
Propositional
Equality
(not judgmental)
"[([],ROOT) ["" [([0],S) ["" [([0,0],NP) ["" ([0,0,0],PRP) (It)]],"" [([0,1],VP) ["" ([0,1,0],VBZ) (is),"" [([0,1,1],VP) ["" ([0,1,1,0],VBN) (based),"" [([0,1,1,1],PP) ["" ([0,1,1,1,0],IN) (on),"" [([0,1,1,1,1],NP"" [([0,1,1,1,1,1],PP) ["" ([0,1,1,1,1,1,0],IN) (between),"" [([0,1,1,1,1,1,1],NP)]]]]]]]]]]],"" ([0,2],.) (.)]]]]"
縮約
“Ologs: A categorical framework for knowledge representation”David Spivak
名詞句(Object) それ以外(述部等) (Arrow)
A child is a person, which has as parents a pair (w, m) where w is a woman and m is a man, which yields, via the value of w, a woman.
「圏論とかが使えそうな予感」
「初心者向け言語 – Haskell」
1.何の調理法?
2.何が材料?
3.何がどう組み合わさる?
【ヒント】代入を考える。
「初心者向け言語 – Haskell」
1.何の調理法?
2.何が材料?
3.何がどう組み合わさる?
【ヒント】代入を考える。
【解説】C言語は鍋とか皿の大きさ、状態を考える。細かいことがやれる。でも(だから)難しい。代入もあまり使わない。
最近は鍋や皿が大きくなっている。初心者は鍋や皿があふれてから考えればいいかと。
実はHaskellもCっぽく書ける(ガジェット(GUI)作成時に多用)
Haskellが最初の言語な初心者(現状はユニークな存在、常識を覆したい)
Haskell Curry
まとめ(勉強会のプラン)
文字列parser
S式
形態素解析修正
意味論
ガジェット
高度なA.I.Data.List
It is based on a recently discovered connection between homotopy theory and type theory.
"[([],ROOT) ["" [([0],S) ["" [([0,0],NP) ["" ([0,0,0],PRP) (It)]],"" [([0,1],VP) ["" ([0,1,0],VBZ) (is),"" [([0,1,1],VP) ["" ([0,1,1,0],VBN) (based),"" [([0,1,1,1],PP) ["" ([0,1,1,1,0],IN) (on),"" [([0,1,1,1,1],NP) ["" [([0,1,1,1,1,0],NP) ["" ([0,1,1,1,1,0,0],DT) (a),"" [([0,1,1,1,1,0,1],ADJP) ["" ([0,1,1,1,1,0,1,0],RB) (recently),"" ([0,1,1,1,1,0,1,1],VBN) (discovered)]],"" ([0,1,1,1,1,0,2],NN) (connection)]],"" [([0,1,1,1,1,1],PP) ["" ([0,1,1,1,1,1,0],IN) (between),"" [([0,1,1,1,1,1,1],NP) ["" ([0,1,1,1,1,1,1,0],JJ) (homotopy),"" ([0,1,1,1,1,1,1,1],NN) (theory),"" ([0,1,1,1,1,1,1,2],CC) (and),"" ([0,1,1,1,1,1,1,3],NN) (type),"" ([0,1,1,1,1,1,1,4],NN) (theory)]]]]]]]]]]]],"" ([0,2],.) (.)]]]]"
内容 Haskellっぽいこと
Data.Listの関数
基本文法、型、高階関数、ラムダ式、スコープ等
S式のParser作成と操作
再帰、モナド、データ型(型クラスとか)、(圏論)
GUIIORef, 並列・並行プログラミング
第二部 環境構築
https://polymony.net/2020/01/26/next/
当日、VSCodeに慣れている方が多かったので、次回以降はVSCode + HIEで行こうと思います。
以下のHPを参考にして環境構築してみてください。