霧島マナの日記 鋼鉄のガールフレンド

ケータイはこちら | サイトマップ | 中文 | English

メモ


F.U.N.の総目次
Fanfiction Update Notifierでは、全てにおいて自動化を目指しています。{:rn:}
{:rn:}
例えば、原作タグ。{:rn:}
新たに更新通知がなされると、既存のタグとの類似度を計算し、80%以上なら同じものと見なして追加、類似するタグが見つからなければ新規作成、という風に処理されます。{:rn:}
{:rn:}
また、総目次の作成も自動化しています。{:rn:}
ちょっとくだくだしいですが、なかなか面白いことをやっているのでソースコードを載せてみます。PHPです。{:rn:}
{:rn:}$filename = './tag_cloud.dat';{:rn:}$tags = unserialize( file_get_contents($filename) );{:rn:}{:rn:}require_once 'Cache/Lite.php';{:rn:}{:rn:}$cacheOptions = array ({:rn:}	//キャッシュを置くディレクトリはフルパスで指定する必要がある{:rn:}	'cacheDir' => '/home/*******/tmp/',{:rn:}	'lifeTime' => null{:rn:});{:rn:}{:rn:}foreach( $tags as $key => $value ){{:rn:}	// Yhahoo! APIで「読み」を取得{:rn:}	$cacheId = 'http://jlp.yahooapis.jp/FuriganaService/V1/furigana?appid=******=1&sentence='.rawurlencode($key);{:rn:}{:rn:}	$objCache = new Cache_Lite($cacheOptions);{:rn:}{:rn:}	if ($cache = $objCache->get($cacheId)) {{:rn:}		$buf = $cache;{:rn:}	} else {{:rn:}		$buf = @file_get_contents( $cacheId );{:rn:}		$objCache->save( $buf, $cacheId );{:rn:}	}{:rn:}{:rn:}	$xml = simplexml_load_string( $buf );{:rn:}{:rn:}	$word = $xml->Result->WordList->Word[0];{:rn:}{:rn:}	// ひらがなに変換。なぜかヴだけは変換できないので別処理{:rn:}	if( !$xml ){:rn:}		$tags[$key] = preg_replace( "/ヴ/", "う゛", mb_convert_kana( $key,"cHV", "UTF8" ) );{:rn:}	else if(  $word->Furigana == '' ){:rn:}		$tags[$key] = preg_replace( "/ヴ/", "う゛", mb_convert_kana( (string)$word->Surface, "cHV", "UTF8" ) );{:rn:}	else{:rn:}		$tags[$key] = preg_replace( "/ヴ/", "う゛", mb_convert_kana( (string)$word->Furigana, "cHV", "UTF8" ) );{:rn:}}{:rn:}{:rn:}asort( $tags );{:rn:}{:rn:}// 濁音を取り除くための正規表現{:rn:}$pattern = array('/が/','/ぎ/','/ぐ/','/げ/','/ご/','/ざ/','/じ/','/ず/','/ぜ/','/ぞ/','/だ/','/ぢ/','/づ/','/で/','/ど/','/ば|ぱ/','/び|ぴ/','/ぶ|ぷ/','/べ|ぺ/','/ぼ|ぽ/');{:rn:}$replace = array( 'か',  'き',  'く',  'け',  'こ',  'さ',  'し',  'す',  'せ',  'そ',  'た',  'ち',  'つ',  'て',  'と',  'は',  'ひ',  'ふ',  'へ',  'ほ');{:rn:}{:rn:}$oldInitial = "0";{:rn:}echo "<dl>\n";{:rn:}foreach( $tags as $key => $value ){{:rn:}	$initial = mb_substr( $value, 0, 1 );{:rn:}	$initial = preg_replace($pattern, $replace, $initial );{:rn:}	{:rn:}	if( $initial != $oldInitial ){{:rn:}		$oldInitial = $initial;{:rn:}		echo "<dt>" .$initial . "</dt>\n";{:rn:}	}{:rn:}	{:rn:}	echo "<dd>" . ''. htmlspecialchars( $key ) . "</dd>\n";{:rn:}}{:rn:}echo "</dl>";{:rn:}
{:rn:}
単純にソートしただけでは英数字→ひらがな・カタカナ→漢字、という順番になってしまい、正しく辞書順に並ばないので、まず、バックグラウンドで Yahoo! に問い合わせて「読み」を取得しています。{:rn:}
この際、Yahoo! からはXMLが返ってくるのですが、PHP::PEAR の Cache Lite は XML オブジェクトを直接キャッシュすることができない(シリアライズしてもダメ)ので、文字列としてキャッシュしておきます。実用上はこれで十分でしょう。{:rn:}
尚、キャッシュは無期限にしてあるので、同じ「読み」を二度問い合わせることはありません。{:rn:}
{:rn:}
---{:rn:}
{:rn:}
「たかが目次にずいぶん面倒なことを」と思われるかもしれませんが、項目が増えてきたときのことを考えると、このような自動化には十分意味があるように思われます。{:rn:}
{:rn:}
ただ、Yahoo! がサービスを停止したりだとか、そもそも Yahoo! 自体が無くなってしまったらどうにもなりませんが、まぁ、当面大丈夫でしょう。それよりも F.U.N. が先に無くなってしまう心配をしたほうが良さそうです(^^;{:rn:}

| サイト関連 | 21:37 | comments (0) | trackback (0) |
コメントをどうぞ





この記事のトラックバックURL
http://adrienne.mints.ne.jp/diary/tb.php/43
トラックバック


  
CALENDAR
S M T W T F S
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30   
<<   11 - 2017   >>
Pixiv
ARCHIVES
COMMENTS
TRACBACK
LINKS