4000万ツイートから名詞を使用頻度の順に取り出す(1)

その質は問わなければ、大体、どんなお題がきても即興漫才や謎かけがロボット自身のコンピュータで、その場で、数秒以内に作成することができるようになった。十分使える。

妻に「漫才やなどかけのレベルは大して高くないんだけれど」というと「それでいいのよ。それが面白いのよ」という。なるほどと、いい意味にとった。

ただ、ロボットが認識できる言葉自体が限られている。ワイルドカードで、どんな言葉でも文章にするほどの知的処理をロボットはローカルでできない。googleのクラウドなどを使えばできるかもしれないが、ライブ会場やテレビの収録場所がネットワークがつながっているとは限らない。

やっぱり、ロボット自身に言葉を認識する能力が欲しい。実は、現時点で約3000語を識別する力は持っている。これで、ずっとネタをやってきているが、それだけの言葉しか対応できないわけではない。多分数万、数十万語のお題に対応できるのだ。そう言うシステムにしたつもりだ。

この認識言葉数の壁、制約を外すためには、新たな言葉を重要性の順に追加する必要がある。で、一体何が重要な言葉なのか。端的に言えば、お客さんが「お題をお願いします」と言ったときに、思いつく言葉である。これを決めなければならない。お客さんは、普段使っている言葉からお題を言うだろう。その場で思いつく言葉である。その場が、どんな場かにも依存する。

そこで、ツイッターで使われている名詞の頻度をカウントすることにした。この間、日々集めているツイート数は4000万ツイートを超えた。これを使うことにする。変な言葉もいっぱいあるが、それらを覗きながら、使用頻度の上位の言葉をロボットが認識できるようにしたい。

単一文章の要約システム(2) : 知的ロボットのセリフを自動で短くする

前回の続きということだが、単にもう一つの例を示すだけである。もう少し長い文章を先のシステムで要約させよう。

本当は前回で終わってよかったのだが、もう一つ例を描きたくなっただけである。次のような文章である。

「離婚とは、婚姻関係にある生存中の当事者同士が、有効に成立した婚姻を婚姻後に生じた事情を理由として将来に向かって解消することをいう」

これを30文字に要約するのは、人間でも一瞬考える。システムの答えは次のようになった。

「離婚とは、有効に成立した婚姻を婚姻後に将来に解消すること」

かなりいい線を言っているが、「将来に」を消さなかったために少し変だが。あるいは、「向かって」を残すべきだった。いや、向かうの点数は低すぎるので、やはり、将来も消すべきだった。向かってを消したときに、将来にも消すようにシステムを改良すべきだが、まあ、当面する、松竹芸能芸人としてのネタ見せが終わってからにしよう。

ログは以下のようになっている。

run:
元文章: 離婚とは、婚姻関係にある生存中の当事者同士が、有効に成立した婚姻を婚姻後に生じた事情を理由として将来に向かって解消することをいう
文字数[61]、目標文字数[30]
---------------------------------------------
<<< phrasesのデータ >>>
[0] => 15
    離婚:名詞:サ変接続:*:*:*:*:離婚:リコン:リコン
    と:助詞:格助詞:引用:*:*:*:と:ト:ト
    は:助詞:係助詞:*:*:*:*:は:ハ:ワ
    、:記号:読点:*:*:*:*:、:、:、
[1] => 2
    婚姻関係:名詞:固有名詞:一般:*:*:*:婚姻関係:コンインカンケイ:コンインカンケイ
    に:助詞:格助詞:一般:*:*:*:に:ニ:ニ
[2] => 3
    ある:動詞:自立:*:*:五段・ラ行:基本形:ある:アル:アル
[3] => 4
    生存:名詞:サ変接続:*:*:*:*:生存:セイゾン:セイゾン
    中:名詞:接尾:副詞可能:*:*:*:中:チュウ:チュー
    の:助詞:連体化:*:*:*:*:の:ノ:ノ
[4] => 14
    当事者:名詞:一般:*:*:*:*:当事者:トウジシャ:トージシャ
    同士:名詞:一般:*:*:*:*:同士:ドウシ:ドーシ
    が:助詞:格助詞:一般:*:*:*:が:ガ:ガ
    、:記号:読点:*:*:*:*:、:、:、
