LoginSignup
3
4

More than 3 years have passed since last update.

【会話入門】会話しつつ学習するアプリ♪

Last updated at Posted at 2019-09-16

昨夜のテキスト入力‐音声応答の会話アプリに自動学習機能を追加しました。
この機能の追加するために学習のための会話履歴の読み込みにCSVファイルを読み込んで学習できるように変更しました。
あとは、学習‐会話という単純なアルゴリズムから、学習‐会話―無入力―学習―会話―...という継続的に前の会話履歴を含めて学習して、次の会話に反映するようにアルゴリズムを変更しました。

やったこと

・CSVファイルの入出力
・アルゴリズム変更(解説)

・CSVファイルの入出力

まず、会話履歴の取得は以下のコードでやりました。
コードは簡単ですが、ググってもあまり出てきません。
肝心な部分は、以下の三点です。
①書き込みを'w+'ではなく、追加書き込みである'a'とする
②newline=''とすること
③writer.writerow({line})と{}でくくるとエクセルの最初のカラムにまとめて記載してくれます

    with open('conversation_.csv', 'a', newline='') as f: #a+ #w
        writer = csv.writer(f)
        while True:
            print(line)
            writer.writerow({line})

一方、会話履歴を読み込んで学習する部分の変更は以下のとおりです。
こちらの読み込みはググれば出てきます。
そのあと分離して、questionsに一個ずつ入れました。

    questions = []
    with open('conversation_.csv') as f:
        cols = f.read().strip().split('\n')
        for i in range(len(cols)):
            questions.append(mecab.parse(cols[i]).strip())

アルゴリズム変更(解説)

コード全体は以下に置きました。
something2speak/auto_train_conversation.py

構造は以下のとおり、シンプルです。
ひらがな文を音に変換して出力します。
以下のconversationで使われます。

def text2speak(num0):

このconversationが主に会話するアプリです。
話者のテキスト入力と類似した会話履歴(questions)にある文章をTFIDFしたvecsと類似度検索してランキングして出力します。
テキスト入力が何もない状態でリターンすると、終了します。
話者のテキスト入力を新たな会話履歴としてconversation_.csvに追加保存していきます。
このconversation関数が終了すると保存して閉じられます。

def conversation(questions,vecs):

会話履歴を読み込んでquestionsに入れて戻します。

def train_conv(mecab):
    questions = []
    with open('conversation_.csv') as f:
        cols = f.read().strip().split('\n')
        for i in range(len(cols)):
            questions.append(mecab.parse(cols[i]).strip())
    return questions

mecabを定義して、ストップワードを読み込んでいます。
今回は、ストップワードは固定としています。

mecab = MeCab.Tagger("-Owakati" + ("" if not args.dictionary else " -d " + args.dictionary))
stop_words = []
if args.stop_words:
    for line in open(args.stop_words, "r", encoding="utf-8"):
        stop_words.append(line.strip())

コントロール部分は単に回しているだけです。
それぞれを呼んでるだけ。。。

while True:
    questions = train_conv(mecab)
    vectorizer = TfidfVectorizer(token_pattern="(?u)\\b\\w+\\b", stop_words=stop_words)
    vecs = vectorizer.fit_transform(questions)
    conversation(questions,vecs)

結果

特に前の記事と変わりませんが、やはりどんどん会話が追記されているので面白いです。
すこし、やり始めたcsvファイルを以下に置きました。
以下がスタート時点です。
something2speak/data/single_sentences.txt
以下が少し会話した後の会話履歴です。
something2speak/data/conversation_.csv
今は、テキスト入力がまんま追記されていくのですが、TwitterやLine使って多くの人のつぶやきや会話を履歴として追記するとあっというまに会話データが作成できそうです。

まとめ

・会話しつつ学習するアプリになりました

・まだまだ会話は未成熟です
・会話履歴保存の重複を避ける処理の必要性を検討する
・自分の発言くらいは覚えておいて、次の発言に反映したい

おまけ

会話見るとまだまだだけど、。。
※以下は必要な部分だけ抜き出しています。

> 運動って何しようかな
(0.35): じゃ 、 行こ う か

> どこ行くの
(0.00): まあ まあ

> まあ、まあ、って、どこ行きたいの
(0.30): できれ ば ドライブ 行き たい です ね

> 山がいい、それとも海がいいですか
(0.48): どんぶり でも いい か な

> なんだよ何か食べたいの
(0.51): ラーメン 食べ たい な

> じゃ、ラーメン食べに行こうか
(0.80): じゃ 、 行こ う か

> はい
(0.00): エビ 天丼 好き です

> なんか静かな夜ですね
(0.28): そう な ん だ 、 ウワン さん は 暇 な ん だ ね

> そうでもないけど、夜はゆっくりしたいな
(0.30): カレーライス が 食べ たい な

> これから食べると太るよ
(0.14): いい 感じ だ よ

> 出来たかもしれないね
(0.43): そう だ ね 、 自分 で 運動 する の が いい かも ね

> じゃ、明日は自転車に乗ろうかな
(0.45): じゃ 、 行こ う か

> 一緒に行ってくれるの
(0.40): 釣り は 行っ た こと あり ます か

> 釣りは子供のころは行ったけど今はいかないなぁ
(0.46): 釣り は 行っ た こと あり ます か

> 行きたいの
(0.55): できれ ば ドライブ 行き たい です ね
3
4
0

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
  3. You can use dark theme
What you can do with signing up
3
4