Rubyで作ったTwitterBotの中身について

こんばんは。

ブログを読んでくれてありがとうございます。

 

今回は以前の記事の続編のようなもので、実際のコードなどを交えながら少し説明します。

前回の記事も合わせて読んでくれると嬉しいです。

wakuwinmail.hatenablog.com

 

まず、前回解説した中の、品詞分解についてです。

これは、Rubyのライブラリ(Gem)の中にあるMecab及びNattoを使用しました。

これは日本語の文章を入力すると品詞分解して出力します。

「私はコーヒーが好きです」という文章を入力すると




コーヒー

好き
です

 のように品詞ごとに分けてくれます。固有名詞等が分かれてしまうこともありますが、アニメタイトルなどに特別に対応したライブラリも存在します。今回は特別なものは他に使っていません。

 

次に、前回説明したマルコフ連鎖を上手く使えるように品詞を3つごとに固まりにして保存します。

上の例文なら


  私 は
私 は コーヒー
は コーヒー が
コーヒー が 好き
が 好き です
好き です  

のようにします。

最初と最後が2単語しか入ってないのは、文の始まりと終わりであるということのサインです。コピーして数えれば半角スペースが入ってると思います。固まりの最初か最後に半角スペースが2つ連続するようにして処理をしやすくしています。

 

ここからは実際に単語を繋げる部分の処理についてです。わくわくBotの心臓部みたいなものです。

まずは、上でも書いたように半角スペースが固まりの最初の部分に2つ連続する固まりを選び、これを出力用の配列に追加します。

次に、その2つの単語から始まる固まりを探してその固まりの最後の1単語を出力用の配列の末尾に追加します。

これを繰り返して、固まりの最後が半角スペース2つのものが来るまで出力用の配列を更新します。

 

実際の処理では、検索や結合を行う前に

file.each_line do |words|
        words.chomp!
        if /^ / =~ words then
            head.push(words)
        else
            body.push(words)
        end
    end

 のようにして先頭部分とそれ以外の部分を別配列に入れて検索しやすくしています。

 

出力用文字列生成はここから見られます。ここで一々解説を書くのは煩雑になってしまうので、また別記事に処理部分の解説を載せるかもしれません。

github.com

 

次はリアルタイムでタイムラインを取得することに関する記事にしようと思います。

最後まで読んでくれてありがとうございました。

何かあればhttps://twitter.com/wakuwinmail_Cまでお願いします。