[5] => 6
    有効:名詞:形容動詞語幹:*:*:*:*:有効:ユウコウ:ユーコー
    に:助詞:副詞化:*:*:*:*:に:ニ:ニ
[6] => 7
    成立:名詞:サ変接続:*:*:*:*:成立:セイリツ:セイリツ
    し:動詞:自立:*:*:サ変・スル:連用形:する:シ:シ
    た:助動詞:*:*:*:特殊・タ:基本形:た:タ:タ
[7] => 9
    婚姻:名詞:サ変接続:*:*:*:*:婚姻:コンイン:コンイン
    を:助詞:格助詞:一般:*:*:*:を:ヲ:ヲ
[8] => 9
    婚姻:名詞:サ変接続:*:*:*:*:婚姻:コンイン:コンイン
    後:名詞:接尾:副詞可能:*:*:*:後:ゴ:ゴ
    に:助詞:格助詞:一般:*:*:*:に:ニ:ニ
[9] => 10
    生じ:動詞:自立:*:*:一段:連用形:生じる:ショウジ:ショージ
    た:助動詞:*:*:*:特殊・タ:基本形:た:タ:タ
[10] => 11
    事情:名詞:一般:*:*:*:*:事情:ジジョウ:ジジョー
    を:助詞:格助詞:一般:*:*:*:を:ヲ:ヲ
[11] => 14
    理由:名詞:一般:*:*:*:*:理由:リユウ:リユー
    として:助詞:格助詞:連語:*:*:*:として:トシテ:トシテ
[12] => 13
    将来:名詞:副詞可能:*:*:*:*:将来:ショウライ:ショーライ
    に:助詞:格助詞:一般:*:*:*:に:ニ:ニ
[13] => 14
    向かっ:動詞:自立:*:*:五段・ワ行促音便:連用タ接続:向かう:ムカッ:ムカッ
    て:助詞:接続助詞:*:*:*:*:て:テ:テ
[14] => 15
    解消:名詞:サ変接続:*:*:*:*:解消:カイショウ:カイショー
    する:動詞:自立:*:*:サ変・スル:基本形:する:スル:スル
[15] => -1
    こと:名詞:非自立:一般:*:*:*:こと:コト:コト
---------------------------------------------
主語: [ 離婚とは、 ] 長さ: [ 2 ]
述語: [ 解消すること ] 長さ: [ 6 ]
削減すべき文字数 => [ 31 ]
関連性ウェイトの計算に [ wikipedia ] を使います
主語のウェイトを取得できました
(0) 婚姻関係 => 0.6353335
(1) ある => 0.15152802
(2) 生存 => 0.5595576
(3) 中 => 0.0
(4) 当事者 => 0.49850425
(5) 同士 => 0.2270397
(6) 成立 => 0.6794592
(7) する => 0.0
(8) 婚姻 => 0.76844364
(9) 婚姻 => 0.76844364
(10) 後 => 0.0
(11) 生じる => 0.3153609
(12) 事情 => 0.3992047
(13) 理由 => 0.37157512
(14) 向かう => 0.0
<<関連性レベルの順に並び替え>>
(0) 関連性:0.76844364 語:婚姻
(1) 関連性:0.76844364 語:婚姻
(2) 関連性:0.6794592 語:成立
(3) 関連性:0.6353335 語:婚姻関係
(4) 関連性:0.5595576 語:生存
(5) 関連性:0.49850425 語:当事者
(6) 関連性:0.3992047 語:事情
(7) 関連性:0.37157512 語:理由
(8) 関連性:0.3153609 語:生じる
(9) 関連性:0.2270397 語:同士
(10) 関連性:0.15152802 語:ある
(11) 関連性:0.0 語:中
(12) 関連性:0.0 語:する
(13) 関連性:0.0 語:後
(14) 関連性:0.0 語:向かう
---------------------------------------------
述語につながっていない句はありませんでした
---------------------------------------------
No.13 [ 向かって ] を削減します
No.2 [ ある ] を削減します
No.9 [ 生じた ] を削減します
No.11 [ 理由として ] を削減します
No.10 [ 事情を ] を削減します
No.4 [ 当事者同士が、 ] を削減します
No.3 [ 生存中の ] を削減します
No.1 [ 婚姻関係に ] を削減します
**** 目標の長さになるまで削減しました 長さ = 28 ****
縮減された文章
離婚とは、有効に成立した婚姻を婚姻後に将来に解消すること

