ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

Cabochaの構造がよくわからなかった件

スポンサードリンク

f:id:aipacommander:20210616031914p:plain

よくみるフォーマットですね。コマンドで実行するとどの単語のまとまり(chunk)に係っているか確認できます。

で、こいつをPythonから使ってみるといまいちクラスのインターフェースがよくわからず四苦八苦していましたが、先に組んでくれた人のコードをみたらだいたい理解できた。

github.com

簡略版でこんな感じ。

import CaboCha
from collections import defaultdict

option = '-d /usr/lib/mecab/dic/mecab-ipadic-neologd'
parser = CaboCha.Parser(option)
tree = cabocha.parse('昔、わたしが飼っていた猫は、とても美味しそうな缶詰を食べていた。')
prev_links_dic = defaultdict(list)
for chunk_id in range(tree.chunk_size()):
    chunk = tree.chunk(chunk_id)
    print('chunk_id:', chunk_id, ', chunk_link:', chunk.link)
    for j in range(chunk.token_size):
        token_id = chunk.token_pos + j
        token = tree.token(token_id)
        print(token.surface, '\t', token.feature)
    
    if chunk.link >= 0:
        prev_links_dic[chunk.link].append(chunk_id) 

# chunk_id: 0 , chunk_link: 2
# 昔   名詞,副詞可能,*,*,*,*,昔,ムカシ,ムカシ
# 、   記号,読点,*,*,*,*,、,、,、
# chunk_id: 1 , chunk_link: 2
# わたし     名詞,代名詞,一般,*,*,*,わたし,ワタシ,ワタシ
# が   助詞,格助詞,一般,*,*,*,が,ガ,ガ
# chunk_id: 2 , chunk_link: 3
# 飼っ    動詞,自立,*,*,五段・ワ行促音便,連用タ接続,飼う,カッ,カッ
# て   助詞,接続助詞,*,*,*,*,て,テ,テ
# い   動詞,非自立,*,*,一段,連用形,いる,イ,イ
# た   助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
# chunk_id: 3 , chunk_link: 7
# 猫   名詞,一般,*,*,*,*,猫,ネコ,ネコ
# は   助詞,係助詞,*,*,*,*,は,ハ,ワ
# 、   記号,読点,*,*,*,*,、,、,、
# chunk_id: 4 , chunk_link: 5
# とても     副詞,助詞類接続,*,*,*,*,とても,トテモ,トテモ
# chunk_id: 5 , chunk_link: 6
# 美味し     形容詞,自立,*,*,形容詞・イ段,ガル接続,美味しい,オイシ,オイシ
# そう    名詞,接尾,助動詞語幹,*,*,*,そう,ソウ,ソー
# な   助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
# chunk_id: 6 , chunk_link: 7
# 缶詰    名詞,一般,*,*,*,*,缶詰,カンヅメ,カンズメ
# を   助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
# chunk_id: 7 , chunk_link: -1
# 食べ    動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
# て   助詞,接続助詞,*,*,*,*,て,テ,テ
# い   動詞,非自立,*,*,一段,連用形,いる,イ,イ
# た   助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
# 。   記号,句点,*,*,*,*,。,。,。

for chunk_id in prev_links_dic.keys():
    print(chunk_id, prev_links_dic[chunk_id])
# 2 [0, 1]
# 3 [2]
# 7 [3, 6]
# 5 [4]
# 6 [5]