テキスト・モーフィングの試み (その1)

テキストモーフィングの試み(その1)


計算機にテキストを生成させる技術の多くは、そこまでの文に続く語を

統計的な手法で導出して文を生成している。


対話型ボットや人工無能と呼ばれる実装の多くはこの方式である。

また圧縮新聞(http://pha22.net/comp/)というテキスト生成プログラムでは、

マルコフ連鎖を用いて、素材となった新聞記事テキストから短くてそれっぽい

けれどよく分からないニュース記事を自動生成している。


ところがこの方法では、長い文章や複雑な文章の生成はうまくいかないことが、

既に知られている[ここ参考文献な]。


長い文章を作る場合、文や段落のトピックモデルをそこまでの履歴として

用いて確率過程を導く方法なども考えられるが、あまりうまくいっていない

ようだ[ここ参考文献な]。


まして、小説という、、意味と文脈と、文脈の連なりによる物語の構造を

持つ長い文章列となると、更にうまくいかない[ここ参考文献な]。


ここで考え方を変えてみよう。


僕の目的は、何かしら小説っぽい文章列ができればよいので、創作をする

必要はない。すでに存在している小説の文章を加工して別の小説が

できれば、それはそれでよい(著作権の問題は別項で議論する)。


たとえば、「長いトンネルを抜けると、そこは雪国だった」という小説をもとに、

「長いワープを抜けたら、銀河の中心部であった」という小説が作れれば、

それはTaking on a journey, a never ending journey と言えるではないか。


そうさ、君は、気づいてしまったね。


さて、ここに、word2vecという道具がある。元になった論文は各自で調べて

もらいたいが、僕にとっては道具であり、実装が転がっているのだから

使わせてもらうまでである。


Pythonの自然言語処理ライブラリのひとつにgensimというものがあり、

その中にword2vecの実装が含まれていて、ひろく使われている。


word2vecを用いると、多数のテキスト(文)を元に学習して、単語の特徴ベクトル

(たとえば200次元)を得ることができる。

この特徴ベクトルは、加算と減算ができるという性質があり、


「king から man を引くと queen になる」


といった計算ができる。


「雪国」に「メーテル」を加えると「銀河鉄道」になるかもしれない。


「機械の身体」になってしまうかもしれないが。


そうなったらそうなったで、鉄の悪魔を叩いて砕いて、新造人間になればいい。


ということで、計算してみよう。


まず、元になる文を集める。特徴ベクトルを作ることが目的なので、小説である

必要はないが、意味が通る日本語の文章である必要はある。


しかし、同じ文化クラスタの文章を集めたほうがよいだろうと考えて、今回は

ネットに転がるSF小説をごっそり集めてみた。


集めて適当に細工してみたところ、390MB、1億語、730万文、になった。


word2vecで処理させるために、一行につき一文にし、Mecabを用いてわかちがきにした。


このデータをword2vecに学習させたところ、Core i3 1.4GHz, メモリ16GBという

マシンで、1時間程度で学習が完了した。


-------

data = word2vec.Text8Corpus('data.txt')

model = word2vec.Word2Vec(data, size=200, workers=2)

-------


このデータを使って、与えられた単語に意味的(学習の元になったテキストの範囲で)に

類似する単語を表示させることができる。


--------

サンプルコード:

model = word2vec.Word2Vec.load("data.bin")


sys.stdout = codecs.getwriter('utf_8')(sys.stdout)


for w in model.most_similar(u"宇宙"):

print "word: %s posibility: %f" % (w[0], w[1])

-------

実行結果:

word: 地球 posibility: 0.645200

word: 銀河 posibility: 0.610561

word: 太陽系 posibility: 0.609918

word: 火星 posibility: 0.585681

word: 銀河系 posibility: 0.570616

word: 惑星 posibility: 0.556648

word: 世界 posibility: 0.555171

word: 星 posibility: 0.539088

word: 木星 posibility: 0.538871

word: 別世界 posibility: 0.496750

-------


単語の演算は以下のようにする。「王女」から「少女」を減算してみる。


------

for w in model.most_similar( positive=[u"王女"], negative=[u"少女"]):

print "word: %s posibility: %f" % (w[0], w[1])

------

word: 国主 posibility: 0.473951

word: 摂政 posibility: 0.471563

....

-----


さて、それでは文に対する加工をしてみよう。元にするテキストは、夏目漱石の

「我輩は猫である」の冒頭部分を使う。


------------------------

 吾輩は猫である。名前はまだ無い。

 どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。その後猫にもだいぶ逢ったがこんな片輪には一度も出会わした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙を吹く。どうも咽せぽくて実に弱った。これが人間の飲む煙草というものである事はようやくこの頃知った。

-------------------------


文の加工の手順は以下とする。


・ Mecabを用いて形態素解析する

・ 名詞、動詞、形容詞を演算対象とする

・ 演算結果の単語が得られない場合(学習された辞書に存在しないなど)は、元の単語をそのまま出力する

・ 演算対象外の語(助詞、助動詞、副詞、記号など)は、そのまま出力する


元の文章列に「猫を減算して、美少女を加算する」と以下のようになる。


---------------------------------------------------------------------------

 才女は美女である。ネームはまだ無かっ。

 何処で美少年たかとんと目星が付かぬ。誰でも明るかっじめじめするたところで美少年むせび泣いているだけは人格するてい。才女は此処ではじめて美女という代物を見せた。しかも後で聞けるとこれは才女という美女なかで最も獰悪な人種であった美人だ。この才女というしかもは時々我らを捕らえて果汁て食えるという美人である。しかしその時代は誰という秀才もないたから別段ヤヴァいとも謳わなかった。ただ彼女の手の平に並べられるてイケメンと押し上げられるたとき何だかフワフワするた美人が有ったばかりである。手の平の下で少し落ち着いて才女の顔立ちを見せたしかもがいわゆる美女という代物の見せグダであろう。このとき清楚な代物だと思うた美人がいまでも写ってい。第五美少年をもって造形謳われるべき筈の顔立ちがつるつるするてまるでケトルだ。後美女にもだいぶ出逢ったがこんな片列には五回も戦わするたことがなかっ。のみ戦えず顔立ちのイケメンがあまりに曲線するてい。そうしてその大穴のなかから時々ぷうぷうと爆炎を吹き付ける。どうも娶せるイケメンて実に浮き足立った。それが美女の呑むタバコという代物であることはようやくこのころ慕った。

---------------------------------------------------------------------------



元の文章列に「猫を減算して、プログラマーを加算する」と以下のようになる。


---------------------------------------------------------------------------


 先達はエンジニアである。名はまだある。

 何処で技術たかとんと目星が付かぬ。誰でもセキュリティーじめじめするたチームで部門愛し合ってユーザだけは記録するており。先達は此処ではじめてプレイヤーというガイドラインを手掛けた。しかもチームで教えるとこれはエンジニアというプレイヤー内で最も獰悪な職業であったエンジニアだ。このエンジニアというハッカーは時々われわれを捕らえてソースて使うというプロジェクトである。しかしその一時期は誰というガイドラインもないたから別段スゴいともみなさなかった。ただエンジニアのマニピュレーターに取り付けられるてコメットと押し上げられるたとき何だかフワフワするたハードウェアが有ったばかりである。マニピュレーターの社内で少し行き詰まってエンジニアの顏を手掛けたハッカーがいわゆるプレイヤーというガイドラインの手掛け部門であろう。このとき画期的なガイドラインだと銘打ったハードウェアがいまでも生き残っており。第1部門をもってセキュリティー行われるべき筈の顏がつるつるするてまるでコンロだ。チームエンジニアにもだいぶやり合ったがこんな片チームには1回も手放さするたことがなかっ。のみチームず顏の社内があまりにパイルするており。そうしてその大穴の内から時々ぷうぷうと火柱を部門。どうも社内せるエンジニアて実に行き詰まった。ガイドラインがプレイヤーの使う外注というガイドラインであることはようやくこのころ関わった。


---------------------------------------------------------------------------


元の文章列に「猫を減算して、天使を加算する」と以下のようになる。


---------------------------------------------------------------------------

 我らは悪魔である。名はまだ無かっ。

 何処で救世主たかとんと目星が付かぬ。誰でも照らすじめじめするたところで合唱むせび泣いているだけは自我するておる。我らは此処ではじめて魔法使いという代物を映した。しかも後で聞けるとこれは勇士という魔法使いなかで最も獰悪な魔法使いであった救世主だ。この勇士という英雄は時々我らを捕らえてマスタードて打ち砕くという昔話である。しかしそのかつては誰という無敵もないたから別段ヤヴァいとも謳わなかった。ただ彼女の手の平に乗せられるてコーと振り上げられるたとき何だかフワフワするた秘めが有ったばかりである。手の平の下で少し落ち着いて勇士の表情を映した英雄がいわゆる魔法使いという代物の映し再来であろう。このとき奇妙な代物だと願った秘めがいまでも生き残っておる。第五極光をもって光り輝く施されるべき筈の表情がつるつるするてまるでジョウロだ。後悪魔にもだいぶ出逢ったがこんな片円陣には五回も傷つかするたことがなかっ。のみ勝てず表情のノルシュトレームがあまりに円柱するておる。そうしてその大穴のなかから時々ぷうぷうと爆煙を吹い。どうも煌めかせるかっこよくて実に傷ついた。それが魔法使いの呑むタバコという代物であることはようやくこのころ慕った。

---------------------------------------------------------------------------



基本的に、少女とか女性とか女体とか団地妻を加算するのが、我々の目指す方向性だと

思うので、そういう方向でのサンプルを作ってみた。


冷静に考えて、出てきたものはまともな文章になっていない。


助詞や助動詞が元のままで、前後の語とのつながりを考慮していないので、当然と

言える。


しかし同時に、何かしらのひらめきの元を感じる文章が出てくることもあり、興味深い。


この操作を、「テキストモーフィング」と呼称することにする。









  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る