単一文章の要約システム(1) : 知的ロボットのセリフを自動で短くする

ネタでは、セリフが冗長と感じさせないためには、セリフの語の長さをだいたい30語程度に抑えないといけない。

ロボットの即興漫才で、その場で与えられたお題に対してネタを作成する場合、あるいは、謎かけの答えを作る場合、自ら持っている様々な知識を駆使して台本にして行くのだが、知識から生成されるセリフが、それよりも長くなっている場合が少なくない。

どうやってそれを狩り込むか。9月の漫才の賞レースm-1では、「〜は」という冒頭から30文字のところで、ぶち切ってやった。これは無理があるので、改善しようということだ。

ここ2、3日色々考えて、ある文章を30文字にする技術は、結構難しい。たくさんの文章があって、その中から大事な文章を選び出して要約するというのはウェッブ上に色々情報があるが、単一文章を処理するというのは、情報が少ない。

菊池 悠太氏が、2016年、東京工業大学に提出した博士論文「 単一文書要約の高度化に関する研究」がある。まだ、ちょっとしか読んでいない。が、参考にさせていただいた。

そんな本格的なものを作ることはさしあたって保留しなければならない。そこでやったことは、簡単なものだ。例えば、肥満の定義が次のようにあったとしよう。

「肥満は一般的に、正常な状態に比べて体重が多い状況、あるいは体脂肪が過剰に蓄積した状況を言う」(wikipediaより)

45文字くらいある。最後は体言止めでいいので、「を言う」は無条件に削る。42文字で、12文字削らなければならない。

これを短くすることを考える。cabochaという自然言語の係り受け解析、構文解析ツールを使って、この文章をparseする。すると、こんな情報を得られる。

[0] => 11
    肥満:名詞:サ変接続:*:*:*:*:肥満:ヒマン:ヒマン
    は:助詞:係助詞:*:*:*:*:は:ハ:ワ
[1] => 10
    一般的:名詞:固有名詞:一般:*:*:*:一般的:イッパンテキ:イッパンテキ
    に:助詞:格助詞:一般:*:*:*:に:ニ:ニ
    、:記号:読点:*:*:*:*:、:、:、
[2] => 3
    正常:名詞:形容動詞語幹:*:*:*:*:正常:セイジョウ:セイジョー
    な:助動詞:*:*:*:特殊・ダ:体言接続:だ:ナ:ナ
[3] => 4
    状態:名詞:一般:*:*:*:*:状態:ジョウタイ:ジョータイ
    に:助詞:格助詞:一般:*:*:*:に:ニ:ニ
[4] => 6
    比べ:動詞:自立:*:*:一段:連用形:比べる:クラベ:クラベ
    て:助詞:接続助詞:*:*:*:*:て:テ:テ
[5] => 6
    体重:名詞:一般:*:*:*:*:体重:タイジュウ:タイジュー
    が:助詞:格助詞:一般:*:*:*:が:ガ:ガ
[6] => 7
    多い:形容詞:自立:*:*:形容詞・アウオ段:基本形:多い:オオイ:オーイ
[7] => 8
    状況:名詞:一般:*:*:*:*:状況:ジョウキョウ:ジョーキョー
    、:記号:読点:*:*:*:*:、:、:、
    あるいは:接続詞:*:*:*:*:*:あるいは:アルイハ:アルイワ
[8] => 10
    体脂肪:名詞:固有名詞:一般:*:*:*:体脂肪:タイシボウ:タイシボー
    が:助詞:格助詞:一般:*:*:*:が:ガ:ガ
