LoginSignup
3

More than 3 years have passed since last update.

言語処理100本ノックにElixirでチャレンジ! 5

Posted at

縁あって、東京ですけど、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つの関数を作りました。

  1. gram関数
  2. char_bigram関数
  3. 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についは以下、参照してください。僕もこれから勉強します。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3