新しい元号が決まり
令和
その由来は「万葉集」ということで
今回は万葉集のデータを使って
文章生成で遊んでみました。
まずは
万葉集のデータを用意しましょう。
テキストでも
エクセルでも
なんでも良いです。
手に入れたら
Pythonの文字列型にしておきましょう。
自分は一旦リストに格納してから
これを連結しました。
さて、今回は
マルコフ連鎖というものを用いて
文章生成を行います。
マルコフ連鎖とは・・・
wikiによると
マルコフ連鎖 出典:
フリー百科事典『ウィキペディア(Wikipedia)』
マルコフ連鎖(英: Markov chain)とは、
確率過程の一種であるマルコフ過程のうち、
とりうる状態が離散的なものをいう。
また特に、時間が離散的なものを指すことが多い。
マルコフ連鎖は、未来の挙動が現在の値だけで決定され、
過去の挙動と無関係である。
各時刻において起こる状態変化に関して、
マルコフ連鎖は遷移確率が過去の状態によらず、
現在の状態のみによる系列である。
特に重要な確率過程として、
様々な分野に応用される。
・・・・
ちょっと何言ってるか
わかんないっす!!!
簡単にいうと
次の図のように

文章をたくさん読み込んだ後にある一節を取り出し
そこに繋がる単語(文章)などを確率で選んで
どんどん文をつなげます。
句読点などの文の終わりに続くものが選ばれたら
そこで一文が終了となります。
よく使われる言い回しは
たくさん出てきてしまう感じですね。
さて
マルコフ連鎖を
Pythonで取り扱う場合は
markovify というライブラリが必要です。
pip install markovify
などでインストールできます。
使い方も簡単です。
ライブラリを読み込んで。
文章を文字列型にして
それを使ってマルコフモデルを生成します。
マルコフモデルを作ったら
あとは文章生成です。
これも非常に簡単で
マルコフモデルのメソッド
make_short_sentence(文字数,max_overlap_ratio=かぶり率)
とすると文が生成されます。
かぶり率のデフォルトが0.7
70%は元の文章とかぶるようですね。
元の文章と全く同じにならないような文にするには
このかぶり率を下げるといいでしょう。
下げすぎた場合は
文章が生成できないことがあり
その際は None が返ってきてしまいます。
古文だから
11個文章を作るようにしました。
ソースはこちら
単に文章だけを生成すると
読み方がわからないので
別途読み方用の辞書も用意して
生成された文章に当てています。
結果は
それっぽいのが
できていますかね?
万葉集読んだことないので
正しいかどうかはわかりません。
元の歌と被っているところも多いと思います。
なので
あんまり使えないプログラムではあります。
なぜこんなものを作ったかというと
古文イレブン
言いたかった!!!!
ただそれだけです。
終
令和
その由来は「万葉集」ということで
今回は万葉集のデータを使って
文章生成で遊んでみました。
まずは
万葉集のデータを用意しましょう。
テキストでも
エクセルでも
なんでも良いです。
手に入れたら
Pythonの文字列型にしておきましょう。
'篭毛與 美篭母乳 布久思毛與 美夫君志持・・・
此岳尓 菜採須兒 家吉閑名 告紗根 虚見津
山跡乃國者 押奈戸手 吾許曽居 師吉名倍手
吾己曽座 我許背齒 告目 家呼毛名雄母', '山常庭 村山有等 取與呂布 天乃香具山
騰立 國見乎為者 國原波 煙立龍
海原波 加萬目立多都 怜A國曽 蜻嶋 八間跡能國者',
自分は一旦リストに格納してから
これを連結しました。
text = '.\n'.join(m_list)
さて、今回は
マルコフ連鎖というものを用いて
文章生成を行います。
マルコフ連鎖とは・・・
wikiによると
マルコフ連鎖 出典:
フリー百科事典『ウィキペディア(Wikipedia)』
マルコフ連鎖(英: Markov chain)とは、
確率過程の一種であるマルコフ過程のうち、
とりうる状態が離散的なものをいう。
また特に、時間が離散的なものを指すことが多い。
マルコフ連鎖は、未来の挙動が現在の値だけで決定され、
過去の挙動と無関係である。
各時刻において起こる状態変化に関して、
マルコフ連鎖は遷移確率が過去の状態によらず、
現在の状態のみによる系列である。
特に重要な確率過程として、
様々な分野に応用される。
・・・・
ちょっと何言ってるか
わかんないっす!!!
簡単にいうと
次の図のように

