縁あって、東京ですけど、fukuoka.ex でElixir癒されるぅー!と叫んでるYOSUKENAKAO.meです。
普段は、ハッカソン等のイベントの運営をしたり、新規事業が中々うまく進まないといった悩みに対して、バックキャスティング思考のプロセスを導入する事で、社員とチームの生産性を高める教育をし、その後、企業の文化にあったオリジナル教材を開発して定着化させる事の支援をしています。
現在は、世界で活躍できるエンジニアの育成を目指して事業を仕込み中です。
仲間募集中なので、是非、今の日本に一石を投じたい方はDMください。
fukuoka.exのpiacereさんが書かれたElixirのチュートリアルExcelから関数型言語マスター1回目:データ行の”並べ替え”と”絞り込み”
は非常に入りやすい教材なのでお勧めです。第7回まであるので、まだやっていない方は是非トライしてみてください。
言語処理100本ノック
東北大学の 乾・岡崎研究室のトレーニング教材である「言語処理100本ノック」というものを見つけて、学習教材として良さげだったので、Elixirで挑戦して見ました。
言語処理100本ノック
長いので、ちょっとずつ進めて行きます。
ぜひ、皆さん、チャレンジして見てください。そして、こんなやり方もあるよーと教えてください。
1-4までやったのはこちらに書いてあります。言語処理100本ノックにElixirでチャレンジ! 1-4まで
今回はその続きを挑戦!
第1章: 準備運動
05. n-gram
与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.この関数を用い,"I am an NLPer"という文から単語bi-gram,文字bi-gramを得よ.
はい、今回は正直これでいいのかな?と悩みながら、というのもn-gramというのを初めて知ったもので、何それ?
美味しいの?というレベルからの挑戦ですw
という事で、こんなやり方あるよーとか、こう書いたらもっといいよーというのがありましたら、是非教えて下さい。
defmodule N_gram do
def gram(sequence) when is_list(sequence) do
sequence
|> word_to_char
end
def gram(sequence) when is_binary(sequence) do
string_to_list(sequence)
|> char
end
def char_bigram(sequence) do
list = gram(sequence)
[ _head | bigram ] = Enum.zip([["*BOS*"]++list,list])
|>Enum.map( fn x -> (Tuple.to_list(x))end)
bigram
end
def word_bigram(sequence) do
list = word(sequence)
[ _head | bigram ] = Enum.zip([["*BOS*"]++list,list])
|>Enum.map( fn x -> (Tuple.to_list(x))end)
bigram
end
defp word(sequence) do
case is_binary(sequence) do
true -> string_to_list(sequence)|>String.split
false -> sequence
end
end
defp char(sequence) do
string_to_list(sequence)
|> String.split("",trim: true)
|> word_to_char
end
defp word_to_char(list) do
Enum.reduce(list,fn (x, acc) -> acc <> x end)
|> String.codepoints
|> Enum.take_every(1)
end
defp string_to_list(sequence) do
String.replace(sequence,~r/[,.]/,"")
end
end
今回作ったのは、N_gramモジュールに3つの関数を作りました。
- gram関数
- char_bigram関数
- word_bigram関数
gram関数の実行
input = "I am an NLPer"
N_gram.gram(input)
["I", " ", "a", "m", " ", "a", "n", " ", "N", "L", "P", "e", "r"]
char_bigram関数の実行
N_gram.char_bigram(input)
[
["I", " "],
[" ", "a"],
["a", "m"],
["m", " "],
[" ", "a"],
["a", "n"],
["n", " "],
[" ", "N"],
["N", "L"],
["L", "P"],
["P", "e"],
["e", "r"]
]
word_bigram関数の実行
N_gram.word_bigram(input)
[["I", "am"], ["am", "an"], ["an", "NLPer"]]
言語処理って面白い!
さて、言語処理系に縁がなかったので、今回まだ5ですが、面白いなぁ、と実感しつつ、
同時に大変!w
と思っていた所、なんでも、自然言語処理系が簡単に扱えるCOTOHA APIというものがあるらしいぞ!という事を知ったので、言語処理100本ノックを続けつつ、COTOHA APIをElixirから動かすのもチャレンジして行きたいと思います。
COTOHA APIについは以下、参照してください。僕もこれから勉強します。