Daily programming #0048
言語処理100本ノック 2015の#46をやっていく。
第5章: 係り受け解析
夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をCaboChaを使って係り受け解析し,その結果をneko.txt.cabochaというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ.
このあたりの記述を参考にCaboChaをインストールし、neko.txt.cabochaを作成する。
neko.txt.cabochaのサイズが大きく、glot.ioではそのまま実行できないため、第5章は実行結果を記載する方針とする。
46. 動詞の格フレーム情報の抽出[Golang]
Question
45のプログラムを改変し,述語と格パターンに続けて項(述語に係っている文節そのもの)をタブ区切り形式で出力せよ.45の仕様に加えて,以下の仕様を満たすようにせよ.
- 項は述語に係っている文節の単語列とする(末尾の助詞を取り除く必要はない)
- 述語に係る文節が複数あるときは,助詞と同一の基準・順序でスペース区切りで並べる
「吾輩はここで始めて人間というものを見た」という例文(neko.txt.cabochaの8文目)を考える.この文は「始める」と「見る」の2つの動詞を含み,「始める」に係る文節は「ここで」,「見る」に係る文節は「吾輩は」と「ものを」と解析された場合は,次のような出力になるはずである.
始める で ここで 見る は を 吾輩は ものを
Code
Output
$ ./main ../neko.txt.cabocha > output.txt $ head -n 10 output.txt 生れる で どこで つく と が かとんと 見当が 泣く で した所で する て だけ 泣いて いた事だけは 始める で ここで 見る は を 吾輩は ものを 聞く で あとで 捕える を 我々を 煮る て 捕えて 食う て 煮て
結果は例として先頭から10個を表示した
Comment
45のコードに「述語に係っている文節」を出力するように変更しただけ
Daily programming #0047
言語処理100本ノック 2015の#45をやっていく。
第5章: 係り受け解析
夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をCaboChaを使って係り受け解析し,その結果をneko.txt.cabochaというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ.
このあたりの記述を参考にCaboChaをインストールし、neko.txt.cabochaを作成する。
neko.txt.cabochaのサイズが大きく、glot.ioではそのまま実行できないため、第5章は実行結果を記載する方針とする。
45. 動詞の格パターンの抽出[Golang]
Question
今回用いている文章をコーパスと見なし,日本語の述語が取りうる格を調査したい. 動詞を述語,動詞に係っている文節の助詞を格と考え,述語と格をタブ区切り形式で出力せよ.ただし,出力は以下の仕様を満たすようにせよ.
- 動詞を含む文節において,最左の動詞の基本形を述語とする
- 述語に係る助詞を格とする
- 述語に係る助詞(文節)が複数あるときは,すべての助詞をスペース区切りで辞書順に並べる
「吾輩はここで始めて人間というものを見た」という例文(neko.txt.cabochaの8文目)を考える.この文は「始める」と「見る」の2つの動詞を含み,「始める」に係る文節は「ここで」,「見る」に係る文節は「吾輩は」と「ものを」と解析された場合は,次のような出力になるはずである.
始める で 見る は を
このプログラムの出力をファイルに保存し,以下の事項をUNIXコマンドを用いて確認せよ.
Code
Output
$ ./main ../neko.txt.cabocha > output.txt $ sort output.txt | uniq -c | sort -nr | head -10 577 云う と 438 する を 255 思う と 200 なる に 197 ある が 187 する に 178 見る て 128 する と 119 する が 94 する て を $ grep "^する\s" output.txt | sort | uniq -c | sort -nr | head -10 438 する を 187 する に 128 する と 119 する が 94 する て を 84 する て 62 する を に 59 する は 57 する が を 51 する から $ grep "^見る\s" output.txt | sort | uniq -c | sort -nr | head -10 178 見る て 93 見る を 21 見る て て 19 見る から 15 見る て を 15 見る と 13 見る で 11 見る は て 10 見る から て 9 見る に $ grep "^与える\s" output.txt | sort | uniq -c | sort -nr | head -10 3 与える に を 1 与える けれども に を 1 与える として を 1 与える たり に を 1 与える に に対して も 1 与える で だけ を 1 与える て は は と て に を 1 与える は て に を に 1 与える は て に を 1 与える と は て を
結果は例として上位10個を表示した
Comment
特に難しいことはない
動詞が含まれる文節、かつその文節の係り元文節に助詞が含まれるものを抽出するだけ
先人の人達の結果を見るとそれぞれ傾向がバラバラになっているように見えるけど、どこかで間違えているのかわからない
Daily programming #0046
言語処理100本ノック 2015の#44をやっていく。
第5章: 係り受け解析
夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をCaboChaを使って係り受け解析し,その結果をneko.txt.cabochaというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ.
このあたりの記述を参考にCaboChaをインストールし、neko.txt.cabochaを作成する。
neko.txt.cabochaのサイズが大きく、glot.ioではそのまま実行できないため、第5章は実行結果を記載する方針とする。
44. 係り受け木の可視化[Golang]
Question
与えられた文の係り受け木を有向グラフとして可視化せよ.可視化には,係り受け木をDOT言語に変換し,Graphvizを用いるとよい.また,Pythonから有向グラフを直接的に可視化するには,pydotを使うとよい.
Code
Output
$ ./main ../neko.txt.cabocha $ dot -T png diGraph.dot -o 44.png
例として10文目をDOT言語に変換し表示させた
Comment
事前準備としてGraphvizとawalterschulze/gographvizパッケージをインストールする。
go get github.com/awalterschulze/gographviz
GraphvizはそれぞれのOSでインストール方法が異なるがubuntuの場合は以下を実行
sudo apt install graphviz
コードについては、先人のコードを参考にした
Daily programming #0045
言語処理100本ノック 2015の#43をやっていく。
第5章: 係り受け解析
夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をCaboChaを使って係り受け解析し,その結果をneko.txt.cabochaというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ.
このあたりの記述を参考にCaboChaをインストールし、neko.txt.cabochaを作成する。
neko.txt.cabochaのサイズが大きく、glot.ioではそのまま実行できないため、第5章は実行結果を記載する方針とする。
43. 名詞を含む文節が動詞を含む文節に係るものを抽出[Golang]
Question
名詞を含む文節が,動詞を含む文節に係るとき,これらをタブ区切り形式で抽出せよ.ただし,句読点などの記号は出力しないようにせよ.
Code
Output
$ ./main ../neko.txt.cabocha どこで 生れた かとんと つかぬ 見当が つかぬ した所で 泣いて いた事だけは 記憶している 吾輩は 見た ここで 始めて ものを 見た <以下省略>
Comment
名詞を含む文節が動詞を含む文節に係るとは
名詞を含む文節
が動詞を含む文節
を装飾していること
つまり以下になっているものを抽出する
名詞を含む文節 動詞を含む文節
Daily programming #0044
言語処理100本ノック 2015の#42をやっていく。
第5章: 係り受け解析
夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をCaboChaを使って係り受け解析し,その結果をneko.txt.cabochaというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ.
このあたりの記述を参考にCaboChaをインストールし、neko.txt.cabochaを作成する。
neko.txt.cabochaのサイズが大きく、glot.ioではそのまま実行できないため、第5章は実行結果を記載する方針とする。
42. 係り元と係り先の文節の表示[Golang]
Question
係り元の文節と係り先の文節のテキストをタブ区切り形式ですべて抽出せよ.ただし,句読点などの記号は出力しないようにせよ.
Code
Output
$ ./main ../neko.txt.cabocha 一 吾輩は猫である 名前は 無い まだ 無い 無い どこで 生れた 生れた かとんと かとんと つかぬ 見当が つかぬ つかぬ 何でも 薄暗い 薄暗い 泣いて じめじめ 泣いて した所で 泣いて ニャーニャー 泣いて 泣いて 記憶している いた事だけは 記憶している 記憶している 吾輩は 見た ここで 始めて 始めて 人間という 人間という ものを ものを 見た 見た <以下省略>
Comment
基本的には#41をベースに出力形式を変更しただけ
係り先の文節がない場合は、係り元の文節のみ出力した
Daily programming #0043
言語処理100本ノック 2015の#41をやっていく。
第5章: 係り受け解析
夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をCaboChaを使って係り受け解析し,その結果をneko.txt.cabochaというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ.
このあたりの記述を参考にCaboChaをインストールし、neko.txt.cabochaを作成する。
neko.txt.cabochaのサイズが大きく、glot.ioではそのまま実行できないため、第5章は実行結果を記載する方針とする。
41. 係り受け解析結果の読み込み(文節・係り受け)[Golang]
Question
40に加えて,文節を表すクラスChunk
を実装せよ.このクラスは形態素(Morph
オブジェクト)のリスト(morphs
),係り先文節インデックス番号(dst
),係り元文節インデックス番号のリスト(srcs
)をメンバ変数に持つこととする.さらに,入力テキストのCaboChaの解析結果を読み込み,1文をChunk
オブジェクトのリストとして表現し,8文目の文節の文字列と係り先を表示せよ.第5章の残りの問題では,ここで作ったプログラムを活用せよ.
Code
Output
$ ./main ../neko.txt.cabocha この -> 書生 という の は 書生 という の は -> 話 で ある 。 時々 -> 捕え て 我々 を -> 捕え て 捕え て -> 煮 て 煮 て -> 食う という 食う という -> 話 で ある 。 話 で ある 。
Comment
CaboChaの-f1
オプションで生成する形態素解析結果は以下のようなフォーマット1になっているので、今回は*
から始まる行も処理する必要がある
一行目
* 文節番号 係り先の文節番号(係り先なし:-1)D 主辞の形態素番号/機能語の形態素番号 係り関係のスコア
二行目
表層形t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
Goにはクラスの概念がないのでChunk
を構造体として定義する
*
から始まる行から処理し、EOS
の行まできたら係り元文節インデックス番号のリストを作成した
Daily programming #0042
言語処理100本ノック 2015の#40をやっていく。
第5章: 係り受け解析
夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をCaboChaを使って係り受け解析し,その結果をneko.txt.cabochaというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ.
このあたりの記述を参考にCaboChaをインストールし、neko.txt.cabochaを作成する。
neko.txt.cabochaのサイズが大きく、glot.ioではそのまま実行できないため、第5章は実行結果を記載する方針とする。
40. 係り受け解析結果の読み込み(形態素)[Golang]
Question
形態素を表すクラスMorph
を実装せよ.このクラスは表層形(surface
),基本形(base
),品詞(pos
),品詞細分類1(pos1
)をメンバ変数に持つこととする.さらに,CaboChaの解析結果(neko.txt.cabocha)を読み込み,各文をMorph
オブジェクトのリストとして表現し,3文目の形態素列を表示せよ.
Code
Output
$ ./main ../neko.txt.cabocha [{名前 名前 名詞 一般} {は は 助詞 係助詞} {まだ まだ 副詞 助詞類接続} {無い 無い 形容詞 自立} {。 。 記号 句点}]
Comment
やることは#30とあまり変わらない
CaboChaの-f1
オプションで生成する形態素解析結果は以下のようなフォーマットになっている1
$ cabocha -f1 吾輩は猫である。 * 0 -1D 1/1 0.000000 吾輩は猫である 名詞,固有名詞,一般,*,*,*,吾輩は猫である,ワガハイハネコデアル,ワガハイワネコデアル 。 記号,句点,*,*,*,*,。,。,。 EOS
一行目
* 文節番号 係り先の文節番号(係り先なし:-1)D 主辞の形態素番号/機能語の形態素番号 係り関係のスコア
二行目
表層形t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
Goにはクラスの概念がないのでMorph
を構造体として定義する
この問題では一行目は必要無いので*
から始まる行を無視してMorph
構造体のスライスに格納した