Python初心者がマルコフ連鎖で吾輩は猫であるをマルコフ連鎖で出力してみる

環境

Windows10 Python 3.8.1

使用したライブラリ

Janomeというライブラリを使わせて頂きました。 MeCabというライブラリもお勧めらしいのですが、Windowsに入れようとすると色々乗り越えなければいけない壁が多いのでこちらのライブラリにしました。

$ pip install janome

で簡単に入れることが出来ます。

コード

# -*- coding: utf-8 -*-

import random
from janome.tokenizer import Tokenizer


# 字句解析
def split_by_word(text):
    # 改行、スペース削除
    text = text.replace('\n', '').replace('\r', '')
    t = Tokenizer()
    result = t.tokenize(text, wakati=True)
    return result


def main(num_sentence=10):
    filename = "../sample.txt"
    src = open(filename, "r", encoding="utf-8").read()
    word_list = split_by_word(src)

    # マルコフ連鎖用のテーブルを作成
    markov = {}
    before_word = ""
    after_word = ""
    for word in word_list:
        if before_word and after_word:
            if (before_word, after_word) not in markov:
                markov[(before_word, after_word)] = []
            markov[(before_word, after_word)].append(word)
        before_word, after_word = after_word, word

    # 文章の自動生成
    # 句点「。」の数
    count_of_period = 0
    num_sentence = num_sentence
    sentence = ""
    before_word, after_word = random.choice(list(markov.keys()))
    while count_of_period < num_sentence:
        tmp = random.choice(markov[(before_word, after_word)])
        sentence += tmp
        if (tmp == '。'):
            count_of_period += 1
            # 1文ごとに改行
            sentence += '\n'
        before_word, after_word = after_word, tmp

    print(sentence)


if __name__ == "__main__":
    main()

生成結果

それっぽいはそれっぽいですかね…

島田たかしまだに髪を算盤珠そろばんに身をもたして笑ったが、臥竜窟の北面を取り囲んでいる歯を情なさけ容赦もなく、近々きんきんの内へ置いている。
ええ面倒だ。
日本の猫なので、天文学者は塵ちり積っている。
吾輩は人間と同じように贅沢ぜいたくは無能の結果であった。
吾輩はちょっと面白いので、椽側一杯にもったいそうろうの身分もあるのかと思って得意と思う頃、もうおとなしくして、瞼まぶたを上に泥棒の無謀を憫笑びんしょうしたが、何の呪まじないになる。
自分で自分の勢力もなかなかえらい馬鹿な真似をしているがすこしもからだが、誰が貰う事になった翌日からまた御話を仕つかまつると云うのは実に感心しています」 うるさいなと思った。
そこで地方の若いものが偉大なる鼻の持主の迷惑になる。

参考リンク

omedstu.jimdofree.com

mocobeta.github.io

夏目漱石 吾輩は猫である