[9] => 10
    過剰:名詞:形容動詞語幹:*:*:*:*:過剰:カジョウ:カジョー
    に:助詞:副詞化:*:*:*:*:に:ニ:ニ
[10] => 11
    蓄積:名詞:サ変接続:*:*:*:*:蓄積:チクセキ:チクセキ
    し:動詞:自立:*:*:サ変・スル:連用形:する:シ:シ
    た:助動詞:*:*:*:特殊・タ:基本形:た:タ:タ
[11] => -1
    状況:名詞:一般:*:*:*:*:状況:ジョウキョウ:ジョーキョー

[ ]に入った番号が、句の番号で、矢印の後の数字は、その句がどの句にかかっているかを示している。その下にある情報は、句内の語の構文解析結果である。ここは、多分mecab を使っているのだと思う。ただし、この出力は、cabochaのそのままではなく、parseして、情報を組み直していることをご了解くださいね。こんな出力じゃないなって言わないで。

まず、述語を確定する。これは、主語の最終係り先である。[11]であり、そこが-1になっているのは、それ以上どこにもかかっていないということである。

さらに、どこまでいっても、述語にかからない句は無条件に削除する段取りだが、この文章に、そういう遊びのフレーズはないことがわかる。

そして最後にすることは、各句内の動詞や名詞の語が、主語とどれほど関係が深いかをword2vecという人工知能的ツールを使って分析する。word2vecは、このサイトのいたるところに書いているが、言葉を数字のベクトルに変換するものである。私の場合は、日本語wikipediaの全情報を処理したウェイトと、twitterの2千数百万ツイートを使ったウェイトの二つのデータ(どちらも膨大)を持っている。ウェイトは、200次元ベクトルである。つまり、数十万という言葉が、200次元の数値ベクトルで表されるのである。言語という、魑魅魍魎をベクトルにしてしまう。何という発想。そこは、特殊なニューラルベットワークになっている。

本当に、word2vecはすごいツールなのだが、この考え方やプログラムを無償で公開しているgoogleさんには感謝したい。

word2vecは、近い言葉探しに使われることが多いが、それよりも、与えられた言葉の親近度合い測るのに使うのが、至極便利なのだ。ロボット謎かけ生成でも、散々使った。

そのウェイトを使って、主語のウェイトと各句内にある名詞、動詞との関連性の強さを測って(ベクトル積をとって、平方根を取った)、関連性が弱いものから削っていくということである。

これは、本来、ナップサック問題として解くべきだが、ここでは単純に、文字数が30文字以内になるまで、関係の薄いくから順番に削っていくという方法にしている。

関連性ウェイトの計算に [ wikipedia ] を使います
主語のウェイトを取得できました
(0) 一般的 => 0.5375686
(1) 状態 => 0.4457973
(2) 比べる => 0.39656168
(3) 体重 => 0.67140776
(4) 状況 => 0.4373728
(5) 体脂肪 => 0.6685157
(6) 蓄積 => 0.49764314
(7) する => 0.24754475
<<関連性レベルの順に並び替え>>
(0) 関連性:0.67140776 語:体重
(1) 関連性:0.6685157 語:体脂肪
(2) 関連性:0.5375686 語:一般的
(3) 関連性:0.49764314 語:蓄積
(4) 関連性:0.4457973 語:状態
(5) 関連性:0.4373728 語:状況
(6) 関連性:0.39656168 語:比べる
(7) 関連性:0.24754475 語:する

これが結果で、後半部は、ウェイトの大きな順に並び替えるようにしている。肥満に最も関連性の強い言葉は、体重である。OK!OK!いいじゃない。実に妥当な計算結果になっている。

これで削るのであるが(1)主語は削ってはならない!(2)述語も削ってはならない!(3)同じくに二つのウェイトを持った語がある場合は、そのウェイトの大きな語を尊重しなけばならない。この三つのルールで、句の削除を行った結果は次のようになる。

---------------------------------------------
No.4 [ 比べて ] を削減します
No.7 [ 状況、あるいは ] を削減します
No.3 [ 状態に ] を削減します
**** 目標の長さになるまで削減しました 長さ = 29 ****
縮減された文章
肥満は一般的に、正常な体重が多い体脂肪が過剰に蓄積した状況

