マルコフ連鎖で文章を作るTypeScriptライブラリを2つ作ってみた
どちらも公開されているコードを参考にTypeScriptでライブラリ化しただけですが。 TinySegmenterを使った1行テキストを生成する版 TypeScript + TinySegmenterでマルコフ連鎖 で紹 […]
広告ここから
広告ここまで
目次
どちらも公開されているコードを参考にTypeScriptでライブラリ化しただけですが。
TinySegmenterを使った1行テキストを生成する版
TypeScript + TinySegmenterでマルコフ連鎖 で紹介したコードを手直ししてライブラリにしました。
npmjs @hidekaomoto/markov-chain-tiny
どれだけの長文を入れても1行しか返さないので、Alexaやチャットボット向けかもしれません。
import MarkovChain from '@hideokamoto/markov-chain-tiny'
const text = `
吾輩わがはいは猫である。名前はまだ無い。
どこで生れたかとんと見当けんとうがつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪どうあくな種族であったそうだ。この書生というのは時々我々を捕つかまえて煮にて食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌てのひらに載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始みはじめであろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶やかんだ。その後ご猫にもだいぶ逢あったがこんな片輪かたわには一度も出会でくわした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙けむりを吹く。どうも咽むせぽくて実に弱った。これが人間の飲む煙草たばこというものである事はようやくこの頃知った。
...`
const markov = new MarkovChain(text)
const sentence = markov.makeSentence()
console.log(sentence)
並び替えているだけなので、意味をなさないこともちょいちょいありますが・・・
$ node examples/index.js
しかもなくされば褐色とびいろでも大きな声であった。
$ node examples/index.js
と毛筆と思った。
$ node examples/index.js
その癖やり出すといい毛並と主人の楽たのない。
$ node examples/index.js
台所へ追い込んだ君も残っても烈しく鼓動している事のちょっと吾輩が最後に至っていしゅつした。
kuromoji.jsを利用した要約作成版
公開されているライブラリが1つありました。 -> https://github.com/uraway/markov-chain-kuromoji
しかし3年ほどメンテナンスがされていない様子でしたので、TypeScriptで使えるようにするのも兼ねてforkしました。
npmjs @hideokamoto/markov-chain-kuromoji
import MarkovChain from '@hideokamoto/markov-chain-kuromoji'
const text = `
吾輩わがはいは猫である。名前はまだ無い。
どこで生れたかとんと見当けんとうがつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪どうあくな種族であったそうだ。この書生というのは時々我々を捕つかまえて煮にて食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌てのひらに載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始みはじめであろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶やかんだ。その後ご猫にもだいぶ逢あったがこんな片輪かたわには一度も出会でくわした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙けむりを吹く。どうも咽むせぽくて実に弱った。これが人間の飲む煙草たばこというものである事はようやくこの頃知った。
...`
const markov = new MarkovChain()
markov.start(5, text)
.then(data => console.log(data))
こちらは文章をある程度要約するような動きをします。
$ node example/indexs.js
わずかに午ごを過ぎたる太陽は、さすがに極きまりが善よくはなかったハハハハ」とそそのかして見給えきっと面白いものがかくまで平気に睡ねむられるものか、ある日その友人で美学とかをやって見たが、気の毒な感じが今でも記憶してますます形勢をわるくするのを誰かが立派な額にしたり、謡うたいを習ったり、頭へ袋をかぶせたり、時によると弓に凝こったり、へっついの中うちで無名の猫だけに気焔きえんを吐く。
使い所
そのまま使うのは結構きびしい気配があります。
ただまぁ、こういうことができるようになっておいたほうが、後々できることの幅が広がりそうかなと思いましたマル