[論文読み]ルールベース発話生成と統計的発話生成の融合に基づく対話システムの構築

論文

概要

雑談対話システムにおける発話生成においては、ルールベースで発話を生成するとユーザーの欲求に正確に応答できる可能性があるがドメイン外の発話になった場合に対応できない恐れがある。この研究ではルールベースの対話発話生成手法の比較を行うとともに、ルールベースと統計ベースの発話手法の適切な切り替えをする識別器を作成している。

ルールベース手法性能検証実験

実験用にコーパスを2つ用意している。

  • 雑談対話コーパス
  • Twitterから収集したコーパス

ルールベース発話生成に用いる特徴量は発話中の自立語(名詞、動詞、形容詞、終助詞、連体詞など)以外をワイルドカードとしたパターンマッチルールを作成する

ルールベースの比較実験をするために4つの発話生成手法を提案

  • ルールベース(ルール)
    • TF-IDFで最も近いするルールを選択
  • 文節ペアの係り受けを利用した発話生成(統計)
    • 係り受け構造を統計的に抽出し、発話を生成?
  • 単語間の係り受けを利用した発話生成(統計)
    • 単語間の係り受け関係をテンプレートに入れて発話生成
  • IR-status
    • Twitterの発話に紐づいた返信文を発話とする
  • IR-response
    • Twitterの返信文を発話文として検索する

結果、入力文がコーパス内の発話だった場合、ルールベースの評価が高いがTwitterコーパスのようなオープンな入力文の場合、ルールベースは評価が下がった。

この実験の結論としてはルールベースで応答すべき時はルールベースを使うべきであるが、それ以外の場合は別の手法を使う必要があるということ。

ルールベースと統計ベースの融合

ルールベースと統計ベースを融合するために、ルールベースで応答すべきか否かを判定する識別器を作る。

以下の特徴量をSVMでルールベースを使用すべきか否か識別する。

  • 品詞、語彙体系、単語unigram
  • ルールとの一致度
  • パープレキシティ

結果、雑談コーパスでは78.7%、Twitterコーパスでは53.4%の精度となった。

 

日経Linux2018年3月号にVoiceKitの記事掲載と一部追加執筆を行いました

先月のラズパイマガジンにて執筆を行った、Google AIY VoiceKitの入門記事が日経Linux 2018年3月号に掲載されました。

また、本誌ではラズパイマガジンでは書かれていなかった日本語対応方法について追記が行われています。

ラズパイマガジンを買われた方もそうでない方も是非お買い求めください。

 

日経Linux 2018年 3 月号 – Amazon

OpenJtalkのPythonWrapperを書きました

対したコードではないですが、Raspberry pi等でOpenJtalkを使って音声合成を行う時にいちいちsubprocess呼び出すのがめんどくさかったのでPythonWrapperを書きました。

インストールはこんな感じで

sudo apt-get install -y open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001 open-jtalk
pip install pyjtalk

使い方はこんな感じです

from pyjtalk.pyjtalk import PyJtalk()
p = PyJtalk()
p.say("こんにちは")

ほんとはpip install時にOpenJtalkのビルドも自動化したかったんですけど実力が足りなかった..

コードはここです

garicchi/pyjtalk: OpenJtalk Python Wrapper

https://github.com/garicchi/pyjtalk

ラズパイマガジン2018年2月号でGoogleVoiceKitの記事執筆を行いました

ラズパイマガジン2018年2月号でGoogleVoiceKitの記事を9ページほど執筆しました。

GoogleVoiceKitとはRaspberry piをスマートスピーカーにする拡張キットのことで、音声対話機能をRapberry piに組み込むことができるようになります。

日本で発売されたのは最近ですが最近はマルツパーツなど、電子部品を売っているところでよく見るようになりました。

VoiceKitのお値段は約3000円程なのでRaspberry piをお持ちの方はラズパイマガジンと一緒に購入してみてはいかがでしょうか。

VoiceKitとラズパイマガジンのセットも発売されているようです。

今回はそのVoiceKitのチュートリアルと簡単な応用例を含めた記事を執筆させていただきました。

