見出し画像

Pythonでマルコフ連鎖で文章生成してみる

python 3.9.0
janome インストール済み
markovify インストール済み

markf_text.py というファイルを作って、その中に、マルコフ連鎖型自動文章生成のプログラムを書く。以下(〇〇さんのプログラムを参考にしました)のプログラムを丸写しでOK。

次に、markf_text.py と同じ場所に test.txt というファイルを作って、中にデータとなる文章を入れておく。

# -*- coding: utf-8 -*- ユニコードUTF-8 で書きました
import random
# 標準モジュール(ライブラリ)から random を読み込む
from janome.tokenizer import Tokenizer
# Janome の中の tokenizer モジュールから Tokenizer を読み込む

# Janomeを使用してテキストデータを単語に分割する
def wakati(text):
   text = text.replace('\n','') #改行を削除 
   text = text.replace('\r','') #スペースを削除 
   t = Tokenizer()
   result =t.tokenize(text, wakati=True)
   return result
 #デフォルトの文の数は5 
def generate_text(num_sentence=5):
   filename = "test.txt"
   src = open(filename, "r").read()
   wordlist = wakati(src)
 
   #マルコフ連鎖用のテーブルを作成 
   markov = {}
   w1 = ""
   w2 = ""
   for word in wordlist:
       if w1 and w2:
           if (w1, w2) not in markov:
               markov[(w1, w2)] = []
           markov[(w1, w2)].append(word)
       w1, w2 = w2, word
 
   #文章の自動生成 
   count_kuten = 0 #句点 「。」の数
   num_sentence= num_sentence
   sentence = ""
   w1, w2  = random.choice(list(markov.keys()))
   while count_kuten < num_sentence:
       tmp = random.choice(markov[(w1, w2)])
       sentence += tmp
       if(tmp=='。'):
           count_kuten += 1
           sentence += '\n' #1文ごとに改行 
       w1, w2 = w2, tmp
    
   print(sentence)
    
if __name__ == "__main__":
   generate_text()

エディタからプログラムを実行する。[Rum]→[Rum Module]でOK。

【出力1回目】
では古株だろう。
彼が仕事を紹介されている男がいたが、彼は両手をポケットに突っ込み、身体をやや前屈みにして歩き続けた。
『技師』はまだ再就職の道を諦めてはいない。
しかし中では古株だろうと石神は推理した。
つまり彼は両手をポケットに突っ込み、身体をやや前屈みにしていた。

おおー!!出来た!出来た!それらしい文章が。今日はここまで。

この記事が気に入ったらサポートをしてみませんか?