お待たせ、待った?(気さくな挨拶)


前回は少なからず反響をいただきまして
誠にありがとうございました。

さて、引き続きメカアンジュを改良していきます。
今回は簡単なリプライ機能をつけるのが目標です。





まずはアンジュ・カトリーナ氏(26)のリプライを収集する。

ただランダムにそれを繰り返すだけでは面白みがないので、
ついでに対応するリプライ先のツイート内容も収集。
それらをニューラルネットワークで深層学習させ
それっぽい内容を自分で考えて組み立てて
それっぽく返信するメカアンジュを目指す。


■ツイートの収集

前回、せっかくTwitterAPIを使えるようにしたので
ここはもったいぶらず贅沢(?)に使っていこうと思う。

予め、別のコンフィグファイルにでもいいので
コンシューマキーやらトークンやらを指定しておいて
以下の感じで収集する。試した環境はPython3.5x。



#保存テキストファイルのフルパス
TWEETS_TXT = r"************"
# ツイートを取得し、テキストファイルに保存する
def get_tweet():
    with open (TWEETS_TXT,"a", encoding="utf-8") as text_file:
                    # ツイートを何ペア取得するか
                    tweets=int(input("取得したいツイート数を入力\n<<"))
                        # アンジュ・カトリーナ氏のTwitterを探す
                    while(True):
                        # APIの残り取得制限数を表示
                        print("API limits:{}".format(api.rate_limit_status()))
                        result = api.search(q='@ from:Ange_Katrina_ -RT' ,lang='ja', count=100)
                        for i, status in enumerate(result):
                            reply_id = status.in_reply_to_status_id
                            orig_id = status.id
                            if reply_id is not None:
                                # リプライ元のツイートを取得
                                # ツイートが保護されていたらTweepErrorを投げられる
                                try:
                                    results = api.get_status(reply_id)
                                except tweepy.error.TweepError:
                                    None
                                else:
                                    # ツイートをサニタイズする
                                    result_text = sanitize.sanitize_text(str(results.text))
                                    reply_text = sanitize.sanitize_text(str(status.text))
                                    print(result_text)
                                    print(reply_text)

                                    #2文字以上のやりとりならテキストファイルに保存
                                    if len(result_text)>=2:
                                        if len(reply_text)>=2:
                                            text_file.write(result_text)
                                            text_file.write("\n")
                                            text_file.write(reply_text)
                                            text_file.write("\n")
                                            tweets = tweets-1
                                            time.sleep(0.5)
                                            #open_jtalk(result_text,"man")
                                            #rospeex(reply_text)
                                            #talk(WAV_FILES)
                                            #WAV_FILES.clear()
                                        # APIの取得制限に引っかからないようにsleepする
                                        print(reply_id)
                                        print("残りツイート数 = {}\n".format(tweets))
                                        if(tweets==0):
                                            exit();




途中に文中のゴミを除去する工程を挟んでいる。
ここで返信コーパスへ整形する。
以下は別ファイル
(sanitize.pyとか)で処理する。




#正規表現によるゴミの除去をおこなうメソッド
def sanitize_text(text):
    #[]内以外の文字にmatchする
    tab = "\n"
    url = r"(https?|ftp)(:\/\/[-_\.!~*'()a-zA-Z0-9;\/?:\@&=\+\$,%#]+)"
    hashtag = r"[#|#]%s"
    reply = "@[a-zA-Z(),_,0-9]+"
    dust = "[^a-zA-Z0-90?9一-?ぁ-んァ-ン!!???~ー…:;:;.・、。「」]"
    #()内の文字ごと()を消す正規表現
    kakko = "\(.+?\)"
    kakko2 = "\(.+?\)"
    space = "\s+"
    dust2 = "\s.\s"
    #last = ".$"

    #改行文字(\n)が存在した場合、消す
    if re.search(tab,text) is not None:
        #print("existed")
        text = re.sub(tab,' ',text)
    #URLが存在した場合、消す
    if re.search(url,text) is not None:
        #print("URL existed")
        text = re.sub(url,'',text)
    #ハッシュタグを消す
    if re.search(hashtag,text) is not None:
        text = re.sub(hashtag,'',text)
    #リプライidを消す
    if re.search(reply,text) is not None:
        text = re.sub(reply,'',text)
    #半角のカッコを中身ごと消す
    if re.search(kakko, text) is not None:
        text = re.sub(kakko, ' ', text)
    #全角のカッコを中身ごと消す
    if re.search(kakko2, text) is not None:
        text = re.sub(kakko2, ' ', text)
    #日本語または?か!で文が終了し、それ以外に余計なものがついている場合、消す
    if re.search(dust, text) is not None:
        text = re.sub(dust, ' ', text)
    #複数のスペースを一つの半角スペースに置き換える
    if re.search(space,text) is not None:
        text = re.sub(space, ' ', text)
    #左右が空白であり、1文字のものを消す
    while(re.search(dust2,text) is not None):
        text = re.sub(dust2, ' ', text)
    #末尾かつ左が空白であり、1文字のものを消す(おはよう !なら「!」が消える)
    #if re.search(last,text) is not None:
    #    text = re.sub(last, '', text)

    return text.strip()



参考文献:https://github.com/hk-nyao/Seq2Seq_tweet_bot




bc5ed888


これである程度きれいに整形されたアンジュ氏の
リプライパターンを分解したコーパスが完成した。
次はこれをニューラルネットワークで
深層学習させ、ちょっと賢くする。