juman/knp を用いた 形態素解析・構文解析 - 実習 -

53
JUMAN/KNP をををを ををををを をををを をを をををを をををを をををを をををを Language & K nowledge Engineering Lab をををををををををををををををを ををををををををををををををををををををををを (2005 / /ををを

Upload: crete

Post on 23-Jan-2016

187 views

Category:

Documents


0 download

DESCRIPTION

JUMAN/KNP を用いた 形態素解析・構文解析 - 実習 -. 黒橋禎夫 河原大輔 柴田知秀 東京大学. 京都大学学術情報メディアセンター  メディア情報処理専修コース「自然言語処理技術」 (2005 / 8 / 30). 目次. インストール確認 環境設定 JUMAN/KNP を使ってみよう JUMAN/KNP の辞書 / ルールの説明(・カスタマイズ) 休憩 Perl 超入門 JUMAN/KNP と Perl を用いたいろいろな頻度統計の取り方. 配布パッケージの内容. C:\juman-knp-20050830 Install - PowerPoint PPT Presentation

TRANSCRIPT

JUMAN/KNP を用いた形態素解析・構文解析

- 実習 -

黒橋禎夫 河原大輔 柴田知秀東京大学

Language & K nowledge Engineering Lab

京都大学学術情報メディアセンター メディア情報処理専修コース「自然言語処理技術」 (2005 / 8 / 30)

目次1. インストール確認2. 環境設定3. JUMAN/KNP を使ってみよう4. JUMAN/KNP の辞書 / ルールの説明(・カスタマ

イズ)5. 休憩6. Perl 超入門7. JUMAN/KNP と Perl を用いたいろいろな頻度統

計の取り方

配布パッケージの内容• C:\juman-knp-20050830

– Install• juman-5.1.exe, knp-2.0.exe, Perl 関連

– src ( Perl スクリプト)• cut.pl, grep.pl, phrase.pl, sort.pl, uniq.pl

– text (サンプルテキスト)• 料理: cook_small.txt, cook_middle.txt, cook_large.t

xt• Web : web_small.txt, web_middle.txt, web_large.txt

– small: 1,000 文 , middle: 5,000 文 , large: 20,000 文

1. インストール確認• 配布パッケージ

– C:\juman-knp-20050830

• JUMAN– C:\Program Files\juman

• KNP– C:\Program Files\knp

• Perl ( ActivePerl )• Perl モジュール

JUMAN/KNP の実行環境について

• 開発環境の Linux では:– 入出力の文字コード: EUC– 辞書、ルールの文字コード: EUC

• 本日の実習は Windows– 入出力の文字コード: SJIS– 辞書、ルールの文字コード: EUC

• 来週リリースするバージョン– Linux: すべて EUC– Windows: すべて SJIS

2. 環境設定• PATH の設定

– マイコンピュータを右クリックしてプロパティを選ぶ

( Windows XP の場合)

2. 環境設定• PATH の設定

– 詳細設定のタブを選ぶ

2. 環境設定• PATH の設定

– 環境変数を押す

2. 環境設定• PATH の設定

– Path をクリックして「編集」をクリック

2. 環境設定• PATH の設定

– Path をクリックして「編集」をクリック

– 変数値の末尾に下記の文字列を追加する(元の文字列を消さないよう、まず右矢印を押す)

;C:\Program Files\juman;C:\Program Files\knp

3.1 JUMAN を使ってみよう• コマンド プロンプトを開く

– スタート⇒すべてのプログラム⇒アクセサリ⇒コマンド プロンプト

3.1 JUMAN を使ってみよう• コマンド プロンプトを開く

3.1 JUMAN を使ってみよう• juman と打つ

3.1 JUMAN を使ってみよう• 環境設定ができていない場合

3.1 JUMAN を使ってみよう• 「夏休みも明日で最後です。」と入力

Alt+ 半角 / 全角で IME を立ち上げ日本語を入力します

Tips

3.1 JUMAN を使ってみよう• 「夏休みも明日で最後です。」と入力

この文は何回か使うので、コピーしておくと便利です ⇒ 右クリックし範囲指定を選び、範囲を指定したら  リターンを押します

Tips

3.1 JUMAN を使ってみよう• コントロール Z リターン で終了

3.1 JUMAN を使ってみよう• 今度は juman –B –e2

直前のコマンドを表示するには上矢印を押します

Tips

夏 なつ 夏 名詞 6 時相名詞 10 * 0 * 0 " 漢字読み : 訓 代表表記 : 夏 "休み やすみ 休む 動詞 2 * 0 子音動詞マ行 9 基本連用形 7 " 代表表記 : 休む "も も も 助詞 9 副助詞 2 * 0 * 0 NIL@ も も も 助詞 9 接続助詞 3 * 0 * 0 NIL明日 あした 明日 名詞 6 時相名詞 10 * 0 * 0 " 代表表記 : 明日 "@ 明日 あす 明日 名詞 6 時相名詞 10 * 0 * 0 " 代表表記 : 明日 "で で で 助詞 9 格助詞 1 * 0 * 0 NIL最後 さいご 最後 名詞 6 普通名詞 1 * 0 * 0 " 代表表記 : 最後 "です です だ 判定詞 4 * 0 判定詞 25 デス列基本形 24 NIL。 。 。 特殊 1 句点 1 * 0 * 0 NILEOS

juman –B –e2 フォーマット

原形表記 読み 品詞 品詞細分類 意味情報

活用型 活用形

曖昧性のある形態素を表す

3.2 KNP を使ってみよう• juman –B –e2 | knp と打つ

3.2 KNP を使ってみよう• juman –B –e2 | knp –tab と打つ

knp –tab フォーマット

# S-ID:1 KNP:2005/08/30* 2D < 文頭 >< モ >< 助詞 >< 体言 >< 係 : 未格 >< 並キ : 名 :&ST:2.5&& モ >< 区切 :1-4><RID:1238>< 格要素 >…夏 なつ 夏 名詞 6 時相名詞 10 * 0 * 0 " 漢字読み : 訓 代表表記 : 夏 " < 漢字読み : 訓 >< 代表表記 : 夏 ><文頭 >…休み やすみ 休み 名詞 6 普通名詞 1 * 0 * 0 " 代表表記 : 休み " < 代表表記 : 休み >< かな漢字 >…も も も 助詞 9 副助詞 2 * 0 * 0 NIL < 品曖 ><ALT- も - も - も -9-3-0-0-NIL>< 品曖 - 副助詞 >< 品曖 - その他 >…* 2D < 時間 >< 強時間 >< 外の関係 >< モ~ >< デ >< 助詞 >< 体言 >< 係 : デ格 >< 区切 :0-0><RID:1200><格要素 >…明日 あした 明日 名詞 6 時相名詞 10 * 0 * 0 “ 代表表記 : 明日” < 代表表記 : 明日 >< 品曖 >…で で で 助詞 9 格助詞 1 * 0 * 0 NIL < かな漢字 >< ひらがな >< 付属 >* -1D < 文末 >< 句点 >< 体言 >< 用言 : 判 >< レベル :C>< 区切 :5-5><ID: (文末) ><RID:112>< 提題受 :30>最後 さいご 最後 名詞 6 普通名詞 1 * 0 * 0 " 代表表記 : 最後 " < 代表表記 : 最後 >< 漢字 >< かな漢字 >…です です だ 判定詞 4 * 0 判定詞 25 デス列基本形 24 NIL < 表現文末 >< かな漢字 >< ひらがな >< 活用語 >< 付属 >。 。 。 特殊 1 句点 1 * 0 * 0 NIL < 文末 >< 英記号 >< 記号 >< 付属 >EOS

0 番目の文節

1 番目の文節

2 番目の文節

係り先の文節番号

ファイルから入力する場合• cd c:\juman-knp-20050830\text• juman –B –e2 < cook_small.txt > cook_small.jmn• knp –tab < cook_small.jmn > cook_small.knp

ファイル・ディレクトリ名はTab で補完できます

Tips

4.1 JUMAN 辞書の説明

コスト最小法

コスト=∑{(形態素コスト × 形態素コスト重み)   

        +(連接コスト × 連接コスト重み)}

(品詞コスト × 見出し語コスト) 1

10~100 ~ 1.0~

~10~

文頭 読む 文末

から だ

か ら だ

4040

10 11

100 × 1.6

40

16

40

40

辞書・文法

JUMAN.grammar (品詞分類)JUMAN.katuyou (活用)JUMAN.kankei (活用関係)JUMAN.connect.c (連接規則: 2

50 )

ContentW.dic など  自立語:3万語  付属語:1500語  固有名詞:3万語

文法辞書 形態素辞書

jumandic.tab (連接対応表)jumandic.mat (連接行列)

jumandic.dat (データベース)jumandic.pat (インデックス)

コンパイル

ContentW.dic (形態素辞書)・・・( 名詞 ( 普通名詞 (( 読み からくさ )( 見出し語 唐草 ( から草 1.6) ( からくさ 1.6))( 意味

情報 " 代表表記 : 唐草 "))))( 名詞 ( 普通名詞 (( 読み からくち )( 見出し語 辛口 ( から口 1.6) ( からくち 1.6))( 意味

情報 " 代表表記 : 辛口 "))))( 副詞 (( 読み からくも )( 見出し語 辛くも からくも )( 意味情報 " 代表表記 : 辛くも ")))( 名詞 ( 普通名詞 (( 読み からくり )( 見出し語 からくり )( 意味情報 " 代表表記 : からく

り "))))( 動詞 (( 読み からす )( 見出し語 枯らす からす )( 活用型 子音動詞サ行 )( 意味情報 " 代

表表記 : 枯らす ")))( 名詞 ( 普通名詞 (( 読み からす )( 見出し語 烏 カラス ( からす 1.6))( 意味情報 " 代表表

記 : 烏 "))))( 名詞 ( 普通名詞 (( 読み からだ )( 見出し語 身体 体 ( からだ 1.6))( 意味情報 " 代表表

記 : 身体 "))))( 名詞 ( 普通名詞 (( 読み からだつき )( 見出し語 体付き 体付 体つき ( からだつき 1.6))

( 意味情報 " 代表表記 : 体付き "))))( 名詞 ( 普通名詞 (( 読み からっかぜ )( 見出し語 空っ風 ( からっかぜ 1.6))( 意味情報 "

代表表記 : 空っ風 "))))( 副詞 (( 読み からっきし )( 見出し語 からっきし )( 意味情報 " 代表表記 : からっきし ")))・・・

JUMAN.connect.c (連接規則辞書)

・・・

((BunsetsuEndSentenceEnd BunsetsuEnd ( 助詞 接続助詞 * * の )) (( 名詞 )) 4 )

((VerbBasicForm IAdjBasicForm NaAdjAllBasicForm AuxBasicForm NaAdjGuessForm (* * * タ系推量形 ) ( 動詞 * * タ系連用テ形 ) ( 接尾辞 動詞性接尾辞 * タ系連用テ形 )) (( 助詞 接続助詞 * * から )))・・・

4.2 KNP ルールの説明

処理の流れ

1. 同形異義語の処理( mrph_home.rule:60 )     → 一意の形態素列に変換

2. 形態素への feature 付与( mrph_basic.rule:300 )     → 文節列に変換

3. 文節への feature 付与( bnst_*.rule:200,650 )4. 並列構造解析5. 係り受け解析( kakari_uke.rule:40 )6. 格解析

0. JUMAN –B –e2 の出力を入力に

ルールの例( bnst_type.rule )

(( ?* )

( < ( ?* [ 助詞 * * * も ] ) (( 時間 )) > )

( < ( [ 名詞 * * * (昔 前 先 )] ?* ) > ?* )

  係 :隣)

「・・・ 30年も 前から ・・・」などを解析するためのルール

← 前の文節列

← 後ろの文節列

← 与える feature

← 自分自身形態素列:「~も」 〈時間〉 feature を持つ

形態素列:「昔|前|先~」

係り受け解析

30年も 前に 言語と 画像を 研究していた並キ:名係:隣 係:二格

時間係:ヲ格 用言:動

表層格:ガ ,ヲ

kakari_uke.rule: 係:ヲ格 → 用言 表層格:ヲ係:二格 → 用言 表層格:二係:二格 時間 → 用言係:隣 → *

・・・

JUMAN のカスタマイズ• 辞書エントリの追加

– 例えば、「ジンギスカン」を追加する• まず、今の解析がどうなるかを確認する• C:\Program Files\juman\dic 以下に usr.dic という

ファイルを作り、以下の内容を記述する

• C:\Program Files\juman\dic にある makedic.bat を実行する

• 解析してみる

( 名詞 (普通名詞 (( 読み じんぎすかん )     ( 見出し語 ジンギスカン じんぎすかん 成吉思汗 ))))

休憩

目次1. インストール確認2. 環境設定3. JUMAN/KNP を使ってみよう4. JUMAN/KNP の辞書 / ルールの説明(・カスタマ

イズ)5. 休憩6. Perl 超入門7. JUMAN/KNP と Perl を用いたいろいろな頻度統

計の取り方

6.Perl 超入門• Perl は言語処理に適したプログラミング言語

スチームコンベクションオーブン100℃で4分間加熱する。イラストやツクール素材など、自作ゲームも制作しています。海洋生物資源の有効利用含芒硝石膏泉:無色透明、源泉約50℃オレンジのビタミンCが風邪を予防してくれます。活用の部屋戻るくっきもさん、お粗末様でございましたこの場合はおかしいですね :

636 、597 の583 に:45 塩42 料理42 かける39 味38 など37 梅 :

テキスト 頻度つき単語リスト

6.Perl 超入門• まずはじめに以下のようなファイルをエディタ

(メモ帳など)で作成

• C:\juman-knp-20050830\src\test.pl に保存• cd C:\juman-knp-20050830\src• コマンド プロンプトで、 perl test.pl を実行

use encoding ”shiftjis”;

print ”こんにちは。 \n”;

おまじない

文字列を表示する関数 改行を表す記号

6.Perl 超入門• パターンにマッチする行を表示するプログラム

( src\grep.pl )

use encoding ’shiftjis’;$ARGV[0] = Encode::decode(’shiftjis’, $ARGV[0]);

while (<STDIN>) { print if (/$ARGV[0]/);}

この行を追加してください1 つ目の引数条件

「 /…/ 」はパターンマッチを行う

6.Perl 超入門• ソートするプログラム( src\sort.pl )

while (<STDIN>) { push(@buffer, $_);}

if ($rflag) { print reverse sort @buffer;} else { print sort @buffer;}

@... は配列

ソートする関数

配列を逆順にする関数

baa

aa

cccc

aa

aa

aa

baa

cccc

6.Perl 超入門• ソートされたファイルから重複行の行数を数える

プログラム( src\uniq.pl )

use encoding ’shiftjis’;

$pre = <STDIN>;$count = 1;

while (<STDIN>) { if ($pre eq $_) { $count++; } else { printf ”%6d $pre”, $count; $pre = $_; $count = 1; }}printf ”%6d $pre”, $count;

aa

aa

baa

cccc

2 aa

1 baa

1 cccc

6.Perl 超入門• 各行から指定したカラムを表示するプログ

ラム( src\cut.pl )use encoding ’shiftjis’;

if ($ARGV[0] =~ /^\-(\d+)$/ && $1 > 0) { $cnum = $1 – 1;} else { die “Usage: cut.pl –n\n”;}

while (<STDIN>) { @data = split; print $data[$cnum], “\n” if ($#data >= $cnum);}

1 行をスペースで分割する関数

夏 なつ 夏 名詞 6 時相名詞 10 * 0 * 0 " 漢字読み : 訓 代表表記 : 夏 "休み やすみ 休む 動詞 2 * 0 子音動詞マ行 9 基本連用形 7 " 代表表記 : 休む "も も も 助詞 9 副助詞 2 * 0 * 0 NIL明日 あした 明日 名詞 6 時相名詞 10 * 0 * 0 " 代表表記 : 明日 "で で で 助詞 9 格助詞 1 * 0 * 0 NIL最後 さいご 最後 名詞 6 普通名詞 1 * 0 * 0 " 代表表記 : 最後 "です です だ 判定詞 4 * 0 判定詞 25 デス列基本形 24 NIL。 。 。 特殊 1 句点 1 * 0 * 0 NILEOS

6.Perl 超入門• 各行から指定したカラムを表示するプログ

ラム( src\cut.pl -3 )use encoding ’shiftjis’;

if ($ARGV[0] =~ /^\-(\d+)$/ && $1 > 0) { $cnum = $1 – 1;} else { die “Usage: cut.pl –n\n”;}

while (<STDIN>) { @data = split; print $data[$cnum], “\n” if ($#data >= $cnum);}

1 行をスペースで分割する関数

夏 なつ 夏 名詞 6 時相名詞 10 * 0 * 0 " 漢字読み : 訓 代表表記 : 夏 "休み やすみ 休む 動詞 2 * 0 子音動詞マ行 9 基本連用形 7 " 代表表記 : 休む "も も も 助詞 9 副助詞 2 * 0 * 0 NIL明日 あした 明日 名詞 6 時相名詞 10 * 0 * 0 " 代表表記 : 明日 "で で で 助詞 9 格助詞 1 * 0 * 0 NIL最後 さいご 最後 名詞 6 普通名詞 1 * 0 * 0 " 代表表記 : 最後 "です です だ 判定詞 4 * 0 判定詞 25 デス列基本形 24 NIL。 。 。 特殊 1 句点 1 * 0 * 0 NILEOS

6.Perl 超入門• 各行から指定したカラムを表示するプログ

ラム( src\cut.pl )use encoding ’shiftjis’;

if ($ARGV[0] =~ /^\-(\d+)$/ && $1 > 0) { $cnum = $1 – 1;} else { die “Usage: cut.pl –n\n”;}

while (<STDIN>) { @data = split; print $data[$cnum], “\n” if ($#data >= $cnum);}

1 行をスペースで分割する関数

目次1. インストール確認2. 環境設定3. JUMAN/KNP を使ってみよう4. JUMAN/KNP の辞書 / ルールの説明(・カスタマ

イズ)5. 休憩6. Perl 超入門7. JUMAN/KNP と Perl を用いたいろいろな頻度統

計の取り方

7.1 単語の頻度を数える• cd c:\juman-knp-20050830\text• テキストの例として cook_small.txt を用いる

スチームコンベクションオーブン100℃で4分間加熱する。イラストやツクール素材など、自作ゲームも制作しています。海洋生物資源の有効利用含芒硝石膏泉:無色透明、源泉約50℃オレンジのビタミンCが風邪を予防してくれます。活用の部屋戻るくっきもさん、お粗末様でございましたこの場合はおかしいですね、調理されたのはあなたですものね甘さ辛さを味わいつくし、苦さも知った人生、その人の舌が、それを知るはずだ。 :

7.1 単語の頻度を数える• 形態素解析

juman –B –e2 < cook_small.txt > cook_small.jmn

• 単語の原形を抽出するperl ..\src\cut.pl -3 < cook_small.jmn | more

スチームコンベクションオーブン100℃で4分間加熱する。 :

3 つ目=原形を抽出

7.1 単語の頻度を数える

636 、597 の583 に:45 塩42 料理42 かける39 味38 など37 梅 :

:あるあるあるあるあるあるあるあるある :

• 抽出した単語の頻度を数えるperl ..\src\cut.pl -3 < cook_small.jmn | perl ..\src\sort.pl | pe

rl ..\src\uniq.pl | perl ..\src\sort.pl –r | more

:1 ありがとう 52 ある1 あわせた1 あわせて1 あわせる1 あわび6 あん1 あんしん1 あんずる :

src\phrase.pl

• 文節や係り受けを抽出するプログラム文節の抽出: phrase.pl -1係り受けの抽出: phrase.pl -2

• cook_large.knp でやってみるperl ..\src\phrase.pl -1 knp\cook_large.knp > c

ook_large.dat1perl ..\src\phrase.pl -2 knp\cook_large.knp > c

ook_large.dat2

#!/usr/bin/perl

# 文節または係り受けを抽出するスクリプト

# UNIX 系 OS の環境で、標準入力からテキストを読みながら解析する場合は以下のようにする# use KNP;# $KNP = new KNP;# while (<STDIN>) {# $result = $KNP->parse($_);# for my $bnst ($result->bnst) {# ...

use KNP::File;use encoding 'shiftjis';

if ($ARGV[0] =~ /\-(1|2)$/ && -f $ARGV[1]) { $type = $1;

# 解析済みファイルを読み込む $KNP = new KNP::File($ARGV[1]) || die;} else { :

7.2 文節の頻度を数える• 抽出した文節の頻度を数える

perl ..\src\sort.pl < cook_large.dat1 | perl ..\src\uniq.pl |  perl ..\src\sort.pl -r | more

1618 する1001 入れる518 加える511 味:315 鍋296 よい292 料理284 かける269 炒める :

7.3 係り受けの頻度を数える• 抽出した係り受けの頻度を数える

perl ..\src\sort.pl < cook_large.dat2 | perl ..\src\uniq.pl | perl ..\src\sort.pl –r | more

188 最新の レシピ188 レシピは NTT グルメページ97 鍋に 入れる77 1ヵ所に つく59 皮を むく59 みじん切りに する57 火に かける56 器に 盛る53 大きさに 切る :

表現の検索• 「切る」を検索

perl ..\src\sort.pl < cook_large.dat2 | perl ..\src\uniq.pl | perl ..\src\sort.pl –r | perl ..\src\grep.pl 切る | more

53 大きさに 切る33 長さに 切る31 一口大に 切る29 半分に 切る16 水気を 切る12 薄く 切る11 縦半分に 切る10 棒状に 切る10 切り 切る :

表現の検索• 「を 切る」を検索

perl ..\src\sort.pl < cook_large.dat2 | perl ..\src\uniq.pl | perl ..\src\sort.pl –r | perl ..\src\grep.pl ” を 切る” | more

16 水気を 切る7 水を 切る5 部分を 切る4 材料を 切る3 香味野菜を 切る3 豚肉を 切る3 肉を 切る3 油を 切る2 茎を 切る :

試してみよう• 別のテキストでやってみる• 自分の知りたい表現を検索してみる