Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rubyで機械学習してみた
Search
kunou
December 08, 2017
Technology
1
1.1k
Rubyで機械学習してみた
kunou
December 08, 2017
Tweet
Share
More Decks by kunou
See All by kunou
GANについて
kunou
0
440
AIか何かについて.pdf
kunou
0
36
Pythonを書いていておーマジかーと感じたあれこれ
kunou
1
720
ネットワークグラフを作成する
kunou
0
52
ZIP!!
kunou
0
180
zip
kunou
0
510
Make Mouse
kunou
0
640
RubyのProcのあれをこうしました
kunou
0
98
esm lt Clojure like threading macro
kunou
0
440
Other Decks in Technology
See All in Technology
30代からでも遅くない! 内製開発の世界に飛び込み、最前線で戦うLLMアプリ開発エンジニアになろう
minorun365
PRO
11
3k
DETR手法の変遷と最新動向(CVPR2025)
tenten0727
2
1.4k
Terraform Cloudで始めるおひとりさまOrganizationsのすゝめ
handy
2
180
Amazon CloudWatch を使って NW 監視を行うには
o11yfes2023
0
170
CodePipelineのアクション統合から学ぶAWS CDKの抽象化技術 / codepipeline-actions-cdk-abstraction
gotok365
5
200
Ops-JAWS_Organizations小ネタ3選.pdf
chunkof
2
170
Рекомендации с нуля: как мы в Lamoda превратили главную страницу в ключевую точку входа для персонализированного шоппинга. Данил Комаров, Data Scientist, Lamoda Tech
lamodatech
0
750
ドキュメント管理の理想と現実
kazuhe
1
200
Classmethod AI Talks(CATs) #21 司会進行スライド(2025.04.17) / classmethod-ai-talks-aka-cats_moderator-slides_vol21_2025-04-17
shinyaa31
0
600
AI Agentを「期待通り」に動かすために:設計アプローチの模索と現在地
kworkdev
PRO
2
460
生成AIによるCloud Native基盤構築の可能性と実践的ガードレールの敷設について
nwiizo
7
970
AWSで作るセキュアな認証基盤with OAuth mTLS / Secure Authentication Infrastructure with OAuth mTLS on AWS
kaminashi
0
180
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.4k
GraphQLとの向き合い方2022年版
quramy
46
14k
KATA
mclloyd
29
14k
Why Our Code Smells
bkeepers
PRO
336
57k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Code Reviewing Like a Champion
maltzj
522
40k
GitHub's CSS Performance
jonrohan
1030
460k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
It's Worth the Effort
3n
184
28k
Fontdeck: Realign not Redesign
paulrobertlloyd
83
5.5k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
227
22k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Transcript
Rubyで機械学習してみた 8, 12, 2017 A-LT
Rubyで機械学習してみた やったこと 1.RubyでMeCabを使い文書を分かち書きにする 2.RubyでPyCallを使いWord2Vecする 3.Rubyで類似性の高い単語を取得する
1.RubyでMeCabを使い文書を分か ち書きにする
Rubyで機械学習してみた MeCabとは MeCabはオープンソースの形態素解析エンジン で、奈良先端科学技術大学院大学出身、現 GoogleソフトウェアエンジニアでGoogle 日本 語入力開発者の一人である工藤拓によって開 発されている。名称は開発者の好物「和布蕪 (めかぶ)」から取られた。 wikipediaより
Rubyで機械学習してみた 形態素解析とは 形態素解析(けいたいそかいせき、 Morphological Analysis)とは、文法的な 情報の注記の無い自然言語のテキストデー タ(文)から、対象言語の文法や、辞書と 呼ばれる単語の品詞等の情報にもとづき、 形態素(Morpheme, おおまかにいえば、言
語で意味を持つ最小単位)の列に分割し、 それぞれの形態素の品詞等を判別する作業 である。 wikipediaより
Rubyで機械学習してみた 実際に形態素解析してみる
Rubyで機械学習してみた 実際に形態素解析してみる 入力: “昨日食べたものが思い出せない” 出力: 昨日 名詞,副詞可能,*,*,*,*,昨日,キノウ,キノー 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ た
助動詞,*,*,*,特殊・タ,基本形,た,タ,タ もの 名詞,非自立,一般,*,*,*,もの,モノ,モノ が 助詞,格助詞,一般,*,*,*,が,ガ,ガ 思い出せ 動詞,自立,*,*,一段,未然形,思い出せる, オモイダセ,オモイダセ ない 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
Rubyで機械学習してみた 実際に形態素解析してみる 入力: “昨日食べたものが思い出せない” 出力: 昨日 名詞,副詞可能,*,*,*,*,昨日,キノウ,キノー 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ た
助動詞,*,*,*,特殊・タ,基本形,た,タ,タ もの 名詞,非自立,一般,*,*,*,もの,モノ,モノ が 助詞,格助詞,一般,*,*,*,が,ガ,ガ 思い出せ 動詞,自立,*,*,一段,未然形,思い出せる,オモイダセ,オモイダセ ない 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
Rubyで機械学習してみた Rubyでやってみる MeCabのWrapperであるnattoというgemがある
Rubyで機械学習してみた Rubyでやってみる require ‘natto' nm = Natto::MeCab.new puts nm.parse("昨日はうどんを食べたよ") =>
昨日 名詞,副詞可能,*,*,*,*,昨日,キノウ,キノー は 助詞,係助詞,*,*,*,*,は,ハ,ワ うどん 名詞,一般,*,*,*,*,うどん,ウドン,ウドン を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ よ 助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
Rubyで機械学習してみた Rubyでやってみる require ‘natto' nm = Natto::MeCab.new puts nm.parse("昨日はうどんを食べたよ") 昨日
名詞,副詞可能,*,*,*,*,昨日,キノウ,キノー は 助詞,係助詞,*,*,*,*,は,ハ,ワ うどん 名詞,一般,*,*,*,*,うどん,ウドン,ウドン を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ よ 助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
Rubyで機械学習してみた 今回Mecabを何に使うか? Word2Vecするために、単語ごとに分かち書きされた状態に したい。品詞などは使わない。
Rubyで機械学習してみた Rubyで分かち書きにしてみる require ‘natto' nm = Natto::MeCab.new(output_format_type: :wakati) puts nm.parse(“昨日はうどんを食べたよ")
昨日 は うどん を 食べ た よ
Rubyで機械学習してみた Rubyで分かち書きにしてみる require ‘natto' nm = Natto::MeCab.new(output_format_type: :wakati) puts nm.parse(“昨日はうどんを食べたよ")
昨日 は うどん を 食べ た よ
Rubyで機械学習してみた さらに基本形にする 時を駆ける少女 時を駆けた少女 時を駆けたい少女 時を駆けている少女
Rubyで機械学習してみた さらに基本形にする 時を駆ける少女 時を駆けた少女 時を駆けたい少女 時を駆けている少女 全部駆ける にしたい
Rubyで機械学習してみた MeCabで基本形にする $ echo "時を駆けたい少女" | mecab -F"%f[6] " -U"%m
" - E"\n" 時 を 駆ける たい 少女
Rubyで機械学習してみた MeCabで基本形にする $ echo "時を駆けたい少女" | mecab -F"%f[6] " -U"%m
" - E"\n" 時 を 駆ける たい 少女
Rubyで機械学習してみた MeCabで基本形にする $ echo "時を駆けたい少女" | mecab -F"%f[6] " -U"%m
" - E"\n" 時 を 駆ける たい 少女
Rubyで機械学習してみた Rubyで基本形の分かち書きにする Natto::MecabのコンストラクタにMecabのオプションが渡せるら しい。
Rubyで機械学習してみた Rubyで基本形の分かち書きにする Natto::MecabのコンストラクタにMecabのオプションが渡せるら しい。 Natto::MeCab.new('-F"%f[6] " -U"%m " -E"\n" ‘).
parse('時を駆けたい少女') => "\"時\"を\"駆ける\"たい\"少女\"\n\""
Rubyで機械学習してみた Rubyで基本形の分かち書きにする Natto::MecabのコンストラクタにMecabのオプションが渡せるら しい。 Natto::MeCab.new('-F"%f[6] " -U"%m " -E"\n"‘). parse('時を駆けたい少女')
=> "\"時\"を\"駆ける\"たい\"少女\"\n\"" 何かちょっと違う…
Rubyで機械学習してみた Rubyで基本形の分かち書きにする Natto::MecabのコンストラクタにMecabのオプションが渡せるら しい。 Natto::MeCab.new('-F"%f[6] " -U"%m " -E”\n”’, output_format_type:
:wakati). parse('時を駆けたい少女') ArgumentError: wrong number of arguments (given 2, expected 0..1) こうかな?
Rubyで機械学習してみた Rubyで基本形の分かち書きにする Natto::MecabのコンストラクタにMecabのオプションが渡せるら しい。 Natto::MeCab.new('-F"%f[6] " -U"%m " -E”\n”’, output_format_type:
:wakati). parse('時を駆けたい少女') ArgumentError: wrong number of arguments (given 2, expected 0..1) こうかな?
Rubyで機械学習してみた Rubyで基本形の分かち書きにする Natto::MecabのコンストラクタにMecabのオプションが渡せるら しい。 Natto::MeCab.new('-F"%f[6] " -U"%m " -E”\n”’, output_format_type:
:wakati). parse('時を駆けたい少女') ArgumentError: wrong number of arguments (given 2, expected 0..1) ……
Rubyで機械学習してみた Rubyで基本形の分かち書きにする `echo "時を駆けたい少女" | mecab -F"%f[6] " -U"%m "
-E”\n"` => "時 を 駆ける たい 少女 \n"
Rubyで機械学習してみた Rubyで基本形の分かち書きにする `echo "時を駆けたい少女" | mecab -F"%f[6] " -U"%m "
-E”\n"` => "時 を 駆ける たい 少女 \n" Nattoで基本形の分かち書きにする方法が分かりませんでした!
2.RubyͰPyCallΛ͍Word2Vec ͢Δ
Rubyで機械学習してみた Word2Vecとは? Word2vecは、2層から成り、テキスト処理を行う ニューラルネットワークです。 テキストコーパス を入力すると、出力結果には、ベクトルのセット、 つまりコーパスにある単語 の特徴量ベクトル(feature vector)が出されま す。
〜中略〜 Word2vecの目的及び有用性は、類似語のベクトル をベクトル空間にグループ化することです。つま り、数値に基づいて類似性を検知するのです。 参考URL: https://deeplearning4j.org/ja/word2vec
Rubyで機械学習してみた Word2Vecとは? Word2vecは、2層から成り、テキスト処理を行う ニューラルネットワークです。 テキストコーパス を入力すると、出力結果には、ベクトルのセット、 つまりコーパスにある単語 の特徴量ベクトル(feature vector)が出されま す。
〜中略〜 Word2vecの目的及び有用性は、類似語のベクトル をベクトル空間にグループ化することです。つま り、数値に基づいて類似性を検知するのです。 ࢀߟURL: https://deeplearning4j.org/ja/word2vec
Rubyで機械学習してみた Word2Vecとは? Word2vecは、2層から成り、テキスト処理を行う ニューラルネットワークです。 テキストコーパス を入力すると、出力結果には、ベクトルのセット、 つまりコーパスにある単語 の特徴量ベクトル(feature vector)が出されま す。
〜中略〜 Word2vecの目的及び有用性は、類似語のベクトル をベクトル空間にグループ化することです。つま り、数値に基づいて類似性を検知するのです。 ࢀߟURL: https://deeplearning4j.org/ja/word2vec
Rubyで機械学習してみた Pythonで書くと from gensim.models import word2vec import sys sentences =
word2vec.LineSentence(text_file_path) model = word2vec.Word2Vec(sentences, sg=1,size=100, min_count=1, window=10,hs=1,negative=0) model.save(model_file_path) ࢀߟURL: https://m0t0k1ch1st0ry.com/blog/2016/08/28/word2vec/
Rubyで機械学習してみた Pythonで書くと from gensim.models import word2vec import sys sentences =
word2vec.LineSentence(text_file_path) model = word2vec.Word2Vec(sentences, sg=1,size=100, min_count=1, window=10,hs=1,negative=0) model.save(model_file_path) ࢀߟURL: https://m0t0k1ch1st0ry.com/blog/2016/08/28/word2vec/
Rubyで機械学習してみた Pythonで書くと from gensim.models import word2vec import sys sentences =
word2vec.LineSentence(text_file_path) model = word2vec.Word2Vec(sentences, sg=1,size=100, min_count=1, window=10,hs=1,negative=0) model.save(model_file_path) ࢀߟURL: https://m0t0k1ch1st0ry.com/blog/2016/08/28/word2vec/ これをRubyでPyCallを使って書いてみる
Rubyで機械学習してみた Rubyで書くと require 'pycall/import' include PyCall::Import pyimport 'gensim' sentences =
gensim::models::word2vec.LineSentence.new(‘text_file_pa th’) model = gensim::models::word2vec.Word2Vec.new(sentences, sg: 1, size: 100, min_count: 1, window: 10, hs: 1, negative: 0) model.save(model_file_path)
Rubyで機械学習してみた Rubyで書くと require 'pycall/import' include PyCall::Import pyimport 'gensim' sentences =
gensim::models::word2vec.LineSentence.new(‘text_file_pa th’) model = gensim::models::word2vec.Word2Vec.new(sentences, sg: 1, size: 100, min_count: 1, window: 10, hs: 1, negative: 0) model.save(model_file_path)
3.Rubyで類似性の高い単語を取得 する
RubyͰػցֶशͯ͠Έͨ 今回学習させたファイルはこちら http://www.aozora.gr.jp/cards/001562/files/ 52410_ruby_51060.zip
Rubyで機械学習してみた 関羽でやってみる $ ruby similar_word.rb train.model 関羽 憂鬱 0.816013514995575 従える
0.7802281379699707 玄徳 0.7487945556640625 張飛 0.7451599836349487 先頭 0.7414117455482483 謝 0.740109920501709 顔 0.7302446961402893 同意 0.7249001860618591 沈痛 0.7155432105064392 以下 0.7124083042144775
Rubyで機械学習してみた 関羽でやってみる $ ruby similar_word.rb train.model 関羽 憂鬱 0.816013514995575 従える
0.7802281379699707 玄徳 0.7487945556640625 張飛 0.7451599836349487 先頭 0.7414117455482483 謝 0.740109920501709 顔 0.7302446961402893 同意 0.7249001860618591 沈痛 0.7155432105064392 以下 0.7124083042144775
Rubyで機械学習してみた 関羽でやってみる $ ruby similar_word.rb train.model 関羽 憂鬱 0.816013514995575 従える
0.7802281379699707 玄徳 0.7487945556640625 張飛 0.7451599836349487 先頭 0.7414117455482483 謝 0.740109920501709 顔 0.7302446961402893 同意 0.7249001860618591 沈痛 0.7155432105064392 以下 0.7124083042144775 Կނ͔Top ༕ᓔ
Rubyで機械学習してみた 張飛でやってみる $ ruby similar_word.rb train.model 張飛 憂鬱 0.760344386100769 関羽
0.7451599836349487 従える 0.7081006765365601 驚く 0.7006173133850098 謝 0.693412721157074 すっかり 0.6737435460090637 かえって 0.6630535125732422 促 0.6543962955474854 顔 0.6533028483390808 左右 0.650241494178772
Rubyで機械学習してみた 張飛でやってみる $ ruby similar_word.rb train.model 張飛 憂鬱 0.760344386100769 関羽
0.7451599836349487 従える 0.7081006765365601 驚く 0.7006173133850098 謝 0.693412721157074 すっかり 0.6737435460090637 かえって 0.6630535125732422 促 0.6543962955474854 顔 0.6533028483390808 左右 0.650241494178772
Rubyで機械学習してみた 張飛でやってみる $ ruby similar_word.rb train.model 張飛 憂鬱 0.760344386100769 関羽
0.7451599836349487 従える 0.7081006765365601 驚く 0.7006173133850098 謝 0.693412721157074 すっかり 0.6737435460090637 かえって 0.6630535125732422 促 0.6543962955474854 顔 0.6533028483390808 左右 0.650241494178772 ͓લ͔
Rubyで機械学習してみた 劉備でやってみる $ ruby similar_word.rb train.model 劉備 大きい 0.7147447466850281 指さす
0.7119417190551758 茶壺 0.6981431245803833 むち 0.6907016634941101 彼女 0.689379096031189 母 0.6783629655838013 起つ 0.6581389307975769 おろおろ 0.6535757780075073 胸 0.6521176099777222 僧 0.6508723497390747
Rubyで機械学習してみた 劉備でやってみる $ ruby similar_word.rb train.model 劉備 大きい 0.7147447466850281 指さす
0.7119417190551758 茶壺 0.6981431245803833 むち 0.6907016634941101 彼女 0.689379096031189 母 0.6783629655838013 起つ 0.6581389307975769 おろおろ 0.6535757780075073 胸 0.6521176099777222 僧 0.6508723497390747
Rubyで機械学習してみた 劉備でやってみる $ ruby similar_word.rb train.model 劉備 大きい 0.7147447466850281 指さす
0.7119417190551758 茶壺 0.6981431245803833 むち 0.6907016634941101 彼女 0.689379096031189 母 0.6783629655838013 起つ 0.6581389307975769 おろおろ 0.6535757780075073 胸 0.6521176099777222 僧 0.6508723497390747 ཱུඋؾ ໌࿕Ͱͨ͠
Rubyで機械学習してみた まとめ ▸ RubyでもPythonのライブラリを使って機械学習 を簡単に出来ました。(ただしパラメータの チューニングは機械学習の知識が必要)