ケーズメモ このページをアンテナに追加 RSSフィード

2007-06-20

Yahoo!の形態素解析を利用してみた by Perl

Yahoo!デベロッパーネットワーク - テキスト解析 - 日本語形態素解析

http://developer.yahoo.co.jp/jlp/MAService/V1/parse.html

作業したこと

という流れ。これで簡単に形態素解析ができるようになった(と言ってもローカルにMeCabがあるのだけど)

これからもう少し改良しておくこと

  1. ドキュメントを読んでどういう動作をするか調べる
  2. XMLライブラリについて学ぶ
  3. ファイルサイズの制限を作る
  4. 出力をTemplateモジュールで調整

3は解決済み。1リクエストにつき100KBまでなのでファイルテストでファイルサイズを確かめてリクエスト送るかどうかを分岐。残りはおいおい勉強していきます。

追記

ソースコード張ってませんでした。

#!/usr/bin/perl

use strict;
use Encode;
use YAML;
use LWP::Simple;
use XML::Simple;

# リクエストのベースURL
my $base_url = 'http://api.jlp.yahoo.co.jp/MAService/V1/parse?';

# リクエストする時に必要なアプリケーションキー
my $app_id   = 'your app id';

# 形態素解析したい文
my $sentence ='疾きこと風の如く、徐かなること林の如く、侵掠すること火の如く、動かざること山の如し';

# UTF-8でURLエンコード
$sentence =~ s/([^\w ])/"%" . unpack("H2", $1)/eg;

# リクエストURLの生成
my $req_url = $base_url . "appid=$app_id" . "&results=ma&sentence=" . $sentence;

# GETメソッドでリクエストを送る
# 結果はXML形式で$resに代入される
my $res = LWP::Simple::get($req_url) or die "cannot get content from $req_url";

# XML::SimpleでXMLをパース
my $parser = XML::Simple->new();
my $doc = $parser->XMLin($res);

# リクエストの形式を確認するためにYAML形式でダンプ
print Dump $doc;

即席のものなのでアプリケーションIDと形態素解析したい文章はハードコーディング。ダンプした結果はこんな感じ

---
ma_result:
  filtered_count: 27
  total_count: 27
  word_list:
    word:
      - pos: 形容詞
        reading: はやき
        surface: 疾き
      - pos: 名詞
        reading: こと
        surface: こと
      - pos: 接尾辞
        reading: ふう
        surface: 風
      - pos: 助詞
        reading: の
        surface: の
      - pos: 助動詞
        reading: ごとく
        surface: 如く
      - pos: 特殊
        reading: 、
        surface: 、
      - pos: 特殊
        reading: じょ
        surface: 徐
      - pos: 助詞
        reading: か
        surface: か
      - pos: 動詞
        reading: なる
        surface: なる
      - pos: 助詞
        reading: こと
        surface: こと
      - pos: 名詞
        reading: はやし
        surface: 林
      - pos: 助詞
        reading: の
        surface: の
      - pos: 助動詞
        reading: ごとく
        surface: 如く
      - pos: 特殊
        reading: 、
        surface: 、
      - pos: 名詞
        reading: しんりゃく
        surface: 侵掠
      - pos: 助動詞
        reading: する
        surface: する
      - pos: 名詞
        reading: こと
        surface: こと
      - pos: 名詞
        reading: ひ
        surface: 火
      - pos: 助詞
        reading: の
        surface: の
      - pos: 助動詞
        reading: ごとく
        surface: 如く
      - pos: 特殊
        reading: 、
        surface: 、
      - pos: 動詞
        reading: うごか
        surface: 動か
      - pos: 助動詞
        reading: ざる
        surface: ざる
      - pos: 名詞
        reading: こと
        surface: こと
      - pos: 名詞
        reading: やま
        surface: 山
      - pos: 助詞
        reading: の
        surface: の
      - pos: 助動詞
        reading: ごとし
        surface: 如し
xmlns: urn:yahoo:jp:jlp
xmlns:xsi: http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation: urn:yahoo:jp:jlp http://api.jlp.yahoo.co.jp/MAService/V1/parseResponse.xsd

上記のYAMLを見ればお分かりのように形態素アクセスするには愚直に書くなら

$doc->{ma_result}->{word_list}->{word}->[$i]->{surface}

です。これは面倒なのでXML::LibXMLを使おうかと思います。ですが、そうするとXPathを覚えないといけません。いい機会なので勉強することにします。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証