Linuxとかプログラミングとか。

プログラミングとか趣味とかいろいろ発信していく大学生のホームページ。

係り受け解析を用いたtwitter botの作成

calendar

今まで天気予報や災害、運行情報を発信するtwitterのbotを作成してきました。

それらは特定の提供サイトから抽出した情報を(本質的なデータに対して)特に変更を加えることなく呟かせるものでした。

今回は、外部の情報源(ツイート)から抽出した文章に対して、そのまま出力するのではなく、文章に変更(名詞の置換)を加えて新しい文章をつくり、これを発信するようなbotを作成することを試みてみます。

とはいえ、chatbotのような人工知能的な「考えて話す」機能を実装させることができる程の技術もありませんので、「文章に変更を加えることができ、かつ変更された文章は意味の通るものである」程度のものを目標に完成を目指します。

今回はTwitterのAPI周りは今まで作成してきたbotのものを流用したいのでPHPで記述し、ツイート内容構成部に関しては言語処理記述に優れるPythonを用いてコーディングし、これらをシェルスクリプトで実行させる構成にしました。

 

1.処理の定義

1.1.ディレクトリ構成

ディレクトリ構成は

twitter/
–account/
—-(botのid)/
——config.php
——lib/
——–lang_pro/
———-target.txt.cabocha
———-tweet.contains.txt
———-tweet_lib.txt
———-tweet_list.txt
———-tweet_list.txt.cabocha
———-名詞__その他__.txt
———-(省略)
–application/
—-lang_pro/
——lang_pro.php
——lang_pro.py
——lang_pro.sh
–lib/
—-twitteroauth/
——(省略)

とします。

1.2.TwitterAPI周辺

1.2.1.パス・ライブラリ関係

ライブラリ関係を含むパスを変数に格納します。

1.2.2.ツイート取得対象の取得

ツイート取得対象アカウントのidを記述したテキストファイルからidをリストに格納します。

1.2.3.コネクションの確立

ライブラリを利用してAPIのコネクションを確立します。

1.2.4.ツイートの取得

タイムラインから最大100件のツイートを取得します。

1.2.5.ツイート取得の実行

リストに含まれるユーザーそれぞれに対して、ツイート取得を実行します。

1.2.6.ツイートの実行

lang_pro.pyによって生成されたツイート(する内容の)テキストファイルを読み込み、ツイートを実行します。

1.2.7.メイン処理

オブジェクトを生成し、第一引数(オプション)と第二引数(ツイートするアカウント)に対する処理を定義します。

1.3.ツイート内容構成部

係り受け解析の実装については下記のサイトを参考にさせて頂きました。

素人の言語処理100本ノック:40

1.3.1.ライブラリのインポート

1.3.2.形態素クラスの定義

表層形(surface),基本形(base),品詞(pos),品詞細分類1(pos1)の要素を持つMorphオブジェクトの定義をします。

1.3.3.文節クラスの定義

形態素のリスト(morphs),係り先文節インデックス番号(dst),係り元文節インデックス番号のリスト(srcs)の要素を持つChunkオブジェクトの定義をします。

1.3.4.記号の除去

記号を除いた表層形を返します。

1.3.5.品詞の取り出し

文節中に含まれる指定した品詞の表層形のリストを返します。

1.3.6.単語の置換

文節中に含まれる指定した品詞を持つ単語を指定したファイルの中からランダムに一つ選んだ単語と置換して再構成される文字列を返します。

1.3.7.パス・ライブラリ関係

ライブラリ関係を含むパスを変数に格納します。

1.3.8.ツイート解析

ツイートライブラリを解析し、対象の原文と解析したものをそれぞれ別ファイルに保存します。

1.3.8.文節の抽出

一文に含まれる文節クラスのリストを返します。

1.3.9.名詞の抽出

文節中に存在する名詞を使われ方毎に分類し別ファイルに書き込みます。

1.3.10.ツイート内容の構成

任意の文章に対して名詞の置換を行い、ツイートする内容をファイルに書き込みます。

1.3.11.メイン部

lang_proオブジェクトを生成し、ツイート内容を構成します。

1.4.シェルスクリプト

ツイートの取得からツイート文を生成し、それを呟くに至るまでの一連の処理をシェルスクリプトに記述します。

第一引数は、ツイートを実行するアカウントのidです。

2.ツイート生成の例

例えばあるアカウントのツイートから

「吾輩は猫である。名前はまだない」

のようなツイートを取得したとします。この文章中の名詞は、make_tweet()により自身の持つ名詞ライブラリの名詞とランダムに置換され、

「ハシビコロウはNVIDIAである。ドアノブはまだない」(意味不明)

のような文章が生成されます。モデルとなる文章の文構造を解析しそのまま利用した形で文章を構成するため、少なくとも正しい文法に則った文章を生成してくれそうです。しかし文脈も何も考慮されていないので意味不明な発言を連発しています。時々シュールなツイートが生まれるかも?(笑)

3.ソースコード

ソースコードは長いのでGitHubに掲載しました。

https://github.com/ikesan009/yunasu_bot

folder Android

SO-03C Xperia ray をICS化する
more...