Clojureと関数プログラミング

ウェブ技術 デジタルトランスフォーメーション技術 人工知能技術 自然言語処理技術 セマンティックウェブ技術 深層学習技術 オンライン学習&強化学習技術 チャットボットと質疑応答技術 ユーザーインターフェース技術 知識情報処理技術 推論技術  プログラミング

Clojureと関数プログラミングについて

Clojureは、Rich Hickeyにより作られ2007年に登場した比較的新しい言語である。新しいとは言っても、言語自体は1958年に登場したLISP言語の方言の一つであり、またJVMの上で動作してレガシーなプログラミング言語であるJAVAのコードをそのまま利用できるという古い顔と新しい顔を併せ持つ言語となっている。

Clojureの特徴の一つとして関数型言語であるというものがある。これはpythonやjavascript等の通常の言語が手続きを書き並べていく言語であるのに対して、関数という機能ブロックで全てのプログラムを構成するというプログラミング言語の歴史の中では最新のトレンドに部類されるものとなる。

プログラミング言語の開発の視点の一つに再利用性の向上がある。関数型言語の前に一世を風靡したオブジェクト指向型言語もそのような観点で開発されたものだが、関数というブロックで構成するというアイデアは更なる再利用性の向上を実現している。

また、REPLと呼ばれるコードを書きながらその都度関数を評価していくしくみは、作成時のバグを低減し、コード生成の効率化をもたらす。更に、LISPの持つ「データ=コード」という特徴は、プログラムの自動生成を含めた人工知能技術を実現する可能性を持つ。

本ブログでは以下に示すように、概要から環境の立ち上げ、言語の詳細とWebアプリケーション機械学習人工知能技術への応用について述べている。

概要

技術トピック

Clojureを始めるための環境設定(JVM、テキストエディタ(Spacemacs)、コンパイラ/ラリブラリ管理ツール(leiningen))について述べる。

replの利用と最初のシンプルな関数プログラミング

各種データ構造とEDNについて

写経の際に役に立つライブラリの自動管理システムancient

map関数を使った全文検索ライクなデータ抽出

プログラムの基本構文となる条件分岐としての関数型言語的アプローチであるcondp、matchについて

JavascriptとClojureでの非同期処理の実際

非同期処理のベースとなるClojureを用いた関数型言語ての状態管理について

Clojureを使った関数型言語でのオブジェクト指向型アプローチ

ポリモーフィズムとはプログラミング言語の型システムを表す言葉で、プログラミング言語の各要素(定数変数オブジェクト関数メソッドなど)についてそれらが複数の型に属することを許すという性質を指す。ポリモルフィズム、多態性、多相性、多様性とも呼ばれる。対義語はモノモーフィズム (Monomorphism)で、単態性、単相性で、プログラミング言語の各要素が唯一つの型に属するという性質を指す。

今回はClojureを使った関数型言語でのポリモーフィズムとモノモーフィズムについて述べる。

clojureでのオブジェクトのハンドリング関数としてのdeftypeとdefrecordについて

Clojureを使ったmutableなデータハンドリングとしてのロカール変数のdestructuringによる扱い

C、Java、Javascript、Python、Clojureでの繰り返し処理の比較

各種データソートアルゴリズムとClojure

Webアプリケーション

ClojureでのRingを用いたサーバーの立ち上げについて

前回に立ち上げたClojureでのサーバーにcompojureを用いたルーティングを導入

ウェブアプリケーションを構築するためにClojureでpostgresqlを立ち上げる

Clojureでサーバーとデータベースを統合する

ClojureでSQLやSPARQL等のクエリを自動で生成する際に利用するformat関数について

Clojureで高速kvDBであるRedisを利用する実装について

マイクロサービス

ここでは、一般的なパターンとプラクティスを学び、プログラミング言語Clojureを使用して適用する方法を紹介する。アーキテクチャ設計とRESTful通信の基本的な概念を学び、開発時および運用時のスケールに対応した管理可能なコードを提供するパターンを紹介する。また、これらの概念とパターンをClojureでどのように実践するかについても例示している。

