White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

無駄な抵抗改め共起による文章生成4

一応、"「"があるのに"」"がないってのを判定するルーチンを作った。
説明用にアレンジするのもめんどいので判定ルーチンだけそのまま貼ってみる。

# 必要な単語の組み合わせがあるかどうか計算
def calcNotExist(selectWord,wordstat,counts):
	for i in range(len(selectWord)):
		word_i = selectWord[i]
		if word_i == 開始文字 or word_i == 終了文字: continue
		flag = 0 # 0 = false, 1 = OK -1 = NG 
		for word_k in wordstat.getAllYKeys():
			score = float(wordstat.get(word_i,word_k)) / float(counts[word_i]) / 2.0
			if score >= 1:
				flag = -1
				for j in range(len(selectWord)):
					if i == j: continue
					word_j = selectWord[j]
					if word_j == 開始文字 or word_j == 終了文字: continue
					if word_j == word_k:
						flag = 1
						break
				if flag != 1:
					flag = -1
					break
		
		if(flag == -1): # ダメな文法。必要なものがない。
			print u"必要なものがたりません".encode(mecabencode,'ignore'),
			print word_i,
			print word_k
			return 0
	return 1

実行結果

必要なものがたりません 「 」
必要なものがたりません 今日 天気
必要なものがたりません と 言っ
必要なものがたりません 「 」
必要なものがたりません 明後日 でしょ
必要なものがたりません 「 」
必要なものがたりません 言っ が
必要なものがたりません 「 」
必要なものがたりません 明後日 でしょ
必要なものがたりません は た
必要なものがたりません 昨日 でし
必要なものがたりません 昨日 天気
必要なものがたりません お腹 言っ
必要なものがたりません 「 」
必要なものがたりません と が
 「お腹がすいたなぁ」と太郎は言ったのよ。

・・とまあ、こんな感じに出てきます。
ちなみに覚えさせたコーパスは以下の5つなのですが、最後に出てくる文章は前3つに偏ってます。

  • 今日はいい天気です
  • 昨日はいい天気でした
  • 明後日もいい天気でしょう
  • 「お腹がすいたなぁ」と太郎は言った
  • 「そうですね」

基本的に単語数が多いほうが制約が厳しくなりがちで、制約の厳しい文ほど出にくくなります。
この辺を考慮しないと出てくる文章がマンネリ化しそうですね。。。自動修正にするとか、ダメなときは部分修正にするとか・・

追記

現在、ログ収集→文章生成(マルコフ連鎖)→文章適正チェックという順で処理しています。
人工知能の探索って面からみたら、マルコフ連鎖の際に適正チェックをして、だめならバックトラックしたほうがいいですね。はぁ。なんで20年前の本に載ってることができてないんだ私は。