# -*- encoding: utf-8 -*-
from __future__ import unicode_literals
from __future__ import absolute_import
from pyknp import Morpheme
from pyknp import Tag
from pyknp import draw_tree, sprint_tree
import unittest
[docs]class TList(object):
""" ある文に関する基本句列を保持するオブジェクト """
[docs] def __init__(self):
self._tag = []
self._readonly = False
[docs] def push_tag(self, tag):
if not self._readonly:
self._tag.append(tag)
[docs] def push_mrph(self, mrph):
if len(self._tag) > 0:
self._tag[-1].push_mrph(mrph)
else:
raise Exception("Cannot push mrph: no tags.")
[docs] def push_synnodes(self, synnodes):
if len(self._tag) > 0:
self._tag[-1].synnodes.append(synnodes)
else:
raise Exception("Cannot push synnodes: no tags.")
[docs] def push_synnode(self, synnode):
if len(self._tag) > 0:
self._tag[-1].synnodes[-1].synnode.append(synnode)
else:
raise Exception("Cannot push synnode: no tags.")
[docs] def spec(self):
return ''.join([tag.spec() for tag in self._tag])
[docs] def set_readonly(self):
for tag in self._tag:
tag.set_readonly()
self._readonly = True
[docs] def draw_tree(self, fh=None, show_pos=True):
self.draw_tag_tree(fh=fh, show_pos=show_pos)
[docs] def draw_tag_tree(self, fh=None, show_pos=True):
""" タグ列の依存関係を木構造として表現して出力する. """
draw_tree(self._tag, fh=fh, show_pos=show_pos)
[docs] def sprint_tree(self):
return sprint_tree(self._tag)
[docs] def tag_list(self):
""" 基本句列を構成する全基本句オブジェクトを返す
Returns:
list of Tag: 基本句オブジェクトTagのリスト
"""
return self._tag
def __getitem__(self, index):
return self._tag[index]
def __len__(self):
return len(self._tag)
class TListTest(unittest.TestCase):
def test(self):
tlist = TList()
tag1 = Tag("+ 1D <BGH:構文/こうぶん><文節内><係:文節内><文頭>"
"<体言><名詞項候補><先行詞候補><正規化代表表記:構文/こうぶん>")
mrph1 = Morpheme("構文 こうぶん 構文 名詞 6 普通名詞 1 * 0 * 0 \""
"代表表記:構文/こうぶん カテゴリ:抽象物\" "
"<代表表記:構文/こうぶん>")
tag2 = Tag("+ -1D <BGH:解析/かいせき><文末><体言><用言:判>"
"<体言止><レベル:C>")
mrph2 = Morpheme("解析 かいせき 解析 名詞 6 サ変名詞 2 * 0 * 0 \""
"代表表記:解析/かいせき カテゴリ:抽象物 ドメイン:教育・学習;"
"科学・技術\" <代表表記:解析/かいせき>")
# Add tag with included morpheme
tag1.push_mrph(mrph1)
tlist.push_tag(tag1)
self.assertEqual(len(tlist), 1)
self.assertEqual(len(tlist[0].mrph_list()), 1)
# Add tag without morpheme
tlist.push_tag(tag2)
self.assertEqual(len(tlist), 2)
self.assertEqual(len(tlist[1].mrph_list()), 0)
# Add morpheme to second tag
tlist.push_mrph(mrph2)
self.assertEqual(len(tlist), 2)
self.assertEqual(len(tlist[0].mrph_list()), 1)
self.assertEqual(len(tlist[1].mrph_list()), 1)
if __name__ == '__main__':
unittest.main()