文章をたくさん読み込んだ後にある一節を取り出し
そこに繋がる単語(文章)などを確率で選んで
どんどん文をつなげます。
句読点などの文の終わりに続くものが選ばれたら
そこで一文が終了となります。
よく使われる言い回しは
たくさん出てきてしまう感じですね。
さて
マルコフ連鎖を
Pythonで取り扱う場合は
markovify というライブラリが必要です。
pip install markovify
などでインストールできます。
使い方も簡単です。
ライブラリを読み込んで。
文章を文字列型にして
それを使ってマルコフモデルを生成します。
import markovify text_model = markovify.Text(text)
マルコフモデルを作ったら
あとは文章生成です。
これも非常に簡単で
マルコフモデルのメソッド
make_short_sentence(文字数,max_overlap_ratio=かぶり率)
とすると文が生成されます。
かぶり率のデフォルトが0.7
70%は元の文章とかぶるようですね。
元の文章と全く同じにならないような文にするには
このかぶり率を下げるといいでしょう。
下げすぎた場合は
文章が生成できないことがあり
その際は None が返ってきてしまいます。
古文だから
11個文章を作るようにしました。
ソースはこちら
# マルコフ連鎖で生成
r_dict = {}
for _ in range(1000):
result = text_model.make_short_sentence(50,max_overlap_ratio=0.7)
if result is not None:
r_dict[result]=''
if len(r_dict)==11:
break
for i,t in enumerate(r_dict.keys(),start=1):
print(i)
for g in t.replace('.','').split(' '):
print(g,'\t',yomi_dict.get(g))
print()
単に文章だけを生成すると
読み方がわからないので
別途読み方用の辞書も用意して
生成された文章に当てています。
結果は
1 河上乃 かはかみの 伊都藻之花乃 いつものはなの 何時々々 いつもいつも 来座吾背子 きませわがせこ 時自異目八方 ときじけめやも 2 足桧木之 あしひきの 山菅根之 やますがのねの 懃 ねもころに 不止念者 やまずおもはば 於妹将相可聞 いもにあはむかも 3 暮月夜 ゆふづくよ 暁闇夜乃 あかときやみの 朝影尓 あさかげに 吾身者成奴 あがみはなりぬ 玉蜻 たまかぎる 髣髴所見而 ほのかにみえて 徃之兒故尓 いにしこゆゑに 4 待君常 きみまつと 庭耳居者 にはのみをれば 打靡 うちなびき 吾黒髪尓 わがくろかみに 霜乃置萬代日 しものおくまでに 5 國遠 くにとほみ 直不相 ただにはあはず 夢谷 いめにだに 相見与 あふとみえこそ 我戀國 あがこふらくに 6 現 うつつには 直不相 ただにはあはず 夢谷 いめにだに 吾尓所見社 われにみえこそ 相日左右二 あはむひまでに 7 天降就 あもりつく 神乃香山 かみのかぐやま 打靡 うちなびき 春去来者 はるさりくれば 小竹之末丹 しののうれに 尾羽打觸而 をはうちふれて 鴬鳴毛 うぐひすなくも 8 劔大刀 つるぎたち 名之惜毛 なのをしけくも 吾者無 われはなし 不相日數多 あはぬひまねく 年之經者 としのへぬれば 9 三吉野之 みよしのの 御金高尓 みかねがたけに 間無序 まなくぞ 雨者落云 あめはふるといふ 不時曽 ときじくぞ 雪者落云 ゆきはふるといふ 其雨 そのあめの 無間如 まなきがごと 隈毛不堕 くまもおちず 思乍叙来 おもひつつぞくる 其山道乎 そのやまみちを 10 於保伎美乃 おほきみの 美己等可思古美 みことかしこみ 可奈之伊毛我 かなしいもが 多麻久良波奈礼 たまくらはなれ 阿夜尓可奈之毛 あやにかなしも 11 吾妹兒尓 わぎもこに 相坂山之 あふさかやまの 皮為酢寸 はだすすき 穂庭開不出 ほにはさきでぬ 戀乎吾為 こひをぞあがする 玉蜻 たまかぎる 直一目耳 ただひとめのみ 視之人故尓 みしひとゆゑに
それっぽいのが
できていますかね?
万葉集読んだことないので
正しいかどうかはわかりません。
元の歌と被っているところも多いと思います。
なので
あんまり使えないプログラムではあります。
なぜこんなものを作ったかというと
古文イレブン
言いたかった!!!!
ただそれだけです。
終

コメントする