機械学習/自然言語処理

Clojureを用いた自然言語処理ツール(OpemNLP、kuromoji、Juman、KNP)を用いた形態素解析等の処理の実際

サポートベクトルマシンのライブラリであるliblinearのClojureラッパーを用いた文の分類について

ClojureによるK-meansを用いた教師なし学習について

自然言語処理や検索で用いるClojureによるtfidfの実装

自然言語処理のクレンジングで用いるClojureでのstopword除去の実装

自然言語処理での単語等の構造化に用いるone-hot-vectorとcategory vectorについて

その他AI技術

CLIPSにインスパイアーされて作られたClojureのライブラリとしてclara ruleやrete4framesがある。それぞれを用いた簡単なサンプルプログラムを示す。

ClojureのエキスパートシステムであるClara Rulesの基本的な実装について

ClojureのエキスパートシステムであるClara Rulesの応用実装について

論理プログラミング言語であるminiKanrenをベースとしたClojureでの論理プログラミング関数であるcore.logicについて

コメント

  1. […] 前回までで、Clojureを使うための環境を設定したので、今回はClojure自身の導入と設定まで述べてみたい。 […]

  2. […] 次回は具体的な言語の一例として、現在に蘇ったLISP言語であるClojureについて述べてみたい。 […]

  3. […] 前述の密結合する関数を疎結合にする手段として、Clojureの実現手段としてはSTM(software transaction Memory)を使う方法がある。たとえばatomを使うケースだと […]

  4. […] Racket, Clojure,Haskell, Python, JavaScript, Scala, Ruby, OCaml, and […]

  5. […] 2002年にマイクロソフト社が関数型言語F#を発表し、2003年にはオブジェクト指向機能と関数型を併せ持つScalaが登場した。この他にもJavaやJavascript等の既存の言語にも関数的な機能が盛り込まれ始めた。また、Clojureも2007年に登場し、2000年代は関数型言語が見直される時代となった。 […]

  6. […] Clojureを使った自然言語処理について述べてみたい。 […]

  7. […] これらをClojureで実装したものはHolger Schauer氏の以下のものがある。 […]

  8. […] 前回に続いて、Clojureでのexpert systemであるclara-ruluesについて。Claraでは、defqueryとquery関数を用いて外部への推論結果の外部への出力を行う。以下にサンプルを示す […]

  9. […] Clojureのプログラムの中で単純にソートをしたい場合は以下のような形で行える。 […]

  10. […] Clojureではシーケンスを続ける形の表現となり以下のようになる。 […]

  11. […] 以前紹介したClojureを使ったプログラミングを選択しているのは、LISPがこれらの数学的な理論の裏付けのある言語であるからと言う理由もある。人工知能のゴールの一つであるプログラムの自動生成を考える際に、「シンタックス」側のアプローチはLISPを使うことでの実現手段がイメージできるが、それに密接に関係する「セマンティクス」のアプローチは未だ十分にイメージできていない。今後もそれらに関しては考えていければと思う。 […]

  12. […] ClojureScriptは、プログラミング言語のClojureからJavaScriptに変換するコンパイラーで、Clojureの持つ動的型付けや汎用の関数型言語で、変更不可な(immutable)データ構造に対応する特徴を持つ。ClojureScriptはLisp系のプログラミング言語なので、コードはデータとして扱われ、マクロが使えるのでメタプログラミングが可能となる。ほかのLisp系言語とは違いClojureは変更不可の(immutable)データ構造に対応しており、副作用の管理がしやすくなっている。List特有の括弧の使い方をはじめ、他の言語に比べて取っ付きにくく見える構文だが、構文の簡潔さと抽象化能力により、高度な抽象化が必要な場面に強力なツールとなる。ClojureScriptはコードの最適化にGoogle Closureを使用しているため、既存のJavaScriptライブラリーと互換性がある。 […]

  13. […] 自然言語処理で不必要な単語を除くstopword除去のClojureでの実装について。 […]

  14. […] たとえばClojureではこれをcore.asyncというライブラリで実現する。これは並列処理がが得意なGo-langのコンセプトを用いたgoマクロによってgo-blockを作り、そのブロック内のみで非同期動作を実現するという形を取る。またブロック間でのデータをやり取りするデータとしてチャネル(channel)を使う。 […]

  15. […] AI、ML、DX等に活用可能な関数型プログラミングClojure | Deus Ex Machina より: 2021年9月24日 3:16 AM […]

  16. […] 前回は、Clojureの特徴であるREPLとimmutableなデータについて述べた。今回はデータ構造について述べる。 […]

  17. […] 自然言語処理の機械学習で利用される。one-hot-vectorとcategory vectorのClojureでの実装。(形態素解析やCSVの入出力以外は極力外部のライブラリを使わない形で実装。 […]

  18. […] Clojureを使う上で重要なデータのDestrucurtingについてまとめる。サンプルコードは「Destructuring in Clojure」を参照した。まずベクトルデータからのデータの分割は以下となる。 […]

  19. […] Clojureでのクラスのハンドリングの関数として、defrecordとdefTypeがある。deftypeに関してはmutableな変数を扱う使い方がある。以下にまとめる。まずはdefinterfaceを用いたパターン。 […]

  20. […] これを具体的にClojureのコードで見ていく。まずモノモーフィズムなコードとしては以下のようになる。 […]

  21. […] ClojurScriptを構成したり、Java等のOOPプラットフォームとの連携を考えたり、また前述のCralaでもClojureでのクラスの操作の理解が必要となる。 […]

  22. […] 先述のCLIPSにインスパイアーされて作られたClojureのライブラリとしてclara ruleやrete4fmanesやがある。まずclara ruleについて、サンプルコードは以下となる。 […]

  23. […] 国内外で出版されているClojureの参考図書についてまとめた。機械学習の参考図書に関しては別途まとめる。 […]

  24. […] Clojureでの機械学習の参考図書は以下のようになる。残念ながら日本語でのものは発行されていない。Clojure全般の参考図書に関しては別途述べる。 […]

  25. […] サーバーサイドでの動的処理を抽象化するのが、サーバーサイドフレームワークとなる。サーバーサイドでは、PHP/Ruby/Python/Perl/Clojureのようなスクリプト言語で、Webアプリケーションの処理に必要な、HTML生成のためのテンプレート機能、データベースアクセスをする機能、安全性を高めるための入力チェック機能等様々な機能が抽象化されて準備されている。このフレームワークを使うことでユーザーはWebアプリケーションの仕組みを知らなくても、これらの抽象化された機能を使うだけでWebアプリケーションを開発できるようになる。 […]

  26. […] スペクトラムクラスタリングの実行は上記をコード化するか、python(sklean)やR、Clojure等の様々なプラットフォーム上のライブラリを利用して行うものとなる。 […]

  27. […] 人工知能技術サマリー 機械学習技術サマリー トピックモデルサマリー オントロジー技術サマリー Clojureサマリー Pythonサマリー […]

  28. […] 初心者のための関数型プログラミングClojure、環境設定 | Deus Ex Machina より: 2021年7月15日 6:33 AM […]

  29. […] AI、ML、DX等に活用可能な関数型プログラミングClojure | Deus Ex Machina より: 2021年7月17日 6:34 AM […]

  30. […] AI、ML、DX等に活用可能な関数型プログラミングClojure | Deus Ex Machina より: 2021年7月15日 6:55 AM […]

  31. […] AI、ML、DX等に活用可能な関数型プログラミングClojure | Deus Ex Machina より: 2021年7月15日 6:56 AM […]

  32. […] Clojure.  人工知能   life […]

  33. […] <Clojureと関数型プログラミング> […]

タイトルとURLをコピーしました