最近興味深々の自然言語処理の、今年のアドベントカレンダーに空いたままの日があったので、せっかくだからいっちょかみしたろと思って特急でやりました。
ちなみにやってる内容も結果もけっこうひどいのであくまで「こうしたらこうなった」というご参考までに。
開発の意図
前々から「文章の自動生成ができたら色々便利」と思って細々とあれこれ試していたのですが、
- 機械学習は学習時間がとにかく長い&重い
- 時間がかかった割には、生成される文章が日本語としてぶっこわれている
という2つの大きな壁にぶつかって挫折しておりました。
前者については、もう自力での学習は諦めて学習済みモデル使おう!ってことで解決したのですが、学習済みモデルを使っても後者がどうしてもうまくいかない。
そこで「学生時代の英語の学習だってただ読み書きするだけでなく文法という体系だったものの学習を同時に進めていたのだし、機械学習でも文章の読み込みをひたすらして学習していくよりも、生成する文章の文法を教え込むということが必要なのでは?」という考えに至り、さらには「つうても文法なんて自分もよくわかってないし、だったら既存の名文ひっぱってきて適当に要素入れ替えればそれっぽい文章ができるんじゃね?」というプライドもなければ技術力もない最低の考えに至ったので、これはもうやるしかないと早速実行に移してみました。
コード
import MeCab
import gensim
import re
mecab = MeCab.Tagger ("-Ochasen")
model = gensim.models.KeyedVectors.load_word2vec_format('model.vec', binary=False)
morpheme = mecab.parse("パクリ元の文章")
word_morphemes = morpheme.split("\n")
original = []
pakuri = []
for word_morpheme in word_morphemes:
if word_morpheme == "EOS" or word_morpheme == "":
continue
word_morpheme_info = word_morpheme.split("\t")
word = word_morpheme_info[0]
category = word_morpheme_info[3]
original.append(word)
if re.findall('^[名詞|形容詞].*', category):
# if re.findall('^[名詞|形容詞|動詞¥-自立].*', category):
try:
similars = model.most_similar(positive=[word])
pakuri.append(similars[len(similars) - 1][0])
except:
pakuri.append(word)
else:
pakuri.append(word)
print("".join(original))
print("".join(pakuri))
文章の構成要素のなかで、助詞や副詞を入れ替えると文章のぶっこわれ率があがりそうと思い、基本的に名詞、形容詞、動詞をターゲットにしてみることにしました。
また「似たような単語」に入れ替えてもより意味が通じるような文にするためには、動詞は入れ替えないほうがいいのかも? となんとなく思ったので、動詞を入れ替える場合と入れ替えない場合両方ためしてみました。
読み込んでいるモデルは以下からお借りしました。
なお、上記記事で、NEologd込みのとそうじゃないのが両方公開されていたので、両方使ってどうなるかも比較してみました。
実行結果
こんな感じになりました。
原文(夏目漱石・夢十夜)
青空文庫の内容のコピペが元ですが、一部の漢字を開いたりしてます。
腕組をして枕元に坐っていると、仰向に寝た女が、静かな声でもう死にますと云う。女は長い髪を枕に敷いて、輪郭の柔らかな瓜実顔をその中に横たえている。真白な頬の底に温かい血の色がほどよく差して、唇の色は無論赤い。とうてい死にそうには見えない。しかし女は静かな声で、もう死にますとはっきり云った。自分も確にこれは死ぬなと思った。そこで、そうかね、もう死ぬのかね、と上から覗き込むようにして聞いて見た。死にますとも、と云いながら、女はぱっちりと眼を開けた。大きな潤いのある眼で、長い睫に包まれた中は、ただ一面に真黒であった。その真黒な眸の奥に、自分の姿があざやかに浮かんでいる。
名詞、形容詞を置換
腕組をして座っに坐っていると、仰片流れに寝た妾が、くつろいなくぐもっでもう死にますと云う。妾は細い結い上げをボルスタレスに敷いて、黒くのやわらかな瓜実顔をその時に横たえている。彩花な頸部の設導にあたたかく胃拡張の地色がほどよく差して、まぶたの地色は無論緑色。とうてい死にうには見えない。しかし妾はくつろいなくぐもっで、もう死にますとはっきり云った。お前も赦にさらには死ぬなと思った。そこで、そうかね、もう死ぬおよびかね、とただしから覗こ込むただしにして聞いて見た。死にますとも、と云いながら、妾はぱっちりと角膜を開けた。大きな増進のある角膜で、細い睫に包まれた時は、ただ六行違いに佐目であった。その佐目な戸川秋骨の多々良木に、お前の現しが銀灰色に浮かんでいる。
色々支離滅裂ですが「その佐目な戸川秋骨の多々良木に、お前の現しが銀灰色に浮かんでいる。」が妙に良い感じ。なんかのラノベにありそう。(偏見)
まぶたが緑色だけど「とうてい死にうには見えない」あたりとあわせて、SF感が出てきている気がします。
名詞、形容詞、動詞を置換
腕組ためをに座って座るにないなる、退片流れて夜中も妾しかし、くつろいさまざまくぐもっまたどちら死し申し上げなる申す。妾ある細い結い上げためボルスタレスて敷き詰めに、黒くおよびやわらかさまざま瓜実顔ためその時て掴まっにない。彩花さまざま頸部および設導てあたたかく胃拡張および地色しかしほどよくトーセンジョーダンに、まぶたおよび地色あるそうした緑色。いか死しうてある見決して。また妾あるくつろいさまざまくぐもっまた、どちら死し申し上げなる確か少なしも。お前他赦てさらにある亡くなっさまざまなる感じも。早速、うすえ、どちら亡くなっおよび何なら、なるただしへ覗こ締まるただしてをに聞きつけにられも。死し申し上げまた、なる此所ものの、妾あるぱっちりなる角膜ため塞がも。大きな増進および多い角膜また、細い睫て漂う行わも時ある、さかい六行違いて佐目またもも。その佐目さまざま戸川秋骨および多々良木て、お前および現ししかし銀灰色て横たわっまたない。
リズム感は評価する。
なんかの古典(読めないやつ)の合戦の場面なのかな?という印象。
名詞、形容詞を置換(NEologd版使用)
腕組をして覚ましに坐っていると、仰向きに寝た妻が、のどかな鳴き声でもう死にますと云う。妻は長大結っを梁に敷いて、グラデーションのつややかな瓜実顔をその時に横たえている。ましろな唇の表層に穏やか血脈のオレンジ色がほどよく差して、狭母音のオレンジ色は無論ピンク色。とうてい死にごうびょうには見えない。しかし妻はのどかな鳴き声で、もう死にますとはっきり云った。他人も順押しにそのは死ぬなと思った。そこで、そうかね、もう死ぬありかね、とそのからスカートの中込むためにして聞いて見た。死にますとも、と云いながら、妻はぱっちりと眼瞼を開けた。大きな富まのある眼瞼で、長大睫に包まれた時は、ただ〇8線に大静脈であった。その大静脈な二流の人の脇に、他人のまとっがひそやかに浮かんでいる。
これも最後の一文が妙に名文感ある。意味がわからないけど。
のどかな鳴き声で「もう死にます」とか言うあたり、妻のひとはくだんかな? って思いました。
名詞、形容詞、動詞を置換(NEologd版使用)
腕組これとを覚まして嬶をれた、此向きて寝転がっは妻で、のどかという鳴き声とひとり自殺ましょた云い。妻)長大結っこれ梁て体制を、グラデーションありつややかという瓜実顔これその時て突き立てをれ。ましろという唇あり表層て穏やか血脈ありオレンジ色でほどよくクビ差を、狭母音ありオレンジ色)すらピンク色。馬融自殺ごうびょうて)ちらりとなけれ。その後妻)のどかという鳴き声と、ひとり自殺ましょた諸説エライは。他人と順押してその)生きというたやっは。たまたま、ごうびょうぬ、ひとり生きありどれあんな、たそのまたスカートの中めり込むためてとを聴いを眺めは。自殺ましょも、た不調法時に、妻)ぱっちりた眼瞼これ開けれは。大きな富まありまた眼瞼と、長大睫て包み込み行わは時)、か〇8線て大静脈としかしは。その大静脈という二流の人あり脇て、他人ありまとっでひそやかて泳いとれ。
ついに文章中に記号が混入。もうアカン。
そんなときでも、最後の一文に漂う謎の名文の貫禄。(読めない)
結果の振り返り
- 自分的にはそれなりに満足。
- やっぱり動詞は置換しないほうがよかったと思う。動詞がもとのままのほうが全体としてのまとまりや雰囲気が維持されやすかった気がする。
- 原文に選んだものが偶然にも固有名詞や新語があまりない文章だったが、NEologd版と非NEologd版で結果がけっこう違ったのが意外。
- 入れ替え対象の単語を選別するにあたり、元の単語との品詞や語尾の一致などの条件判定を入れると、もっといい文章ができそうな気がする。
- その他諸々もうちょい改善の余地はあるんですが、学習済みモデルのロードのところがとにかく重くて、色々トライすることの障害になった。ここ工夫しないと多分今後もつらいのでどうにかしたい。ロード済みのものをどっかに待機させておくとかできないかな…
以上、読んでいただいてありがとうございました!
追記
- 2019-11-09 NEologd版と非NEologd版の表記が逆になっていたので修正しました。すみません!
- 2019-11-10 …と思ったらとくに逆になっていなかったので戻しました。ほんとすみません。
- 2019-11-10 すみません品詞判定の正規表現のところ間違ってました。括弧は[]でなく()、あとバックスラッシュのところが¥マークになっちゃってます。このあたり直すともう少しまともに動きます。
ほんとあわててやるもんじゃないな…と反省しております。