こんにちは!
3ヶ月で、Elixir言語で開発できるようになるため、奮闘中のこーへーです!
vol.4は20時間かかったので、vol.5も覚悟していたんですが1時間ぐらいで終わってしまいましたね。笑
自分で言うのも微妙なんですが、確実に実力がついてきていますね。
ということで、100本ノックvol.5をやっていきたいと思います。
100本ノックの記事はこちら
05. n-gramPermalink
与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.この関数を用い,”I am an NLPer”という文から単語bi-gram,文字bi-gramを得よ.
案の定、問題の意味がわからずn-gramを理解するところから始めました。簡単に言うと、「I am an NLPer」を各単語と文字に区切って要素を2つずつ(bi-gram)格納してね。さらに、それを関数化してくれとのことなので、今まではiexでインタラクティブに試していたんですが、今回は.exファイルに関数を作ることにしました。
モジュール、関数の作成
defmodule NGram do
def bigram_word(input) do
input
|> String.split()
|> Enum.chunk_every(2, 1)
|> Enum.drop(-1)
end
def bigram_string(input) do
input
|> String.codepoints()
|> Enum.filter(fn x -> x != " " end)
|> Enum.chunk_every(2, 1)
|> Enum.drop(-1)
end
end
NGram.bigram_word("I am an NLPer")の実行結果
# 単語区切りのbigram
[["I", "am"], ["am", "an"], ["an", "NLPer"]]
NGram.bigram_string("I am an NLPer")の実行結果
# 文字区切りのbigram
[
["I", "a"],
["a", "m"],
["m", "a"],
["a", "n"],
["n", "N"],
["N", "L"],
["L", "P"],
["P", "e"],
["e", "r"]
]
まとめ
vol.4までは、iexで問題を解いてきました。そのおかげで、ちゃんと関数を作る力がついているんだとvol.5の問題で実感することができました。
n-gramも思ったより時間はかかりましたが、頭の中で解はあったので、かなり楽に感じました。