Pythonと日本語係り受け解析器であるCaboChaを用いて係る語と受ける語のペアを抽出する方法をご紹介する。

環境:Ubuntu14.04

Pythonツールのインストール

PythonからCaboChaを扱うために、CaboChaに付属しているPythonのsetup.pyをインストールする。
これはPython2系専用であることに注意する。
cabocha – Yet Another Japanese Dependency Structure Analyzer – Google Project Hostingからcabocha-0.68.tar.bz2をダウンロードして、解凍した後、「cabocha-0.68/python」ディレクトリに移動後、以下のコマンドを実行して、インストールする。


$ sudo python setup.py install

「/usr/local/lib/python2.7/dist-packages/」に配置される。

係り受け構造の抽出

係り受け構造を抽出するPythonソースコードは以下を参照して欲しい。


import CaboCha

def get_word(tree, chunk):
    surface = ''
    for i in range(chunk.token_pos, chunk.token_pos + chunk.token_size):
        token = tree.token(i)
        features = token.feature.split(',')
        if features[0] == '名詞':
            surface += token.surface
        elif features[0] == '形容詞':
            surface += features[6]
            break
        elif features[0] == '動詞':
            surface += features[6]
            break
    return surface

def get_2_words(line):
    cp = CaboCha.Parser('-f1')
    tree = cp.parse(line)
    chunk_dic = {}
    chunk_id = 0
    for i in range(0, tree.size()):
        token = tree.token(i)
        if token.chunk:
            chunk_dic[chunk_id] = token.chunk
            chunk_id += 1

    tuples = []
    for chunk_id, chunk in chunk_dic.items():
        if chunk.link > 0:
            from_surface =  get_word(tree, chunk)
            to_chunk = chunk_dic[chunk.link]
            to_surface = get_word(tree, to_chunk)
            tuples.append((from_surface, to_surface))
    return tuples

if __name__ == '__main__' :
    line = '太郎は花子が読んでいる本を次郎に渡した'
    tuples = get_2_words(line)
    for t in tuples:
        print(t[0] + ' => ' + t[1])

簡単に流れを説明すると、以下のようになる。

  • 文章をtokenに分割
  • chunkであるtokenをディクショナリ化{link, chunk}
  • ディクショナリから{link, chunk}を取り出す。
    • chunkの語の原形の名詞・形容詞・動詞を取得
    • chunk.linkに対応するchunkの語の原形の名詞・形容詞・動詞を取得(対応するlinkがない場合は、-1)
    • ペアとして抽出

Pythonを実行すると、以下のように出力される。


太郎 => 渡す
花子 => 読む
読む => 本
本 => 渡す
次郎 => 渡す

通常の構造は、以下になる。


$ cabocha
太郎は花子が読んでいる本を次郎に渡した
    太郎は---------D
      花子が-D     |
    読んでいる-D   |
            本を---D
            次郎に-D
              渡した
EOS

関連する記事

  • Python pyqueryを用いて簡単にウェブスクレイピングPython pyqueryを用いて簡単にウェブスクレイピング Pythonでpyqueryパッケージを用いて、ウェブスクレイピングを行う方法をご紹介する。ウェブ上には様々なデータがあるが、必要なデータがいつもファイルとしてダウンロードできるとは限らない。ここでご紹介する方法は、htmlファイルを直接解析して、必要な情報を取得するという方法である。 それでは、さっそく見ていこう。 Ubuntu […]
  • Ubuntu16.04で任意のバージョンのNode.jsをインストールする方法Ubuntu16.04で任意のバージョンのNode.jsをインストールする方法 Ubuntu16.04で、任意のバージョンのNode.js環境を構築する方法をお伝えいたします。 apt-getコマンドによりNode.jsをインストールしようとすると、かなり古いバージョンがインストールされます。 そのため、最新または任意のバージョンをインストールするときは、PPA(personal package […]
  • MINTELのGNPDから出力されたCSVの文字化けの対処法 ミンテルGNPD(世界新商品情報データベース)から出力されたCSVが文字化けしている場合の対処法を備忘録として残しておきます。 Windowsパソコンにダウンロードかつ英文のみ ここでの対応は、「café」のようなアキュート・アクセントなどが文字化けしている場合の対応になります。 ubuntu上で文字コードをUTF-8に変換するにはiconvコマンドを用いて、次 […]
  • Opal ユーザーを登録する方法Opal ユーザーを登録する方法 OBiBaのOpalサーバにユーザーを登録する方法をお伝えします。 ユーザー登録はAdministratorが行うことができる機能になります。 そのため、administratorでサインインします。 表示された画面の右上にあるAdministrationをクリックします。 Administration機能一覧から、Users and […]
  • ggplot2を用いて階層的クラスタリングの結果を可視化する方法ggplot2を用いて階層的クラスタリングの結果を可視化する方法 R言語のggplot2パッケージを用いて階層的クラスタリングの結果を可視化する方法についてお伝えいたします。 一般に、階層的クラスタリングの結果は、デンドログラムまたは樹形図として可視化されます。 ggplot2パッケージには、デンドログラムまたは樹形図を可視化する機能が備わっておりません。 しかし、ggplot2パッケージと合わせてggdendroパッケージを用い […]
Python CaboChaを用いて係り受け構造を抽出する方法

Python CaboChaを用いて係り受け構造を抽出する方法」への1件のフィードバック

コメントは受け付けていません。