言語処理100本ノック 2015 第5章 45

言語処理100本ノック 2015」の「第5章: 係り受け解析」、45。
下の記事の続きです。

「言語処理100本ノック 2015」の「第5章: 係り受け解析」、40〜44。 夏目漱石の小説『吾輩は猫である』の文章(neko....

ここまでは課題5個ごとに記事にしていたのですが、5個単位だと長くなってきているので、今回は1つだけで記事にしてみます。

45. 動詞の格パターンの抽出

今回用いている文章をコーパスと見なし,日本語の述語が取りうる格を調査したい. 動詞を述語,動詞に係っている文節の助詞を格と考え,述語と格をタブ区切り形式で出力せよ. ただし,出力は以下の仕様を満たすようにせよ.

  • 動詞を含む文節において,最左の動詞の基本形を述語とする
  • 述語に係る助詞を格とする
  • 述語に係る助詞(文節)が複数あるときは,すべての助詞をスペース区切りで辞書順に並べる

「吾輩はここで始めて人間というものを見た」という例文(neko.txt.cabochaの8文目)を考える. この文は「始める」と「見る」の2つの動詞を含み,「始める」に係る文節は「ここで」,「見る」に係る文節は「吾輩は」と「ものを」と解析された場合は,次のような出力になるはずである.

始める  で
見る    は を

このプログラムの出力をファイルに保存し,以下の事項をUNIXコマンドを用いて確認せよ.

  • コーパス中で頻出する述語と格パターンの組み合わせ
  • 「する」「見る」「与える」という動詞の格パターン(コーパス中で出現頻度の高い順に並べよ)

まず43の課題に対して、Chunkクラスにメソッド追加。助詞の有無取得、最左の動詞の基本形取得、助詞の基本形取得を以下のように追加。

class Chunk:
    …
    def hasParticles(self):
        return '助詞' in [m.pos for m in self.nomark()]

    def get_leftest_verb(self):
        return [m.base for m in self.morphs if m.pos == '動詞'][0]

    def get_particles(self):
        return [m.base for m in self.morphs if m.pos == '助詞']

main関数の方も変更。

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('infile')
    args = parser.parse_args()

    with open(args.infile, mode='r') as f:
        for s in read_sentences(f):
            for c in s:
                if c.hasVerb():
                    ps = list(itr.chain.from_iterable(
                        (s[src].get_particles() for src in c.srcs)))
                    if ps:
                        list.sort(ps)
                        print(f'{c.get_leftest_verb()}\t{" ".join(ps)}')

これでの出力はこんな感じ。

生れる	で
つく	か が
泣く	で
する	だけ て は
始める	で
見る	は を
聞く	で
捕える	を
煮る	て
食う	て
…

「コーパス中で頻出する述語と格パターンの組み合わせ」に関しては以下のコマンドで実現可能。

sort ファイル名 | uniq -c | sort -r

出力はこんな感じ。

 565 云う	と
 442 する	を
 249 思う	と
 199 ある	が
 189 なる	に
 174 する	に
 173 見る	て
 127 する	と
 117 する	が
 105 する	に を
…

「『する』『見る』『与える』という動詞の格パターン(コーパス中で出現頻度の高い順に並べよ)」に関しては以下のようなコマンドで確認可能。

grep する ファイル名 | sort | uniq -c | sort -r

「する」の結果

 442 する	を
 174 する	に
 127 する	と
 117 する	が
 105 する	に を
  86 する	て を
  59 する	は
  58 する	て
  57 する	が を
  48 する	から
…

「見る」の結果

 173 見る	て
  94 見る	を
  21 見る	て て
  20 見る	から
  18 見る	て を
  14 見る	と
  12 見る	から て
  12 見る	で
  11 見る	て は
   8 見る	に
…

「与える」の結果

   3 与える	に を
   2 与える	て に は を
   1 与える	けれども に は を
   1 与える	だけ で に を
   1 与える	たり て に を
   1 与える	に に対して のみ は は も
   1 与える	か じゃあ て と は を
   1 与える	か として を
   1 与える	が て て と に は は を
   1 与える	て に に は を
…
スポンサーリンク

フォローする

スポンサーリンク