というわけで、
肥満は一般的に、正常な状態に比べて体重が多い状況、あるいは体脂肪が過剰に蓄積した状況を言う
を30字以内に要約すると、
肥満は一般的に、正常な体重が多い体脂肪が過剰に蓄積した状況
となる。

日本語の文法的には、「多い」を「多く」に変えるだけで、全く問題なく、ほとんどの情報を失わず、短くなっている。結局、何を削除するのかという問題である。ここに、人工知能的手法が必要なのである。

ロボットのHALに移植したが、正常に稼働した

さしあたって、新しい謎かけのシステムをロボットHALに移してみた。お題をちゃんと素早く解くことができた。(会話などのインターフェイスは、サリーが得意だが、知的処理はHALにやらせる、HALも会話はできるのだが・・・・・・)

ただ、ロボットのjavaのヒープ領域を500mに増やさなければならなかった。システムがでかくなった。

これまで、パソコンでシミュレートしているときにOKだったのに、ロボットに移していろいろな問題を発生するというのが何度もあったので、その都度、ロボットで確認することにしているのだ。特にデータベース絡みでは色々あった。

謎かけは、これで、一連の処理が一段落したので、即興漫才の本体の改良、さしあたって、言語的に自然な文章要約のシステムに移ろうと思う。

ロボットの、コンソール上の出力。ログが多すぎる(笑)

ロボットが認識できる語の全ての謎かけをシステムに作らせた

即興漫才用の謎かけシステム。

基本的に、ほとんどの言葉に謎かけを作らせるシステムを作ったが、さしあたって、サリーがネタ中に認識できるようにしている言葉2600個あまりの言葉について一挙に謎かけを作らせて見た。数分かかった。どのような謎かけを作るかについて、一切制御はしていない。

結果 ==>  nazokake181007

謎かけの質が高いとは言えない。知識がないと理解できなのも多い。意外な謎かけかけになっているものあるので、それが興味深い。研究論文が書けそうだ。

ロボット同士なら笑えるのかもしれない(笑)

各種辞書と、wikipedia、twitterコーパス、word2vecが元になっている。結局、色々な定義や、同音異義語を使うかの基準は、ほとんどword2vecに依存している。そこが人工知能だ。予測できない。

どんなお題が来ても答えを出す。いい答えができないから、できませんでしたではすまない。必ず、作らないといけない。全てに同音異義語が組み込まれている。これは相当難しい。

ネタ見せが近いので、謎かけの方は、一旦ここまでで止めておいて、即興漫才のネタ関連の作業に入る。即興漫才の一部に、この謎かけを組み込むのだが。

コンピュータの作る謎かけが、少し本物っぽく

<<<<<<<< みかん >>>>>>>>> というお題で謎かけを作成します
定義が [ 10 ] ありました
関連性ウェイトの計算に [ wikipedia ] を使います
定義(0) => (0.49267116:ものまねタレント)日本の女性ものまねタレント
定義(1) => (0.34614497:モーニング娘)みかんモーニング娘
定義(2) => (0.34614497:モーニング娘)みかんモーニング娘
定義(3) => (0.4361364:短編小説)大正8年5月に芥川龍之介によって新潮に発表された短編小説である
定義(4) => (0.32149908:音楽)音楽
定義(5) => (0.8420606:ミカン)ミカン、みかん
定義(6) => (0.5774548:愛知県蒲郡市)愛知県蒲郡市の蒲郡市農業協同組合が出荷しているみかんのブランドである
定義(7) => (0.112280846:刊行)まだ刊行されないこと
定義(8) => (1.4E-45:)まだ完成しないこと
定義(9) => (0.48554382:味覚)味覚を感じとる器官
最良定義 [ みかん ] => (6:0.5774548)[ 愛知県蒲郡市の蒲郡市農業協同組合が出荷しているみかんのブランドである ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) 愛知県蒲郡市 => 0.5774548
 [ 蒲郡市農業協同組合 ] のウェイトが取得できませんでした
