SlideShare une entreprise Scribd logo
1  sur  29
Télécharger pour lire hors ligne
Scala による自然言語処理
2013-09-01
Hiroyoshi Komatsu
@torotoki
1
プロフィール
• @torotoki
• 興味
• 質問応答
• トピックモデル
• 言語
• Scala 歴は半年くらい
• NTCIR RITE という含意関係認識の
ワークショップで触れた
• 他の関数型言語をやったことはない
• 高2
2
前置き
3
なぜ Scala なのか
• Scala の利点
• 一般的な書き方をしつつも、面倒な部分は関数型言語らしく簡
潔に書ける
• スクリプト言語と比べて早い
• 静的型付けなのでコンパイル時にエラーが分かる
• 型推論が強力で動的型付け言語並みに型を省略できる
• JVM で動く
• Java の力を借りられる
4
今回の議題
• 自然言語処理/機械学習をする人に Scala を知ってもらう
• なぜ Scala を使うのか
• 関数型言語のおかげでデータ構造が比較的簡単に扱える
• グラフとかツリーとか扱うので便利
• 好きなところだけ関数型な構文でかける
• 言語処理/機械学習のライブラリが充実 しつつ ある
5
Scala の構文
• セミコロンや型名などごちゃごちゃせずに奇麗に書ける
var capital = Map("US" -> "Washington", "France" -> "Paris")
capital += ("Japan" -> "Tokyo")
println(capital("France"))
6
タイプ推論
val list = List(1, 3, 4)
var list2 = list
list2 = List(4,5,6) // OK
list2 = List(“Test!”) // error
7
マップ処理
val list = List(1,2,3)
def plus1(x: Int) = x + 1
val increaseList = list.map(plus1)
8
マップ処理(別バージョン)
val list = List(1,2,3)
val increaseList = list.map(_ + 1)
9
Scala のデータ構造
10
データ構造
• 関数型的な データ構造とは
• 全ての変数をイミュータブル(不変)にする
• 望ましい構造
• スケーラブルでも同等の性能を出す
• 非破壊的
• 更新の際は元のデータを書き換えるのではなく、新たなデー
タを生成する
• イメージとして 関数型的 非破壊的
11
Scala のリスト構造
List(a, b, c, d)
A B C D
要素と次の要素のリンクを持つ簡素なもの
12
Scala のリストの関数
• 頑張ってなるべく O(1) の操作を使う
O(1) O(log n) O(n)
最初の値
先頭に追加
最後に追加
連結
挿入
最後の値
n番目の値
13
キュー
• キュー(Queue)は enqueue と dequeue という2つの
操作ができるデータ構造
• enqueue: 一番後ろにデータを入れる
• dequeue: 一番前にデータを取り出す
http://en.wikipedia.org/wiki/Queue_(abstract_data_type)
14
単純な非破壊的なキュー
• 単純にやると全コピー: 計算量: O(n)
1 2 3
4 ・
・
追加
1 2 3 4 ・・
コピー コピー コピー
15
非破壊的なキュー
• ちょっと工夫
• 後ろのほうは逆順で持つ
• 単純な順番しかないリストなので先頭への追加は O(1)
1 2 3 ・
5 4 ・
16
キューの Scala 実装
case class Queue[T](leading: List[T], trailing: List[T]) {
private def mirror =
if (leading.isEmpty) new Queue(trailing.reverse, Nil)
else this
def head = mirror.leading.head
def tail = {
val q = mirror
new Queue(q.leading.tail, q.trailing)
}
def enqueue(x: T) = new Queue(leading, x :: trailing)
def dequeue = this.tail
}
17
関数型言語だけど…
• Scala は関数型言語だが、for文やwhile文など「普通の書
き方」ができる
• 変数も可能
var a = 0
while (a != 100) {
println(a)
a += 1
}
 
