読者です 読者をやめる 読者になる 読者になる

39Si

プログラミング関連の勉強した内容を簡単にまとめておきます

MeCab による形態素解析とPythonでマルコフ連鎖

Python マルコフ連鎖を利用して文章を生成する

  • 連鎖数は 3
  • 方法は下記のリンクのコードを参考にした。

MeCabとPythonでマルコフ連鎖を書いてみる(改) | Weboo! Returns.

環境

MeCab のインストール

過去に記事にしてるのでここでは省略

Python で Mecabを利用する【mac】 - プログラミングノート

内容

1. データベースの作成

SQLite3 でデータベースを作成する

$ python make_db.py

make_db.py

import sqlite3

# Connect database
conn = sqlite3.connect('markov.db')
c = conn.cursor()

# Create database table
c.execute("create table stocks(word1, word2, word3)")

conn.close()

2. 形態素解析で文章を単語に分ける

$ chmod u+x do_mecab.sh
$ python make_markov_chain.py

do_mecab.sh

#!/bin/sh
echo $*|/usr/local/bin/mecab -Owakati

make_markov_chain.py

import subprocess
import sqlite3

# split word
word_split = '''
'''

# Connect database
conn = sqlite3.connect('markov.db')
c = conn.cursor()


# make markov chain
def make_markov():
    # read sourcefile text.txt
    filename = 'text.txt'
    src = open(filename, 'r').read()

    src_list = src.split(word_split)

    # mecab による形態素解析
    for sentence in src_list:

        # run command
        result = subprocess.getoutput('./do_mecab.sh ' + sentence)
        # print(result)

        word_list = result.split(' ')
        word_list.remove('')  # 不要なデータの削除

        w1 = ''
        w2 = ''
        for word in word_list:
            if w1 and w2:
                c.execute("insert into stocks values(?, ?, ?)", (w1, w2, word))
                # print("insert data", w1, w2, word)
            w1, w2 = w2, word

    # save database
    conn.commit()


# create database table
def create_table():
    c.execute("create table stocks(word1, word2, word3")


# Main
if __name__ == "__main__":
    make_markov()
    conn.close()

3. 登録したデータを利用して文章を作成する。

$ python make_sentence.py

make_sentence.py

import sqlite3

# Connect database
conn = sqlite3.connect('markov.db')
c = conn.cursor()


# create sentence
def create_sentence():
    sentence = ""
    c.execute("select * from stocks order by random() limit 1")
    list1 = c.fetchall()
    w1 = list1[0][0]
    w2 = list1[0][1]
    sentence += w1 + w2

    for i in range(20):
        try:
            c.execute("select * from stocks where word1 = '" + w1 + "' and word2 = '" + w2 + "' order by random() limit 1")
            list2 = c.fetchall()
            w1, w2 = w2, list2[0][2]
            sentence += list2[0][2]
            # print(i, list2)

        except:
            # print("error")
            break
    return sentence


# Main
if __name__ == "__main__":
    # read_csv()
    result = create_sentence()
    print(result)
    conn.close()

参考

github

github.com