マルコフ連鎖で名言を作ろう

はじめに

中学3年生のIです 初めての部誌ですがよろしくおねがいいたします。

マルコフ連鎖って?

マルコフ連鎖とは、

マルコフ連鎖(マルコフれんさ、英: Markov chain)とは、確率過程の一種であるマルコフ過程のうち、とりうる状態が離散的(有限または可算)なもの(離散状態マルコフ過程)をいう。また特に、時間が離散的なもの(時刻は添え字で表される)を指すことが多(略) 何を言っているのかまるでわからないので要約すると、

{width=100%}

こういう感じで文章を作って名言を作ろうという内容です。

最低限の環境を整えよう!

まず私が行ったのはプログラミングができる環境を作ったことです。

必要なもの

  • python(生活必需品)
  • Mecab(文章を分けたりしてくれる)
  • 辞書

こいつらを入れたら、 試しに使ってみましょう!! 私の場合はWindows 10だったためWindows 10以外の人はできないかも知れません。 まずコマンドプロンプトを開いて、

1
2
pip install mecab-python3
pip install ipadic

をしてあげてMecabのインストールをしてあげます(辞書がない場合は個別に入れてね)。

使ってみよう

最低限の環境を整えたら本当に入ってるのか確認するためにMecabを使ってみましょう!!

1
2
3
4
import MeCab

tagger = MeCab.Tagger()
print(tagger.parse("すもももももももものうち").split())

を打ち込んだファイルに.pyをつけてpythonファイルにしてあげて実行する。 そうすると、 こんなかんじになります。

1
['すもも', '名詞,一般,*,*,*,*,すもも,スモモ,スモモ', 'も', '助詞,係助詞,*,*,*,*,も,モ,モ', 'もも', '名詞,一般,*,*,*,*,もも,モモ,モモ', 'も', '助詞,係助詞,*,*,*,*,も,モ,モ', 'もも', '名詞,一般,*,*,*,*,もも,モモ,モモ', 'の', '助詞,連体化,*,*,*,*,の,ノ,ノ', 'うち', '名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ', 'EOS']

では最後に分かち書きをすると、

1
2
3
4
import MeCab

tagger = MeCab.Tagger("-Owakati")
print(tagger.parse("すもももももももものうち").split())

をすると、

1
2
\( python mecab_wakati.py
['すもも', 'も', 'もも', 'も', 'もも', 'の', 'うち']

となりま。。

名言っぽいのを作ってみよう!!

では迷言をつくっていきましょう! とある有名なある御方の言葉を借りて作らせていただきましょう

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import MeCab
import markovify

def main():
    # 匿名Kさんの名言を配列でいれる
    meigen = [
        '30年後の自分は何歳かな',
        'プラスチックの原料って石油なんですよね、意外に知られていないケースがある。',
        '反省をしていると申し上げましたが、反省しているんです。',
        'リモートワークのおかげでリモートできる仕事ができたのはリモートワークのおかげ。',
        '日本は今のままではいけない、だからこそ日本はこのままではいけない。',
        '毎日でもステーキを食べたい。
'
    ]

    mecab = MeCab.Tagger()

    # 上手く解釈できない文字列を定義しておく
    breaking_chars = ['(', ')', '[', ']', '"', "'"]
    # 最終的に1文に収めるための変数
    splitted_meigen = ''

    for line in meigen:
        print('Line : ', line)
        parsed_nodes = mecab.parseToNode(line)

        while parsed_nodes:
            try:
                if parsed_nodes.surface not in breaking_chars:
                    splitted_meigen += parsed_nodes.surface
                if parsed_nodes.surface != '。' and parsed_nodes.surface != '、':
                    splitted_meigen += ' '
           if parsed_nodes.surface == '。':
                    splitted_meigen += '\n'
            except UnicodeDecodeError as error:
                print('Error : ', line)
            finally:
                parsed_nodes = parsed_nodes.next

    print('解析結果 :\n', splitted_meigen)

    model = markovify.NewlineText(splitted_meigen, state_size=2)

    # 文章を生成する
    sentence = model.make_sentence(tries=100)
    if sentence is not None:
        print('---------------------------------------------------')
        print(''.join(sentence.split()))
        print('---------------------------------------------------')
    else:
        print('None')
if __name__ == "__ main __":
    main()'

おわりに

ようやくできました!! で、完成品としては(まともなので)いくつか例をあげてみます

  1. 30年後の自分は毎日でもステーキを食べたいと思っているのかもしれない。
  2. 反省をしていると申し上げましたが、本当に反省しているんです。
  3. プラスチックの原料って石油なんですよね、日本は今のままではいけない

名言、、、?迷言ですね! 一応できたのでよしとします。 ここまでありがとうございました!!

次へじゃんけんの必勝法>
前へネットスラングを分類してみる>