for (i <- 1 to 100) {
println(a)
}
val a = 3 // 定数
var b = 15 // 変数
18
ライブラリ
19
NLP/MLのライブラリ
• 「ScalaNLP」という5つのライブラリがある
http://www.scalanlp.org
20
ScalaNLP
• ScalaNLP の5つのライブラリ
• Breeze: 線形代数, 数値計算, 可視化
• Nak: 機械学習
• Chalk: テキスト処理
• Epic: パーサー
• Junto: ラベル伝搬
• 依存関係
• Breeze -> 他の全て
• Nak -> Chalk
• Epic -> Chalk
• Junto は独立したライブラリ
Breeze のロゴ
21
Breeze
scala> val m = DenseMatrix.zeros[Int](5,5)
m: breeze.linalg.DenseMatrix[Int] =
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
scala> (m.rows, m.cols)
res10: (Int, Int) = (5,5)
scala> m(::,1)
res7: breeze.linalg.DenseVector[Int] = DenseVector(0, 0, 0, 0, 0)
scala> m(4,::) := DenseVector(1,2,3,4,5).t // 転置
res8: breeze.linalg.DenseMatrix[Int] = 1 2 3 4 5
scala> m
res9: breeze.linalg.DenseMatrix[Int] =
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 2 3 4 5
22
Python vs Scala
• 公式サイトのスライドから引用
• http://www.scalanlp.org/documentation/
• 詳しい条件があまり書いてないが…
23
ScalaNLP 所感
• Breeze 以外はドキュメント不足
• 現状 README とサンプルが手がかり
• サイトには Breeze 以外のプロジェクトについてあまり記述が
ないため、今後作成予定だと思われる
• 開発は進行中
• それぞれを見るとまだ超大規模なプロジェクトではないので、
今なら色々貢献できる?
24
おまけ
25
Scala で XML 処理
• 個人的には XML 処理がもっとも Scala の拡張性がよく
現れていると思う
• 前提
• XML を構文としてサポートしている
• Scala では記号は関数として扱われるため、ユーザー
も簡単に記号を定義できる
• これを生かして XML では XPath が埋め込める
val p =
<a>
This is some XML.
Here is a tag: <atag/>
</a>
X + X, X * 3, X ??? “aaa”
//=> X.+(X) X.*(3) X.???(“aaa”)
26
MeCab の XML の処理
val sentence =
<sentence>
<chunk id="0" link="6" rel="D" score="2.909358" head="0" func="1">
<tok id="0" feature="名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー" ne="B-PERSON">太郎</tok>
<tok id="1" feature="助詞,係助詞,*,*,*,*,は,ハ,ワ" ne="O">は</tok>
</chunk>
<chunk id="1" link="2" rel="D" score="1.257926" head="2" func="2">
<tok id="2" feature="連体詞,*,*,*,*,*,この,コノ,コノ" ne="O">この</tok>
</chunk>
<!-- 省略... -->
</sentence>
for (tok <- sentence  "tok") {
val feature = tok  "@feature"
println(feature + ": " + tok.text)
})
27
実際の処理で感じたこと
• メリット
• 構文解析の木構造、グラフ構造に関するデータ処理がや
りやすい
• 小規模 大規模なプログラムまで耐えられる
• Java との互換性があるおかげで、特に英語圏のライブラ
リがけっこう使える
• 並列化が楽
• デメリット
• コンパイル速度が Java よりかなり遅い
• 実行速度も Java に比べると遅いらしい
28
実際の処理で感じたこと
• メリット
• 構文解析の木構造、グラフ構造に関するデータ処理がや
りやすい
• 小規模 大規模なプログラムまで耐えられる
• Java との互換性があるおかげで、特に英語圏のライブラ
リがけっこう使える
• 並列化が楽
• デメリット
• コンパイル速度が Java よりかなり遅い
• 実行速度も Java に比べると遅いらしい
(1	 to	 10000).par.sum
29

Contenu connexe

Tendances

Ruby 3のキーワード引数について考える
Ruby 3のキーワード引数について考えるRuby 3のキーワード引数について考える
Ruby 3のキーワード引数について考えるmametter
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
Ruby 3の型推論やってます
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってますmametter
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門Kimikazu Kato
 
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析mametter
 
Shibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてShibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてtnoda
 
(Lambdaだけで) 純LISPのような ナニかを作る
(Lambdaだけで)純LISPのようなナニかを作る(Lambdaだけで)純LISPのようなナニかを作る
(Lambdaだけで) 純LISPのような ナニかを作るDaichi Teruya
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 

