[Python]マルコフ連鎖で自動文章を生成する

Pythonでマルコフ連鎖を利用して自動文章を生成するプログラムを作成したので紹介します。

Python」と「MeCab」というライブラリが必要なので、以下の記事を事前に実施しておいてください。

LinuxにPythonをインストールする手順は以下になります。

あわせて読みたい
LinuxにPython3系をインストールする手順 LinuxにPythonをインストールする手順を紹介します。 LinuxにはデフォルトでPython2.xがインストールされています。 今回はPython3.x系のダウンロード手順になりますの...

MeCabをLinuxにインストール手順は以下になります。

あわせて読みたい
LinuxにMeCabをインストールする手順 LinuxにMeCabをインストールする手順を紹介します。 最終的には、Pythonを使用して「マルコフ連鎖」を使用して自動文章作成ツールを作成したいと思います。 Pythonのイ...
目次

動作環境

今回の動作環境は以下になります。

  • CentOS:CentOS Linux release 7.4.1708 (Core)
  • Python:Python 3.6.3
  • MeCab:MeCab 0.996
  • IPA 辞書:ipadic-2.7.0-20070801

実際のプログラム

実際のプログラムは以下になります。

ファイル名は「markov.py」とします。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random
import MeCab

# MeCab使用してテキストデータを単語に分割する
def wakati(text):
    t = MeCab.Tagger("-Owakati")
    m = t.parse(text)
    result = m.rstrip(" \n").split(" ")
    return result

if __name__ == "__main__":
    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)] = []
                #print('w1 not in markov ', w1)
                #print('w2 not in markov ', w2)
            markov[(w1, w2)].append(word)
            #print('w1 append:', w1)
            #print('w2 append:', w2)
        w1, w2 = w2, word
        #print('w1:', w1)
        #print('w2:', w2)

    # 文章の自動作成
    count = 0
    sentence = ""
    w1, w2  = random.choice(list(markov.keys()))
    while count < len(wordlist):
        tmp = random.choice(markov[(w1, w2)])
        sentence += tmp
        w1, w2 = w2, tmp
        count += 1

    print(sentence)

また今回読み込むテキストデータ以下になります。Wikipediaのビートたけしの内容になります。

1980年代初頭に起こった漫才ブームの中で社会風刺を題材としたシニカルな笑いでツービートは人気を獲得、フジテレビTHE MANZAIやその後継であったオレたちひょうきん族らに出演し番組が大ヒット、一般人、芸能人(特に後輩芸人)問わず未だに発言や行動に多大な影響力をもつ人物の一人。 1990年代頃より司会業や映画監督業が中心で、中には20年以上続く番組がある。
映画監督時や『平成教育委員会』(フジテレビ系列)などの番組では本名の「北野武」名義を用い、その他の番組、映画で出演するときは芸名の「ビートたけし」でタレント活動している。これに関して、2010年(平成22年)5月9日放送『平成教育委員会』では、「アカデミックな場所では『北野武』または『マス北野』、芸人として出る時は『ビートたけし』で使い分けている」との旨を述べた。日本国外では基本的に本名である『Takeshi Kitano(北野武)』だが、『Beat Takeshi Kitano(ビートたけし北野)』と、いう、本名と芸名を併せた名義を使うこともある。
また、絵画では「ビートたけし・北野武」と言う名義で活躍もしている。
立川談志一門でもあり、高座名「立川錦之助」を持つ[注 1]。近年は落語を口演する際、立川談春から一字もらい「立川梅春」を名乗っている。
東京都立足立高等学校から明治大学工学部(現理工学部)機械工学科除籍(のちに特別卒業認定)。元・東京芸術大学大学院映像研究科特別教授(2005年 – 2008年)

好きな文を「text.txt」に書きてます。 ただし、文章が短すぎると動きませんの注意してください。 この辺りは時間を見つけて改修します。

動作確認

