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

100knock #46

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

100knock #45

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

100knock #44

Output

$ ./main ../neko.txt.cabocha
$ dot -T png diGraph.dot -o 44.png

f:id:re3turn:20210209002629p:plain

例として10文目をDOT言語に変換し表示させた

Comment

事前準備としてGraphvizawalterschulze/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

100knock #43

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

100knock #42

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

100knock #41

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

100knock #40

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構造体のスライスに格納した