Tendances (9)

Ruby 3のキーワード引数について考える
Ruby 3のキーワード引数について考えるRuby 3のキーワード引数について考える
Ruby 3のキーワード引数について考える
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
Ruby 3の型推論やってます
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってます
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
Lisp講義1
Lisp講義1Lisp講義1
Lisp講義1
 
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
 
Shibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてShibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R について
 
(Lambdaだけで) 純LISPのような ナニかを作る
(Lambdaだけで)純LISPのようなナニかを作る(Lambdaだけで)純LISPのようなナニかを作る
(Lambdaだけで) 純LISPのような ナニかを作る
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 

En vedette

スペル修正プログラムの作り方 #pronama
スペル修正プログラムの作り方 #pronamaスペル修正プログラムの作り方 #pronama
スペル修正プログラムの作り方 #pronamaHiroyoshi Komatsu
 
質問応答システム入門
質問応答システム入門質問応答システム入門
質問応答システム入門Hiroyoshi Komatsu
 
鬱くしい日本語のための形態素解析入門
鬱くしい日本語のための形態素解析入門鬱くしい日本語のための形態素解析入門
鬱くしい日本語のための形態素解析入門Hiroyoshi Komatsu
 
ABC 2012 Spring Robot Summit
ABC 2012 Spring Robot Summit ABC 2012 Spring Robot Summit
ABC 2012 Spring Robot Summit 三七男 山本
 
ET2016 小さなRubyボード GR-CITRUSの紹介
ET2016 小さなRubyボード GR-CITRUSの紹介ET2016 小さなRubyボード GR-CITRUSの紹介
ET2016 小さなRubyボード GR-CITRUSの紹介三七男 山本
 
Ruby関西76 gr citrusの使い方#2
Ruby関西76 gr citrusの使い方#2Ruby関西76 gr citrusの使い方#2
Ruby関西76 gr citrusの使い方#2三七男 山本
 
Breezeで始めるデータ分析
Breezeで始めるデータ分析Breezeで始めるデータ分析
Breezeで始めるデータ分析Yuto Suzuki
 
スクラムに学ぶ開発の回し方
スクラムに学ぶ開発の回し方スクラムに学ぶ開発の回し方
スクラムに学ぶ開発の回し方Yuto Suzuki
 
Apache Spark チュートリアル
Apache Spark チュートリアルApache Spark チュートリアル
Apache Spark チュートリアルK Yamaguchi
 
捗るリコメンドシステムの裏事情(ハッカドール)
捗るリコメンドシステムの裏事情(ハッカドール)捗るリコメンドシステムの裏事情(ハッカドール)
捗るリコメンドシステムの裏事情(ハッカドール)mosa siru
 
Pythonによる機械学習の最前線
Pythonによる機械学習の最前線Pythonによる機械学習の最前線
Pythonによる機械学習の最前線Kimikazu Kato
 
ディープラーニングの最新動向
ディープラーニングの最新動向ディープラーニングの最新動向
ディープラーニングの最新動向Preferred Networks
 
Jiraの紹介(redmineとの比較視点にて)
Jiraの紹介(redmineとの比較視点にて)Jiraの紹介(redmineとの比較視点にて)
Jiraの紹介(redmineとの比較視点にて)Hiroshi Ohnuki
 
機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話Ryota Kamoshida
 

En vedette (17)

スペル修正プログラムの作り方 #pronama
スペル修正プログラムの作り方 #pronamaスペル修正プログラムの作り方 #pronama
スペル修正プログラムの作り方 #pronama
 
質問応答システム入門
質問応答システム入門質問応答システム入門
質問応答システム入門
 
Qaシステム解説
Qaシステム解説Qaシステム解説
Qaシステム解説
 
鬱くしい日本語のための形態素解析入門
鬱くしい日本語のための形態素解析入門鬱くしい日本語のための形態素解析入門
鬱くしい日本語のための形態素解析入門
 
質問応答システム
質問応答システム質問応答システム
質問応答システム
 
