言語処理100本ノック 2015 第5章 40〜44

言語処理100本ノック 2015」の「第5章: 係り受け解析」、40〜44。

夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をCaboChaを使って係り受け解析し,その結果をneko.txt.cabochaというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ.

まずneko.txt.cabochaの作成。以降の課題で形態素解析が必要なので、以下のオプションで出力したものをneko.txt.cabochaとして保存しました。

出力結果はこんな感じ。

40. 係り受け解析結果の読み込み(形態素)

形態素を表すクラスMorphを実装せよ.このクラスは表層形(surface),基本形(base),品詞(pos),品詞細分類1(pos1)をメンバ変数に持つこととする.さらに,CaboChaの解析結果(neko.txt.cabocha)を読み込み,各文をMorphオブジェクトのリストとして表現し,3文目の形態素列を表示せよ.

処理としては4章の内容が流用可能でクラスを使うようになったくらい。

出力結果はこんな感じ。

41. 係り受け解析結果の読み込み(文節・係り受け)

40に加えて,文節を表すクラスChunkを実装せよ.このクラスは形態素(Morphオブジェクト)のリスト(morphs),係り先文節インデックス番号(dst),係り元文節インデックス番号のリスト(srcs)をメンバ変数に持つこととする.さらに,入力テキストのCaboChaの解析結果を読み込み,1文をChunkオブジェクトのリストとして表現し,8文目の文節の文字列と係り先を表示せよ.第5章の残りの問題では,ここで作ったプログラムを活用せよ.

40の課題に加えてChunkクラスを作り、read_sentences関数を変更。

出力はこんな感じ。

42. 係り元と係り先の文節の表示

係り元の文節と係り先の文節のテキストをタブ区切り形式ですべて抽出せよ.ただし,句読点などの記号は出力しないようにせよ.

41の課題に「第5章の残りの問題では,ここで作ったプログラムを活用せよ」の記載があったとおり41をベースにします。
まず「句読点などの記号は出力しないようにせよ」の条件を満たすため、Chunkクラスにnomarkメソッドとget_surface_nomarkメソッドを追加。

これを使う側のmain関数も以下のように変更。

出力はこんな感じ。

43. 名詞を含む文節が動詞を含む文節に係るものを抽出

名詞を含む文節が,動詞を含む文節に係るとき,これらをタブ区切り形式で抽出せよ.ただし,句読点などの記号は出力しないようにせよ.

Chunkクラスに「名詞を含む文節」「動詞を含む文節」を判定するためにhasVerbメソッド、hasNounメソッドを追加。

使用するmain関数側も修正。

出力はこんな感じ。

44. 係り受け木の可視化

与えられた文の係り受け木を有向グラフとして可視化せよ.可視化には,係り受け木をDOT言語に変換し,Graphvizを用いるとよい.また,Pythonから有向グラフを直接的に可視化するには,pydotを使うとよい.

main関数のみの変更で対応。「Pythonから有向グラフを直接的に可視化するには,pydotを使うとよい」とはあるものの、以前の記事でgraphvizを使って有向グラフ作ったことがあるので、その時のノウハウを使って実装。

「DataLab.を使ってサイアーラインを可視化してみる(その2)」で取得した種牡馬情報を可視化してみます。 約1000頭の情報を...

任意の入力からグラフ化する必要があるので、直接CaboChaを使えるようにpythonバインディングを以下の記事を参考にインストール。

# TL;DR - 自然言語処理には欠かせないライブラリであるMeCabとCaboChaをbrewでサクッと導入する - ついでにpythonから使えるようにしちゃう # 環境 - macOS X 10.13.3 High Si...

出力はこんな感じ。

スポンサーリンク

フォローする

スポンサーリンク