Hatena::Groupstudyroom

phaのPHPとか自習室 このページをアンテナに追加 RSSフィード

PHP(CakePHPとか)、JavaScript(AJAXとか)、MySQL、UNIX、Fireworksなんかを身につけたい><
2007 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 12 |
2009 | 01 | 02 | 03 | 04 |
2010 | 01 | 06 |
2011 | 01 |

2007-11-16

2007-11-16 - phaのPHPとか自習室 を含むブックマーク 2007-11-16 - phaのPHPとか自習室 のブックマークコメント

<html>
	<head><meta http-equiv="content-type" content="text/html; charset=EUC-JP" /></head>
	<body>
<?php
	require_once("XML/RSS.php");

	// ChaSenのパス
	$chasen = '/usr/local/bin/chasen';

	# RSSのパス
	$url = "http://www.i-on.gr.jp/~lan/blog/index.rdf";

	$RSS = & new XML_RSS($url);
	$RSS->parse();

	# 形態素解析を行う文章
	$rand = array_rand( $RSS->items );
	$str = $RSS->items[$rand]["description"];

	// 形態素解析をしたい文章を渡しつつ、ChaSenへのハンドルオープン
	$handle = popen ("echo '$str' | $chasen ", 'r');

	// 結果を1行ずつ取得
	while ($get_chasen = fgets ($handle)) {
		// ChaSenの結果がTAB区切りで帰ってくるので¥tで分解
		$kaiseki = split ("¥t", $get_chasen);

		// $wakatigaki 配列へ わかち書きしたデータを格納しておく
		$wakatigaki[] = $kaiseki[0];
	}

	//ハンドルを閉じる
	pclose ($handle);

	if (count($wakatigaki) > 2) {
		// 「2語の接頭語と1語の接尾語」のマルコフ連鎖テーブルを作成
		// $markov{接頭語前}{接頭語後ろ}[no]=接尾語 の形式
		//$markov{$wakatigaki[0]}{$wakatigaki[1]}[]=$wakatigaki[2];

		for ($i = 2 ; $i < count($wakatigaki) ; $i++) {
			if ($i < count($wakatigaki)) {
				$markov{$wakatigaki[$i-2]}{$wakatigaki[$i-1]}[] = $wakatigaki[$i];
			}
		}

	} else {
		print "文章が短すぎてマルコフ連鎖が行えません。<br />";
		exit();
	}

	// マルコフ連鎖テーブルを表示(DEBUG)----------------------------
	print "<pre>";
	print_r ($markov);
	print "</pre>";
	// マルコフ連鎖テーブルを表示(DEBUG)----------------------------

	// マルコフ連鎖で文章生成----------------------------
	// 文章出だしを接頭語前に
	$pre1 = $wakatigaki[0];

	// 接頭語後ろは、接頭語前に続く文字からランダム選択
	$pre2 = array_rand ($markov{$pre1});

	// 接尾語は選択できる中からランダムに選択
	$rand = rand (0, (count ($markov{$pre1}{$pre2}) - 1));
	$suf1 = $markov{$pre1}{$pre2}[$rand];

	$string = $pre1.$pre2.$suf1;

	for ($i=0 ; $i<1000 ; $i++) {
		$pre1 = $pre2;
		$pre2 = $suf1;
		// 接尾語は選択できる中からランダムに選択
		$rand = rand (0, (count ($markov{$pre1}{$pre2}) - 1));
		$suf1 = $markov{$pre1}{$pre2}[$rand];

		if ($suf1 == "EOS¥n") {
			break;
		}

		$string .= $suf1;
	}
	// マルコフ連鎖で文章生成----------------------------

	print $string;
?>
	</body>
</html>