ABC 2012 Spring Robot Summit
ABC 2012 Spring Robot Summit ABC 2012 Spring Robot Summit
ABC 2012 Spring Robot Summit
 
ET2016 小さなRubyボード GR-CITRUSの紹介
ET2016 小さなRubyボード GR-CITRUSの紹介ET2016 小さなRubyボード GR-CITRUSの紹介
ET2016 小さなRubyボード GR-CITRUSの紹介
 
Ruby関西76 gr citrusの使い方#2
Ruby関西76 gr citrusの使い方#2Ruby関西76 gr citrusの使い方#2
Ruby関西76 gr citrusの使い方#2
 
Breezeで始めるデータ分析
Breezeで始めるデータ分析Breezeで始めるデータ分析
Breezeで始めるデータ分析
 
スクラムに学ぶ開発の回し方
スクラムに学ぶ開発の回し方スクラムに学ぶ開発の回し方
スクラムに学ぶ開発の回し方
 
Apache Spark チュートリアル
Apache Spark チュートリアルApache Spark チュートリアル
Apache Spark チュートリアル
 
捗るリコメンドシステムの裏事情(ハッカドール)
捗るリコメンドシステムの裏事情(ハッカドール)捗るリコメンドシステムの裏事情(ハッカドール)
捗るリコメンドシステムの裏事情(ハッカドール)
 
Pythonによる機械学習の最前線
Pythonによる機械学習の最前線Pythonによる機械学習の最前線
Pythonによる機械学習の最前線
 
ディープラーニングの最新動向
ディープラーニングの最新動向ディープラーニングの最新動向
ディープラーニングの最新動向
 
Deep learning を用いた画像から説明文の自動生成に関する研究の紹介
Deep learning を用いた画像から説明文の自動生成に関する研究の紹介Deep learning を用いた画像から説明文の自動生成に関する研究の紹介
Deep learning を用いた画像から説明文の自動生成に関する研究の紹介
 
Jiraの紹介(redmineとの比較視点にて)
Jiraの紹介(redmineとの比較視点にて)Jiraの紹介(redmineとの比較視点にて)
Jiraの紹介(redmineとの比較視点にて)
 
機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話
 

Similaire à Scala による自然言語処理

オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional ProgrammingTomoharu ASAMI
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Tomoharu ASAMI
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Koji SHIMADA
 
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについてNobukazu Hanada
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and designTomoharu ASAMI
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ京大 マイコンクラブ
 
10分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 090510分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 0905Nobuaki Oshiro
 
並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門Yoshimura Soichiro
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと Haruka Ozaki
 
"Hello World!" から始める Calc で LibreOffice Basic
"Hello World!" から始める Calc で LibreOffice Basic"Hello World!" から始める Calc で LibreOffice Basic
"Hello World!" から始める Calc で LibreOffice Basic78tch
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014信之 岩永
 
R超入門機械学習をはじめよう
R超入門機械学習をはじめようR超入門機械学習をはじめよう
R超入門機械学習をはじめよう幹雄 小川
 

Similaire à Scala による自然言語処理 (20)

オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
Tokyo r47 beginner_2
Tokyo r47 beginner_2Tokyo r47 beginner_2
Tokyo r47 beginner_2
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
 
Tokyo r45 beginner_2
Tokyo r45 beginner_2Tokyo r45 beginner_2
Tokyo r45 beginner_2
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4
 
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and design
 
Tokyo r39 beginner
Tokyo r39 beginnerTokyo r39 beginner
Tokyo r39 beginner
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
LDA入門
LDA入門LDA入門
LDA入門
 
10分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 090510分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 0905
 
Trait in scala
Trait in scalaTrait in scala
Trait in scala
 
並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
 
"Hello World!" から始める Calc で LibreOffice Basic
"Hello World!" から始める Calc で LibreOffice Basic"Hello World!" から始める Calc で LibreOffice Basic
"Hello World!" から始める Calc で LibreOffice Basic
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014
 
R超入門機械学習をはじめよう
R超入門機械学習をはじめようR超入門機械学習をはじめよう
R超入門機械学習をはじめよう
 

Scala による自然言語処理