Library Exploration: CaboCha

Load CaboCha Parser


In [1]:
import CaboCha
cab = CaboCha.Parser("")

Create a Tree


In [2]:
str = "巨大なマーライオンがセントーサ島にいた"
tree = cab.parse(str)

Feature Extraction

Chunk Based


In [3]:
for i in range(tree.chunk_size()):
    chunk = tree.chunk(i)
    print ('Chunk:', i)
    print ('- Score:', chunk.score)
    print ('- Link:', chunk.link)  # 係り先チャンク番号
    print ('- Size:', chunk.token_size)
    print ('- Pos:', chunk.token_pos)  # チャンク先頭トークン番号
    print ('- Head:', chunk.head_pos)  # 意味的主辞トークン番号
    print ('- Func:', chunk.func_pos)  # 統語的主辞トークン番号
    print ('- Features:', )
    for j in range(chunk.feature_list_size):
        print ('\t', chunk.feature_list(j))


Chunk: 0
- Score: 1.4154999256134033
- Link: 1
- Size: 2
- Pos: 0
- Head: 0
- Func: 1
- Features:
	 SHS:巨大
	 SHP0:名詞
	 SHP1:形容動詞語幹
	 SFS:な
	 SFP0:助動詞
	 SFF:体言接続
	 SLS:巨大
	 SLP0:名詞
	 SLP1:形容動詞語幹
	 SRS:な
	 SRP0:助動詞
	 SRF:体言接続
	 LF:な
	 RL:巨大
	 RH:巨大
	 RF:な
	 SBOS:1
	 a:体言接続
Chunk: 1
- Score: -1.945734977722168
- Link: 3
- Size: 2
- Pos: 2
- Head: 0
- Func: 1
- Features:
	 SCASE:が
	 SHS:マーライオン
	 SHP0:名詞
	 SHP1:一般
	 SFS:が
	 SFP0:助詞
	 SFP1:格助詞
	 SFP2:一般
	 SLS:マーライオン
	 SLP0:名詞
	 SLP1:一般
	 SRS:が
	 SRP0:助詞
	 SRP1:格助詞
	 SRP2:一般
	 LF:が
	 RL:マーライオン
	 RH:マーライオン
	 RF:が
	 GCASE:が
	 A:が
Chunk: 2
- Score: -1.945734977722168
- Link: 3
- Size: 3
- Pos: 4
- Head: 1
- Func: 2
- Features:
	 DCASE:に
	 DHS:島
	 DHP0:名詞
	 DHP1:接尾
	 DHP2:地域
	 DFS:に
	 DFP0:助詞
	 DFP1:格助詞
	 DFP2:一般
	 DLS:セントーサ
	 DLP0:名詞
	 DLP1:固有名詞
	 DLP2:地域
	 DLP3:一般
	 DRS:に
	 DRP0:助詞
	 DRP1:格助詞
	 DRP2:一般
	 LF:に
	 RL:セントーサ
	 RH:島
	 RF:に
	 GCASE:に
	 A:に
Chunk: 3
- Score: 0.0
- Link: -1
- Size: 2
- Pos: 7
- Head: 0
- Func: 1
- Features:
	 FHS:い
	 FHP0:動詞
	 FHP1:自立
	 FHF:連用形
	 FFS:た
	 FFP0:助動詞
	 FFF:基本形
	 FLS:い
	 FLP0:動詞
	 FLP1:自立
	 FLF:連用形
	 FRS:た
	 FRP0:助動詞
	 FRF:基本形
	 LF:た
	 RL:い
	 RH:い
	 RF:た
	 FEOS:1
	 A:基本形

Token Based


In [4]:
n=0 # chunk number
for i in range(tree.token_size()):
    token = tree.token(i)
    print ('Surface:', token.surface)
    print ('- Normalized:', token.normalized_surface)
    print ('- Feature:', token.feature)
    print ('- NE:', token.ne)
    print ('- Info:', token.additional_info)
    print ('- Chunk:', token.chunk)
    if token.chunk:
        print ('\t','- Chunk No.:',n)
        print ('\t','- Score:', token.chunk.score)
        print ('\t','- Link:', token.chunk.link)  # 係り先チャンク番号
        print ('\t','- Size:', token.chunk.token_size)
        print ('\t','- Pos:', token.chunk.token_pos)  # チャンク先頭トークン番号
        print ('\t','- Head:', token.chunk.head_pos)  # 意味的主辞トークン番号
        print ('\t','- Func:', token.chunk.func_pos)  # 統語的主辞トークン番号
        for j in range(chunk.feature_list_size):
            print ('\t\t', chunk.feature_list(j))
        n+=1


Surface: 巨大
- Normalized: 巨大
- Feature: 名詞,形容動詞語幹,*,*,*,*,巨大,キョダイ,キョダイ
- NE: None
- Info: None
- Chunk: <CaboCha.Chunk; proxy of <Swig Object of type 'CaboCha::Chunk *' at 0x103f7b2a0> >
	 - Chunk No.: 0
	 - Score: 1.4154999256134033
	 - Link: 1
	 - Size: 2
	 - Pos: 0
	 - Head: 0
	 - Func: 1
		 FHS:い
		 FHP0:動詞
		 FHP1:自立
		 FHF:連用形
		 FFS:た
		 FFP0:助動詞
		 FFF:基本形
		 FLS:い
		 FLP0:動詞
		 FLP1:自立
		 FLF:連用形
		 FRS:た
		 FRP0:助動詞
		 FRF:基本形
		 LF:た
		 RL:い
		 RH:い
		 RF:た
		 FEOS:1
		 A:基本形