(2) 出荷 => 0.55663085
[ みかん。 ] 語としての類似度が強すぎるのでスキップ 類似度 = 0.94166666
(4) ブランド => 0.49005154
<<関連性レベルの順に並び替え>>
(0) 関連性:0.5774548 語:愛知県蒲郡市
(1) 関連性:0.55663085 語:出荷
(2) 関連性:0.49005154 語:ブランド
同音異義語を探します word = 愛知県蒲郡市 yomi = あいちけんがまごおりし
同音異義語を探します word = 出荷 yomi = しゅっか
kokugo word0:出荷 yomi:しゅっか ==> word1:出火
同音異義語を解析します
-------------------------------------
定義が [ 1 ] ありました
定義が1個しかないので、それを最良とみなします
最良定義 [ 出火 ] => [ 火事を出すこと ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) 火事 => 0.34050936
<<関連性レベルの順に並び替え>>
(0) 関連性:0.34050936 語:火事
語:出荷 読み:しゅっか 同音異義語:出火 句:火事 スコア:0.34050936
-------------------------------------
謎かけに使えそうな同音異義語とその定義文
同音異義語:出火 定義:火事を出すこと
-------------------------------------
<<謎かけ>>
[ みかん ] とかけて [ 火事を出すこと ] とときます
そのこころは
どちらも [ 出荷 (出火:しゅっか) ] がつきものです

word2vecを使った謎かけ作成アルゴリズムの刷新

データベースを大きく改良したので、それに応じて、謎かけシステムを大幅に改良する。まだ、未完成だが、メモがわりに以下に基本的な手続きを書いておく。データベースとしては、国語辞典、類義語辞典、wikipediaの語彙、wikipedia日本語全文から作ったword2vecベクトル、2500万のツイートコーパスから作ったword2vecベクトルをつかう。どれも、mariadbでデータベース化している。raspberrypi3にも入れることができている。

あまりいい謎かけになっていないが、お題が「ロボット」の例で記述する。まず、出力を示して、のちに説明する。まだ、システム自体も荒削りなので仕方がない。

定義が [ 22 ] ありました
関連性ウェイトの計算に [ wikipedia ] を使います
最良定義 [ ロボット ] => (6:0.83665484)[ 自立歩行する小型ヒューマノイドロボット ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) 自立 => 0.47648025
(1) 歩行 => 0.61083984
(2) 小型 => 0.5767887
(3) ヒューマノイド => 0.83665484
(4) ロボット => 1.0000004
同音異義語を探します word = ヒューマノイド yomi = ひゅうまのいど
最良候補に同音異義語がなかったので、セカンドベストを試みます base:歩行 yomi:ほこう
同音異義語を探します word = 歩行 yomi = ほこう
kokugo word0:歩行 yomi:ほこう ==> word1:浦項
kokugo word0:歩行 yomi:ほこう ==> word1:補考
kokugo word0:歩行 yomi:ほこう ==> word1:補講
Wikipedia word0:歩行 yomi:ほこう ==> word1:葆康
同音異義語を解析します
-------------------------------------
定義が [ 1 ] ありました
定義が1個しかないので、それを最良とみなします
最良定義 [ 浦項 ] => [ ポハン ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) ポ => 0.2070303
(1) ハン => 0.32192305
語:歩行 読み:ほこう 同音異義語:浦項 句:ハン スコア:0.32192305
-------------------------------------
定義が [ 1 ] ありました
定義が1個しかないので、それを最良とみなします
最良定義 [ 補考 ] => [ 本論を補足する考察 ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) 本論 => NaN
(1) 補足 => 0.29759088
(2) 考察 => 0.3297671
語:歩行 読み:ほこう 同音異義語:補考 句:考察 スコア:0.3297671
-------------------------------------
定義が [ 1 ] ありました
定義が1個しかないので、それを最良とみなします
最良定義 [ 補講 ] => [ 補充のための講義 ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) 補充 => 0.22250648
(1) 講義 => 0.15278976
語:歩行 読み:ほこう 同音異義語:補講 句:補充 スコア:0.22250648
-------------------------------------
定義が [ 1 ] ありました
定義が1個しかないので、それを最良とみなします
最良定義 [ 葆康 ] => [ 中華民国・満州国の政治家 ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) 中華民国 => NaN
(1) 満州国 => 0.16425252
(2) 政治家 => 0.121589884
語:歩行 読み:ほこう 同音異義語:葆康 句:満州国 スコア:0.16425252
-------------------------------------
謎かけに使えそうな同音異義語とその定義文
同音異義語:補考 定義:本論を補足する考察
-------------------------------------
<<謎かけ>>
[ ロボット ] とかけて [ 本論を補足する考察 ] とときます
そのこころは
どちらも [ 歩行 (補考:ほこう) ] がつきものです