ラズパイマガジンは全国の書店ほかインターネットでもご購入いただけます。自作スマートスピーカーにご興味のある方はぜひご購入ください。

ラズパイマガジン 2018年2月号 (日経BPパソコンベストムック) - Amazon

Vue.jsとVueRouterとVuetifyでナビゲーション付きページのシンプルなサンプル

Vue.jsとVuetifyでマテリアルデザインなWebアプリをつくろうにもスタートダッシュでかなり躓くのでメモ

CDNのVue.jsではなく単体の.vueをwebpackでコンパイルする方でやります。

まずは各種モジュールのインストール

npm install -g vue-cli
vue init webpack-simple my-app 
cd my-app 
npm install 
npm install vue-router vuetify --save

次にindex.htmlを編集

 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>ui</title>
    <link href='https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons' rel="stylesheet">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
  </head>
  <body>
    <div id="app"></div>
    <script src="/static/build.js"></script>
  </body>
</html>

src/main.jsにvueを使う設定と、ルーティングを記載

今回はPagesフォルダにDashboardとSettingページを作り、それぞれ/と/settingでアクセスできるようにします

import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'
import Vuetify from 'vuetify'

Vue.use(VueRouter);
Vue.use(Vuetify)

import '../node_modules/vuetify/dist/vuetify.css'

import dashboard from './Pages/Dashboard.vue'
import setting from './Pages/Setting.vue'

const routes = [
  {path:'/',component:dashboard},
  {path:'/setting',component:setting}
];

const router = new VueRouter({
    routes
});

new Vue({
  el: '#app',
  render: h => h(App),
  router:router
})

 

App.vueを編集 VuetifyjsのExampleのGoogle Contactsを参考にしました

<template>
  <v-app>
    <v-navigation-drawer
      fixed
      clipped
      app
      v-model="navBar"
    >
        <v-list dense class="pt-0">
          <router-link to="/">
            <v-list-tile>
              <v-list-tile-action>
                <v-icon>dashboard</v-icon>
              </v-list-tile-action>
              <v-list-tile-content>
                <v-list-tile-title>DASHBOARD</v-list-tile-title>
              </v-list-tile-content>
            </v-list-tile>
          </router-link>
          <router-link to="/setting">
            <v-list-tile>
              <v-list-tile-action>
                <v-icon>settings</v-icon>
              </v-list-tile-action>
              <v-list-tile-content>
                <v-list-tile-title>SETTING</v-list-tile-title>
              </v-list-tile-content>
            </v-list-tile>
          </router-link>
        </v-list>
      </v-navigation-drawer>
    <v-toolbar
      dark
      color="primary"
      clipped-left
      fixed
      app
    >
      <v-toolbar-side-icon @click.stop="navBar = !navBar"></v-toolbar-side-icon>
      <v-toolbar-title class="white--text">Title</v-toolbar-title>
      <v-spacer></v-spacer>
      <v-btn icon>
        <v-icon>search</v-icon>
      </v-btn>
      <v-btn icon>
        <v-icon>apps</v-icon>
      </v-btn>
      <v-btn icon>
        <v-icon>refresh</v-icon>
      </v-btn>
      <v-btn icon>
        <v-icon>more_vert</v-icon>
      </v-btn>

    </v-toolbar>
    <v-content>
      <v-container fluid fill-height>
        <v-fade-transition mode="out-in">
          <router-view></router-view>
        </v-fade-transition>
      </v-container>
    </v-content>
  </v-app>
</template>

<script>

  export default {
    name: 'app',
    data () {
      return {
          navBar:null
      }
    },
    mounted: function () {
      
    },
    destroyed: function () {

    }
  }
</script>

<style>
  a {
    text-decoration: none;
  }

</style>

Pages/Dashboard.vueを以下のように

<template>
  <v-container fluid>
    <p>this is dash board</p>

  </v-container>

</template>


<style>
</style>

Pages/Setting.vueを以下に

<template>
  <v-container fluid>
    <p>this is setting</p>

  </v-container>
</template>

これであとは

npm run build

してindex.htmlにアクセスすれば以下のようなページが完成しているはずです