実際に動かしてみます。 動作確認は以下になります。
$ python markov.py 
以下が実際の主力になります。
安いため、兼子がツッコミの正統派の掛合い漫才で全く芽が出ず、フランス座の屋根裏部屋で住むことが許されたため、他の芸人が観に行ってしまうので「ツービートが漫才を始めると楽屋が空っぽになる。毒舌の限りを尽くした掟破りのたけしのツッコミネタもさることながら、ボーイズグループの楽器を拝借して生活を凌いでいた2年先輩の兼子二郎からも漫才コ ンビに慎重だったが、『BeatTakeshiKitano(ビートたけし北野)』と、いう、本名と芸名を併せた名義を用い、その他の 番組では『北野武)』と、いう、本名と芸名を併せた名義を使うこともあった。また、当時フランス座の屋根裏部屋で住むことが許されたため、地方キャバレーなども回るようになっていた2年先輩の兼子二郎からも漫才コンビに慎重だったが、 『BeatTakeshiKitano(ビートたけし北野)』と、いう、本名と芸名を併せた名義を用い、その他の番組では「ビートきよ し」を名乗っている。立川談志一門でもあり、高座名「立川錦之助」を芸名とした。コントにこだわった武は漫才コンビに慎重だったが、当時はツッコミ担当で、古臭い漫才師の様式から脱却を図った。日本国外では「松鶴家二郎」)。なお、深見からは出演回数も安定するようになる。毒舌の限りを尽くした掟破りのたけしのツッコミネタもさることながら、ボーイズグループの楽器を拝借していたため、他の芸人が観に行ってしまうので「ツービートが漫才を始めると楽屋が空っぽになる」と評判になった。日本国外では、兼子は「松鶴家次郎」の家号を名乗るが、片方の弟子なので「空」だけとなった。丁度その頃、大阪で頭角を現して来たB&Bのスタイルに触発され、ツービートもスピードを早めて喋りまくるスタイルへ変貌 している。これに関して、2010年(平成22年)コントでの芸能界デビューを模索した。兼子がツッコミの役割も入れ替わった。当初は、兼子がツッコミの役割も入れ替わった。それに呼応するようになる。毒舌の限りを尽くした掟破りのたけしのツッコミネタもさることながら、ボーイズグループの楽器を拝借して生活を凌いでいたという。そして、この頃から「暴走ネタ・危険ネタ」へシフトしていたという。そして、この頃から「暴走ネタ・危険ネタ」へシフトしていき、ボケとツッコミの役割も入れ替わった。また、絵画では本名の「北野武」名義を使うこともある。映画監督時や『平成教育委員会』で使い分けている。東京都立足立高等学校から明治大学工学部(現理工学部)機械工学科除籍(のちに特別卒業認定)。元・東京芸術大学大学院映像研究科特別教授(2005年-2008年)コントでの芸能界デビューを模索した。コントにこだわった武は 漫才コンビに慎重だったが、たけしは「ビートたけし」でタレント活動している。東京都立足立高等学校から明治大学工学部(現理工学部)機械工学科除籍(のちに特別卒業認定)。元・東京芸術大学大学院映像研究科特別教授(2005年-2008年 )5月9日放送『平成教育委員会』で使い分けている。立川談志一門でもあり、高座名「立川梅春」を持つ[注1]。近年は落 語を口演する際、立川談春から一字もらい「立川梅春」を名乗っている」との旨を述べた。それに呼応するようになるが、支配人に認められてからは引き続きフランス座は経営難で、中には20年以上続く番組がある。また、背広一つで稼ぐことができる漫才に魅力を感じていた頃よりも貧窮した(兼子の芸名は「ビートたけし」、兼子が一時コロムビア・ライトの付き人をしている」と評判になっていた。紆余曲折の後、2人はコンビ名を「ツービートが漫才を行ったり、客やホステスに喧 嘩を吹っ掛けたので、度々舞台から降ろされた。紆余曲折の後、2人はコンビ名を「ツービート(twobeat)」へと変更し、たけしは「ビートたけし」でタレント活動して現れたり、型破りな舞台が多いため、地方キャバレーなども回るようになっていた2年先輩の兼子二郎から

まだ、うまいこと句点で文章を修正することができないので修正が必要です。 ※ テーブル作成時に終端文字を定義してあげなればいけないはずです。

参考

参考MeCabとPythonでマルコフ連鎖を書いてみる(改)
自然言語処理の基本と技術 (仕組みが見えるゼロからわかる)posted with カエレバ 奥野 陽,グラム・ニュービッグ,萩原 正人 翔泳社 2016-03-05 Amazon 楽天市場 Yahooショッピング 7net
よかったらシェアしてね!
  • URLをコピーしました!
目次