From bf15cf5d0d9336020383c594c5e824f018d47454 Mon Sep 17 00:00:00 2001 From: Haruo Kinoshita Date: Sun, 3 Oct 2021 00:35:30 +0900 Subject: [PATCH] =?UTF-8?q?repr=E3=82=92=E5=AE=9F=E8=A3=85=E3=81=97?= =?UTF-8?q?=E3=81=A6=E4=BD=95=E3=81=AE=E6=96=87=E5=AD=97=E5=88=97=E3=81=8B?= =?UTF-8?q?=E3=82=8F=E3=81=8B=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyknp/juman/mlist.py | 13 ++++++++++ pyknp/juman/morpheme.py | 9 +++++++ pyknp/knp/blist.py | 18 ++++++++++++++ pyknp/knp/bunsetsu.py | 8 +++++++ pyknp/knp/rel.py | 12 ++++++++++ pyknp/knp/syngraph.py | 53 +++++++++++++++++++++++++++++++++++++++-- 6 files changed, 111 insertions(+), 2 deletions(-) diff --git a/pyknp/juman/mlist.py b/pyknp/juman/mlist.py index 1875839..017cff5 100644 --- a/pyknp/juman/mlist.py +++ b/pyknp/juman/mlist.py @@ -83,6 +83,9 @@ def __getitem__(self, index): def __len__(self): return len(self._mrph) + def __repr__(self): + return 'MList(%s)' % repr(self.spec()) + class MListTest(unittest.TestCase): @@ -116,6 +119,16 @@ def test_doukei(self): self.assertEqual(mlist.spec(), spec) self.assertEqual(mlist.new_spec(), new_spec) + def test_repr(self): + import pyknp + spec = """母 はは 母 名詞 6 普通名詞 1 * 0 * 0 "代表表記:母/はは 漢字読み:訓 カテゴリ:人 ドメイン:家庭・暮らし" +@ 母 ぼ 母 名詞 6 普通名詞 1 * 0 * 0 "代表表記:母/ぼ 漢字読み:音 カテゴリ:人" +です です だ 判定詞 4 * 0 判定詞 25 デス列基本形 27 NIL +""" + mlist = MList(spec) + repr_mlist = eval(repr(mlist)) + self.assertEqual(repr_mlist.spec(), mlist.spec()) + if __name__ == '__main__': unittest.main() diff --git a/pyknp/juman/morpheme.py b/pyknp/juman/morpheme.py index 733038c..e5d9074 100644 --- a/pyknp/juman/morpheme.py +++ b/pyknp/juman/morpheme.py @@ -255,6 +255,9 @@ def _parse_fstring(self, fstring): rvalue[key] = val.split(";") return rvalue + def __repr__(self): + return "Morpheme(%s)" % repr(self.spec()) + class MorphemeTest(unittest.TestCase): @@ -311,6 +314,12 @@ def test_knp(self): self.assertEqual(mrph.fstring, '<漢字><かな漢字><自立><←複合><名詞相当語>') self.assertEqual(mrph.spec(), spec) + def test_repr(self): + spec = "構文 こうぶん 構文 名詞 6 普通名詞 1 * 0 * 0 NIL <漢字><かな漢字><自立><←複合><名詞相当語>\n" + mrph = Morpheme(spec) + new_mrph = eval(repr(mrph)) + self.assertEqual(mrph.spec(), new_mrph.spec()) + class MorphemeTest2(unittest.TestCase): diff --git a/pyknp/knp/blist.py b/pyknp/knp/blist.py index 38bb1ea..4728ee9 100644 --- a/pyknp/knp/blist.py +++ b/pyknp/knp/blist.py @@ -260,6 +260,9 @@ def get_clause_starts(self, concat_clause_in_paren=False, discourse_clause=False starts.append(idx + 1) return starts + def __repr__(self): + return "BList(%s)" % repr(self.spec()) + class BListTest(unittest.TestCase): @@ -505,6 +508,21 @@ def test4(self): self.assertEqual(pas.cfid, "束の間/つかのま:判0") self.assertEqual(len(pas.arguments), 0) + def test5(self): + spec = """ +# S-ID:1 KNP:4.20-CF1.1 DATE:2020/08/04 SCORE:-41.95960 +* 1D <文頭><感動詞><修飾><係:連用><区切:0-4><連用要素><連用節><正規化代表表記:こんにちは/こんにちは><主辞代表表記:こんにちは/こんにちは> ++ 1D <文頭><感動詞><修飾><係:連用><区切:0-4><連用要素><連用節><正規化代表表記:こんにちは/こんにちは> +こんにちは こんにちは こんにちは 感動詞 12 * 0 * 0 * 0 "代表表記:こんにちは/こんにちは" <代表表記:こんにちは/こんにちは><正規化代表表記:こんにちは/こんにちは><文頭><かな漢字><ひらがな><自立><内容語><タグ単位始><文節始><文節主辞> +* -1D <文末><体言><用言:判><体言止><レベル:C><区切:5-5><裸名詞><提題受:30><主節><状態述語><正規化代表表記::/:><主辞代表表記::/:> ++ -1D <文末><体言><用言:判><体言止><レベル:C><区切:5-5><裸名詞><提題受:30><主節><状態述語><判定詞><名詞項候補><先行詞候補><正規化代表表記::/:><用言代表表記::/:><時制-無時制><格解析結果::/::判0:ガ/U/-/-/-/-> +: : : 名詞 6 普通名詞 1 * 0 * 0 "未知語:未対応文字種 品詞推定:特殊 疑似代表表記 代表表記::/: 品詞変更::-:-:-15-1-0-0" <未知語><品詞推定:特殊><疑似代表表記><代表表記::/:><正規化代表表記::/:><文末><表現文末><品詞変更::-:-:-15-1-0-0-"未知語:未対応文字種 品詞推定:特殊 疑似代表表記 代表表記::/:"><品曖-その他><記英数カ><英記号><記号><名詞相当語><自立><内容語><タグ単位始><文節始><文節主辞> +EOS +""" + blist = BList(spec) + new_blist = eval(repr(blist)) + self.assertEqual(blist.spec(), new_blist.spec()) + if __name__ == '__main__': unittest.main() diff --git a/pyknp/knp/bunsetsu.py b/pyknp/knp/bunsetsu.py index a09f72a..49bd1ae 100644 --- a/pyknp/knp/bunsetsu.py +++ b/pyknp/knp/bunsetsu.py @@ -125,6 +125,9 @@ def pstring(self, string=None): else: return self._pstring + def __repr__(self): + return "Bunsetsu(%s)" % repr(self.spec()) + class BunsetsuTest(unittest.TestCase): @@ -177,6 +180,11 @@ def test_spec(self): bnst.push_tag(tag2) self.assertEqual(bnst.spec(), self.spec) + def test_repr(self): + bnst = Bunsetsu(self.bunsetsu_str) + new_bnst = eval(repr(bnst)) + self.assertEqual(bnst.spec(), new_bnst.spec()) + if __name__ == '__main__': unittest.main() diff --git a/pyknp/knp/rel.py b/pyknp/knp/rel.py index 861e6d1..51015ca 100644 --- a/pyknp/knp/rel.py +++ b/pyknp/knp/rel.py @@ -43,3 +43,15 @@ def __init__(self, fstring): self.sid = sid self.tid = id_ self.mode = mode + + def __repr__(self): + if self.ignore: + return 'Rel("")' + specs = [] + specs.append('type="%s"' % self.atype) + if self.mode: + specs.append('mode="%s"' % self.mode) + specs.append('target="%s"' % self.targtet) + if self.sid: + specs.append('sid="%s" id="%s"' % (self.sid, self.id)) + return 'Rel(%s)' % repr(' '.join(specs)) diff --git a/pyknp/knp/syngraph.py b/pyknp/knp/syngraph.py index 9746ce2..c14aac6 100644 --- a/pyknp/knp/syngraph.py +++ b/pyknp/knp/syngraph.py @@ -35,13 +35,25 @@ def __init__(self, spec): else: self.feature = string + def spec(self): + return "!! %s %s%s %s%s" % ( + ','.join(str(n) for n in self.tagids), + ','.join(str(n) for n in self.parentids), + self.dpndtype, + "<見出し:%s>" % self.midasi if self.midasi else "", + self.feature + ) + + def __repr__(self): + return "SynNodes(%s)" % repr(self.spec()) + class SynNode(object): def __init__(self, spec): self.synid = '' - self.tagids = [] - self.score = '' + self.tagids = None + self.score = None self.feature = '' # ! 1 <スコア:0.693><上位語><下位語数:323> @@ -60,6 +72,22 @@ def __init__(self, spec): self.feature = string + def spec(self): + specs = [] + if self.synid: + specs.append("" % self.synid) + if self.score is not None: + specs.append("<スコア:%f>" % self.score) + specs.append(self.feature) + + return "! %s %s" % ( + ",".join(str(n) for n in self.tagids), + "".join(specs) + ) + + def __repr__(self): + return 'SynNode(%s)' % repr(self.spec()) + class SynNodesTest(unittest.TestCase): @@ -83,6 +111,20 @@ def test_synnodes(self): self.assertEqual(synnodes2.midasi, '冷え込む') self.assertEqual(synnodes2.feature, '') + def test_spec(self): + for s in [self.str1, self.str2]: + synnodes = SynNodes(s) + self.assertEqual(synnodes.spec(), s) + + def test_repr(self): + synnodes = SynNodes(self.str1) + new_s = eval(repr(synnodes)) + self.assertEqual(synnodes.tagids, new_s.tagids) + self.assertEqual(synnodes.parentids, new_s.parentids) + self.assertEqual(synnodes.dpndtype, new_s.dpndtype) + self.assertEqual(synnodes.midasi, new_s.midasi) + self.assertEqual(synnodes.feature, new_s.feature) + class SynNodeTest(unittest.TestCase): @@ -108,6 +150,13 @@ def test_synnode(self): self.assertEqual(synnode3.score, 0.693) self.assertEqual(synnode3.feature, '<上位語><下位語数:323>') + def test_repr(self): + synnode = SynNode(self.str1) + new_s = eval(repr(synnode)) + self.assertEqual(synnode.synid, new_s.synid) + self.assertEqual(synnode.score, new_s.score) + self.assertEqual(synnode.feature, new_s.feature) + if __name__ == '__main__': unittest.main()