flexでyahoo形態素解析を使ってみた

やっとこの記事を書ける日が、、、
きっかけは気分が乗ったとある日に形態素解析で遊んでみようと思って
flexなら簡単だとxmlをdategridに表示させようとしたら、、、
いやー時間かかりました(笑)
(自分の技術のなさに軽くショックを受け、、)


とりあえずソースをさらすことを今年の目標にしていたので
突っ込みどころ満載なソースを公開しようと思います。

はまったポイント

これはいろいろな方がblogに書いておられて、色々参考にさせていただきましたが、
書き方が色々パターンがあり結構戸惑いました

  • datagridのdataprovider

これは自分がよくわかっていないだけ、、
ただ、今もあまり自分の中に落ちてないので使いこなせるくらいまで調べたいなと思います。

xml名前空間対応について

結論から言うと名前空間があるxmlは単純にパースができません。
namespaceオブジェクトを使用して、指定するのですが
方法が自分が調べた限りでも3パターンありました。

  • use namespace
  • dafault xml namespace
  • namespace::要素名.namespace::要素名,,,,,

詳細については別途まとめようかと思うのですが
とりあえず私は2番目のdefault xml namespaceのパターンを使いました。


参考サイト
http://weblogs.macromedia.com/akamijo/archives/2006/02/xml_2.cfm
http://pub.ne.jp/Norio/?entry_id=468730
http://d.hatena.ne.jp/Kishi/20070628/1183033689http://www.adamrocker.com/blog/150/amazon_web_service_actionscript30_e4x.html

ソース
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
	<mx:Script>
		<![CDATA[
			private const cgi_url:String = "http://api.jlp.yahoo.co.jp/MAService/V1/parse";
			private const app_id:String = "yahooで登録したID";
			
			private function onClick():void {
				// URL Requestを作り、URLを設定する
				var request:URLRequest = new URLRequest(cgi_url);
				// 送信したいパラメータを設定する
				var params:URLVariables = new URLVariables();
				params.appid = app_id;
				params.sentence = "今日は雨かぁ,,,めんどくさいなぁ";
				params.results = "uniq";
				params.filter = "9"; // 名詞のみを取得
				// パラメータをリクエストに設定する
				request.method = URLRequestMethod.GET;
				request.data = params;
				// URLLoader を作り、イベントを設定する
				var loader:URLLoader = new URLLoader();
				loader.addEventListener(Event.COMPLETE, onComplete);
				// 送信
				loader.load(request);
			}
			// 読み込み完了のとき
			private function onComplete(event:Event):void {
				var loader:URLLoader = event.target as URLLoader;
				// 受信結果を、URLLoader の data から得られる
				var xml:XML = XML(loader.data);
				// 利用するnamespaceを指定
				default xml namespace = new Namespace("urn:yahoo:jp:jlp");
				// 利用するパラメータをarrayにつめる
				var arr:Array = new Array();
				for each(var word:XML in xml.uniq_result.word_list.word) {
					arr.push(
						{
							surface : word.surface, // 形態素の表記
							reading : word.reading, // 形態素の読み方
							pos : word.pos          // 形態素の品詞
						}
					);
				}
				result.dataProvider = arr; // DataGridにassign
			}
		]]>
	</mx:Script>
	<mx:Button x="10" y="10" label="テキスト解析" click="onClick()"/>
	<mx:DataGrid id="result" x="10" y="40" height="341">
		<mx:columns>
			<mx:DataGridColumn headerText="Column 1" dataField="surface"/>
			<mx:DataGridColumn headerText="Column 2" dataField="reading"/>
			<mx:DataGridColumn headerText="Column 3" dataField="pos"/>
		</mx:columns>
	</mx:DataGrid>
</mx:Application>