Surface: な
- Normalized: な
- Feature: 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
- NE: None
- Info: None
- Chunk: None
Surface: マーライオン
- Normalized: マーライオン
- Feature: 名詞,一般,*,*,*,*,*
- NE: None
- Info: None
- Chunk: <CaboCha.Chunk; proxy of <Swig Object of type 'CaboCha::Chunk *' at 0x103f7b120> >
	 - Chunk No.: 1
	 - Score: -1.945734977722168
	 - Link: 3
	 - Size: 2
	 - Pos: 2
	 - Head: 0
	 - Func: 1
		 FHS:い
		 FHP0:動詞
		 FHP1:自立
		 FHF:連用形
		 FFS:た
		 FFP0:助動詞
		 FFF:基本形
		 FLS:い
		 FLP0:動詞
		 FLP1:自立
		 FLF:連用形
		 FRS:た
		 FRP0:助動詞
		 FRF:基本形
		 LF:た
		 RL:い
		 RH:い
		 RF:た
		 FEOS:1
		 A:基本形
Surface: が
- Normalized: が
- Feature: 助詞,格助詞,一般,*,*,*,が,ガ,ガ
- NE: None
- Info: None
- Chunk: None
Surface: セントーサ
- Normalized: セントーサ
- Feature: 名詞,固有名詞,地域,一般,*,*,*
- NE: None
- Info: None
- Chunk: <CaboCha.Chunk; proxy of <Swig Object of type 'CaboCha::Chunk *' at 0x103f7b2a0> >
	 - Chunk No.: 2
	 - Score: -1.945734977722168
	 - Link: 3
	 - Size: 3
	 - Pos: 4
	 - Head: 1
	 - Func: 2
		 FHS:い
		 FHP0:動詞
		 FHP1:自立
		 FHF:連用形
		 FFS:た
		 FFP0:助動詞
		 FFF:基本形
		 FLS:い
		 FLP0:動詞
		 FLP1:自立
		 FLF:連用形
		 FRS:た
		 FRP0:助動詞
		 FRF:基本形
		 LF:た
		 RL:い
		 RH:い
		 RF:た
		 FEOS:1
		 A:基本形
Surface: 島
- Normalized: 島
- Feature: 名詞,接尾,地域,*,*,*,島,トウ,トー
- NE: None
- Info: None
- Chunk: None
Surface: に
- Normalized: に
- Feature: 助詞,格助詞,一般,*,*,*,に,ニ,ニ
- NE: None
- Info: None
- Chunk: None
Surface: い
- Normalized: い
- Feature: 動詞,自立,*,*,一段,連用形,いる,イ,イ
- NE: None
- Info: None
- Chunk: <CaboCha.Chunk; proxy of <Swig Object of type 'CaboCha::Chunk *' at 0x103dffe70> >
	 - Chunk No.: 3
	 - Score: 0.0
	 - Link: -1
	 - Size: 2
	 - Pos: 7
	 - Head: 0
	 - Func: 1
		 FHS:い
		 FHP0:動詞
		 FHP1:自立
		 FHF:連用形
		 FFS:た
		 FFP0:助動詞
		 FFF:基本形
		 FLS:い
		 FLP0:動詞
		 FLP1:自立
		 FLF:連用形
		 FRS:た
		 FRP0:助動詞
		 FRF:基本形
		 LF:た
		 RL:い
		 RH:い
		 RF:た
		 FEOS:1
		 A:基本形
Surface: た
- Normalized: た
- Feature: 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
- NE: None
- Info: None
- Chunk: None

Show Tree Representation


In [5]:
print(tree.toString(CaboCha.FORMAT_TREE))


        巨大な-D    
  マーライオンが---D
    セントーサ島に-D
                いた
EOS

Parsing


In [6]:
chunk_num = 0
surfaces = []
phrases = []
link_pairs = []

for i in range(tree.token_size()):
    token = tree.token(i)
    
    if token.chunk:
        surfaces.append(token.surface)
        phrases.append(token.surface)
        link_pairs.append((chunk_num, token.chunk.link))
        chunk_num+=1
    else:
        phrases[-1] = phrases[-1] + token.surface

Show Pairs


In [7]:
link_pairs=link_pairs[:-1]  # Remove pair for EOS

print(surfaces)
print(phrases)
print(link_pairs)


['巨大', 'マーライオン', 'セントーサ', 'い']
['巨大な', 'マーライオンが', 'セントーサ島に', 'いた']
[(0, 1), (1, 3), (2, 3)]

Show Dependency of Surfaces


In [8]:
for link_pair in link_pairs:
    print(surfaces[link_pair[0]], ' => ', surfaces[link_pair[1]])


巨大  =>  マーライオン
マーライオン  =>  い
セントーサ  =>  い

Show Dependency of Phrases


In [9]:
for link_pair in link_pairs:
    print(phrases[link_pair[0]], ' => ', phrases[link_pair[1]])


巨大な  =>  マーライオンが
マーライオンが  =>  いた
セントーサ島に  =>  いた