まず、お題のロボットの定義文は、先に記載のデータベースの中には、22個もある。ロボットと題するチャペックの小説もあり、いろいろだ。ただ、どれを選ぶかが非常に重要だ。お客さんからお題をロボットともらっても、チャペックの小説のことと受け取ったら駄目である。

そこでどうするのか。22個のそれぞれの定義の中に、ロボットという言葉とword2vecで測って、一番近い距離を有する名詞を含んでいる定義を、定義として採用する。ここでは、6番目の定義が、distanceが0.83665484となって一番高く、ロボット一般というよりも、ヒューマノイドロボットの定義になっている。

次に、このロボットの定義の中にある6個の名詞に注目する。その中で、word2vecで測って、最も近い距離の名詞を取り上げる。ただし、お題のロボットと同じ名刺は距離1.0になって一番近くなることは明らかで、謎かけにならないから外す。

そうすると、ヒューマノイドという言葉が、最もロボットと近親性を持つ言葉であることがわかる。そこで、この言葉と同音異義語の言葉を探す。すなわち、先のデータベース全体の中で「ひゅーまのいど」という読みを持って、意味が異なる言葉を探すのである。

もちろん、そんなものはありそうにない。実際、なかった。そこで、セカンドベストで、先の6個の名詞の中で、次に良い、というかロボットとの距離が0.6以上のことばを調べる。すると「歩行」であることがわかる。そこで「ほこう」という同音を持つ異議語をデータベースの中から探す。

すると、4つあることがわかる。この中でまたどれを選ぶかが問題になる。本当は、私としては、大学の講義の補講を選んで欲しいが、その根拠をなかなか作れない。まずさしあたって、各同音異義語の言葉と、定義の中にある名詞の関係が強いものを選び出すというアルゴリズムにした。すなわち、同音異義語が定義の中にある最も高い関連性を持つ名詞の、その距離が一番近いものが、一番、世間的にありそうなもので、共感を得やすいだろうということである。この計算をすると、結局補講ではなく、補考がそれだということになる。

で、結局、最後に次のような謎かけになるわけである。

<<謎かけ>> [ ロボット ] とかけて [ 本論を補足する考察 ] とときます そのこころは どちらも [ 歩行 (補考:ほこう) ] がつきものです

講義を選べばもっと面白くなるが、これではあまり面白くない。ただ、講義の定義「補充のための講義」の補充も、講義も、補講との距離がそれほど近くないために選ばれなかった。もし選ばれたら、

<<謎かけ>> [ ロボット ] とかけて [ 補充のための講義 ] とときます そのこころは どちらも [ 歩行 (補講:ほこう) ] がつきものです

こちらも大して面白くないか(笑)

word2vecのベクトルをwikipediaのものばかりになっていて、それが補講が選ばれない理由のような気がする。wikipediaはある意味、フォーマルなものが、関連性が高くなるが、twitterは、より普段に使われることばを踏まえた関連性スコアになる。まあ、その辺りも改良の余地がある。

twitter データを最初から作り直す

この間、twitterやwikipediaのウェイトデータをmariadbのデータベースにしたり、言葉の距離の近いものをリストする場合のデータを事前作成したりしたが、データ量を減らすために、4文字以上のアルファベットのある言葉を排除してきたり、全てがアルファベットの言葉を排除したりした。この制約が、いろいろ面倒なことになってきた。ので、全て作り直す。10時間くらい浪費するような気がする。

