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×Ubuntu14.04 CaboChaを用いて係り受け構造を抽出する方法
ピンバック:CentOS にMeCabとCaboChaをインストール | SEA-NAの地獄坂