読者です 読者をやめる 読者になる 読者になる

Jumanメモ

jumanのPerlからの使い方についてのメモを書いておく。

#! /usr/bin/env perl

# 文字をUnicodeで扱う
use encoding 'euc-jp';

# 文字を全角変換
use Unicode::Japanese;

use IO::Handle;
use IPC::Open2;

use Juman;

use strict;
use warnings;

my $sentence = '機械学習の研究は簡単そうに見えて意外と難しい。';

# もし、予想外の例外が発生したら、evalでトラップする
my ($reader, $writer) = (IO::Handle->new, IO::Handle->new);
my $pid = open2($reader, $writer, 'juman -e2 -B');
binmode($reader, ':encoding(euc-jp)');
binmode($writer, ':encoding(euc-jp)');

# Unicode::Japaneseモジュールで全角変換
print $writer Unicode::Japanese->new($sentence)->h2z->getu;

$writer->close;

my @result = ();
while (<$reader>) {
  push(@result, $_);
}

$reader->close;

# 自分でプロセスを刈り取らないとゾンビになる
# ここで、プロセスを刈り取る
waitpid($pid, 0);

my $j_result = join("", @result);
# Jumanを操作するオブジェクトをインスタンス化する
my $result = Juman::Result->new(result => $j_result);

if ($result) {

  # Jumanの解析結果を出力する
  print $result->spec;

  # Jumanオブジェクトの構成情報
  # 詳細は、
  # $ perldoc Juman
  # などで確認。
  #
  # Juman
  #   |
  #   +--- MRPH1
  #   |      |
  #   |      +---midasi
  #   |      |
  #   |      +---yomi
  #   |      |
  #   |      +---...
  #   |
  #   +--- MRPH2
  #   |
  #   +--- ...

  # 形態素オブジェクトを得る
  my @mrph_list = $result->mrph_list;
  foreach my $mrph (@mrph_list) {
    my $midasi = $mrph->midasi;
    my $yomi = $mrph->yomi;
    my $genkei = $mrph->genkei;
    print "$midasi, $yomi, $genkei\n";
  }

}
広告を非表示にする