Twitterデータは、その後集めたデータも含めて、最初のコーパスから作り直す。結局、利用する総ツイート数は、
25,188,425ツイート
になった。まだ1億個までは程遠い。ので、毎日せっせと収集スクリプトを動かして集めている。24時間動かし続けて、100万個程度集まるので、1ヶ月かけても1000万しか集まらない。スレッドを複数にして集めようとしたが、結局、twitterがサンプリングしているのは同じのようで、同じものを複数買い集めていることにしかならないので、一個のプログラムでひたすら集めている。

word2vecのdistanceで、入っている任意の言葉のすべてについて、相互の距離を計算するので、計算量は膨大であり、自宅の12コア、24スレッド動くmacで20スレッド程度を並列で動かしてまず、テキストデータを作成し、それを次にmariadbに登録する。

Word2vecをraspberrypiに組み込む方法

M-1が明日なので、ここまでのシステムで挑戦することにして、その後のことを考えている。

今回、他の辞書やwikipedia関連のデータはraspberrypiのmariadbデータベースに組み込めたが、word2vecは色々形を変えて組み込もうとしたが、結局うまくいかず断念した。

冷静に考えると、80万語ものword2vecデータを、ある語の類似の言葉を探すために、ベクトル計算を全体にわたってやるというのがそもそも無理がある。word2vecがやっていることは、例えば、一つの後を200次元のベクトルにして、ある語が与えられた時に、同じように200次元のベクトルを持つ80万語との間の距離をベクトル積で計算して、あたいの大きい20語を選び出すという計算である。こんなことを、パワーのないraspberrypiでせいぜい1秒以内、100m秒くらいで計算させようとするのがそもそも無理なのである。

そこで考えたのは、(1)wikipediaから作ったword2vecのベクトルにも、twitterから作ったそれにも、言葉ではない、ほぼ記号のようなもの、とか、「の」「が」などの助詞系などが結構入っている。どれかはわからないが、それらを除外すること。ただ、大した数ではない可能性がある。

それよりも(2)に、そもそもそんなことをその場で、たとえネタの本番で計算させようとすることに無理があるので、類似語を、80万語の全部にわたって、事前に計算しておいて、それを組み込むといのがある。計算さえて着れば、mariadbに組み込むことができるだろう。そうすれば、近隣語の抽出は、ほぼ、即座にできるはずだ。

そのようなことをやっていけば、もっともっとロボットの漫才は面白くなると思う。基本的な、方向がすでにわかってきたので。

テレパシーでデータを受け取るときの仕様の変更

M-1目前で、昨日からグダグダになっている。その詳細は、余裕がないのでまたいずれ。

ここで、記憶のために書いておくことは、サリーやハル、あるいはそれぞれ同士の間でメッセージをやり取りする場合に、telepathyというプロトコルを使用している。元々は、qichatで制御されるnao同士の間でのやり取りの仕様として開発したが、その後、emilyを積んだhal型のロボットと規格を統一してやり取りできるようにしている。

基本、相手のイベントを発生させるような信号を送るシステムだったが、さらに、メッセージも送れるようにした。送られたメッセージは、$telepathy_dataという変数に自動的に格納されるようにしていたのだが、ここにきて、同時に複数のデータを送るときに、同じ、$telepathy_dataに入れておくと、当然バッティングしてしまう。

だから、以後発生させるイベント名に_dataを付けた変数に格納する。例えば、telepathy_hal_subjectというイベント発生を相手の求めた場合、それにつけている「お題は」(実際は、ネットワークの制約からurlencodeしたものを送っている)というデータは、
$telepathy_hal_subject_data という変数に格納される。こうすれば、同じイベントで違うデータを送ろうとしない限りバッティングしないし(これはあり得ない、訂正とかであり得るかもだが)、やり方も覚えやすい。

naoの組み込みライブラリーの改訂が必要になる。ああ、面倒。

システムが、ハードとソフトにまたがって複雑すぎて、覚えられなくなっている。ので、せめてここに書いて、記憶の助けにする。