RSSからマルコフ連鎖で文章生成する(Python)

シェアする

マルコフ連鎖自体あんまり理解してないけど、とりあえず実際のソース読んで勉強しようかなーと思ってぐぐったら、一番上に出てきたページが繋がらなかったので、キャッシュからソースコードを拾ってそれをPythonに移植してちょっといじってみた。可変変数久しぶりに見た。

やってること
1) ニュースサイトのRSSを習得
2) そのなかからランダムにエントリーを選んでMeCabへつっこむ。
3) MeCabからの結果をマルコフ連鎖によりつなげて出力。


形態素解析についてはここを読んだ。実際にはMeCabにお任せですが。

# -*- coding: utf-8 -*-
import MeCab
import string
import random
import feedparser
import re
import sys

# http://d.hatena.ne.jp/ytsuchiyama/20071223/p1
rss_url = 'http://pipes.yahoo.com/pipes/pipe.run?_id=jJ9bOEyx3BGtqCG2TqoASA&_render=rss'
feed = feedparser.parse(rss_url)
entry = random.choice(feed.entries)
sentence = re.sub('(<.*?>|\r|\n)','', entry.summary_detail.value)
sentence = sentence.encode(sys.stdout.encoding)

t = MeCab.Tagger('')
m = t.parseToNode(sentence)

wakatigaki = []

while m:
	if m.char_type != 0:
		wakatigaki.append(m.surface)
	m = m.next

if len(wakatigaki) < 2:
	print 'sentence length is not enouth'
	sys.exit()

markov = {}

for i in range(2, len(wakatigaki)):
	if i < len(wakatigaki):
		key1 = wakatigaki[i-2]
		key2 = wakatigaki[i-1]
		if (key1 in markov) == False:
			markov.update({key1 : {key2:[]}})
		if (key2 in markov[key1]) == False:
			markov[key1].update({key2:[]})
		markov[key1][key2].append(wakatigaki[i])

# debug
#for k,i in markov.iteritems():
#	for kk,ii in i.iteritems():
#		for iii in ii:
#			print k, ':', kk, ':', iii

pre1 = wakatigaki[0]
pre2 = random.choice(markov[pre1].keys())
rand = random.randint(0, len(markov[pre1][pre2]) - 1)
suf1 = markov[pre1][pre2][rand]
sentence = pre1 + pre2 + suf1

for i in range(0, 1000):
	try:
		pre1 = pre2
		pre2 = suf1
		rand = random.randint(0, len(markov[pre1][pre2]) - 1)
		suf1 = markov[pre1][pre2][rand]
		sentence += suf1
		if suf1 == '。':
			break;
	except:
		break
print sentence

出力結果

$ python test_markov_chain.py
 ソフトバンクが29日発表した孫正義社長は10月以降についても「基本的に順調にいくだろう」との見通 しを示した。
$ python test_markov_chain.py
 前原誠司国土交通相は29日、日本航空の経営再建問題で、どういった判断で年金を強制的に減額するな どの具体的な話については「機構がどういう判断をするか。
$ python test_markov_chain.py
 2010年3月期通期の業績見通しは、最終損益が714億円の黒字)だった。
$ python test_markov_chain.py
 日本航空は29日午後、企業再生支援を依頼し、事前相談を開始したと発表した。

この例だと、元となる文章が短いのである程度意味が理解できたりそのままの文章になるけど、元の文章を増やしたり、マルコフ連鎖時の単語数を増やしたりごにょごにょいじるととかするとどこかの圧縮新聞みたいになるでしょう。

で、俺は何がやりたかったんだっけな・・・ IRCのBOTだった忘れてた。

これ書いた後にぐぐって MeCabとPythonでマルコフ連鎖を書いてみる(改) | Weboo! Returns. を発見した。参考になります。

Sponsored Link

シェアする

フォローする