Beispiel #1
0
    def test_change_case_wo_to_ni(self):
        knp_lines = """
# S-ID:1 KNP:4.12-CF1.1 DATE:2015/10/28 SCORE:-8.29897
* 0 1D <文頭><ヲ><助詞><体言><一文字漢字><係:ヲ格><区切:0-0><格要素><連用要素><正規化代表表記:席/せき><主辞代表表記:席/せき>
+ 0 1D <文頭><ヲ><助詞><体言><一文字漢字><係:ヲ格><区切:0-0><格要素><連用要素><名詞項候補><先行詞候補><正規化代表表記:席/せき><解析格:ヲ>
席 せき 席 名詞 6 普通名詞 1 * 0 * 0 "代表表記:席/せき 漢字読み:音 カテゴリ:場所-施設部位" <代表表記:席/せき><漢字読み:音><カテゴリ:場所-施設部位><正規化代表表記:席/せき><文頭><漢字><かな漢字><名詞相当語><自立><内容語><タグ単位始><文節始><文節主辞><係:ヲ格>
を を を 助詞 9 格助詞 1 * 0 * 0 NIL <かな漢字><ひらがな><付属>
* 1 -1D <文末><否定表現><〜ぬ><用言:動><レベル:C><区切:5-5><ID:(文末)><並キ:述:&ST:3.5&&&レベル:B><提題受:30><主節><動態述語><モダリティ-禁止><敬語:尊敬表現><正規化代表表記:立つ/たつ><主辞代表表記:立つ/たつ><並列類似度:-100.000>
+ 1 -1D <文末><否定表現><〜ぬ><用言:動><レベル:C><区切:5-5><ID:(文末)><並キ:述:&ST:3.5&&&レベル:B><提題受:30><主節><動態述語><モダリティ-禁止><敬語:尊敬表現><正規化代表表記:立つ/たつ><用言代表表記:立つ/たつ><主題格:一人称優位><格関係0:ヲ:席><格解析結果:立つ/たつ:動3:ガ/U/-/-/-/-;ヲ/C/席/0/0/1;ニ/U/-/-/-/-;ト/U/-/-/-/-;デ/U/-/-/-/-;カラ/U/-/-/-/-;ヨリ/U/-/-/-/-;マデ/U/-/-/-/-;ヘ/U/-/-/-/-;時間/U/-/-/-/-;外の関係/U/-/-/-/-;ノ/U/-/-/-/-;修飾/U/-/-/-/-;トスル/U/-/-/-/-;ニヨル/U/-/-/-/-;ニトル/U/-/-/-/-;トイウ/U/-/-/-/-;ニオク/U/-/-/-/-;ヲツウジル/U/-/-/-/-;ニタイスル/U/-/-/-/->
立た たた 立つ 動詞 2 * 0 子音動詞タ行 6 未然形 3 "代表表記:立つ/たつ 付属動詞候補(基本) 自他動詞:他:立てる/たてる 反義:動詞:座る/すわる" <代表表記:立つ/たつ><付属動詞候補(基本)><自他動詞:他:立てる/たてる><反義:動詞:座る/すわる><正規化代表表記:立つ/たつ><かな漢字><活用語><自立><内容語><タグ単位始><文節始><文節主辞>
ないで ないで ぬ 助動詞 5 * 0 助動詞ぬ型 27 タ系連用テ形 9 NIL <かな漢字><ひらがな><活用語><否定><付属>
ください ください くださる 接尾辞 14 動詞性接尾辞 7 子音動詞ラ行イ形 11 命令形 6 "代表表記:下さる/くださる" <代表表記:下さる/くださる><正規化代表表記:下さる/くださる><文末><表現文末><かな漢字><ひらがな><活用語><付属>
EOS
""".split(
            "\n"
        )[
            1:-1
        ]

        prev_case = "ヲ"
        new_case = "ニ"
        chunk_ind = 5

        actual = replace_lib.change_case(knp_lines, prev_case, new_case, chunk_ind)
        expected = """
席 せき 席 名詞 6 普通名詞 1 * 0 * 0 "代表表記:席/せき 漢字読み:音 カテゴリ:場所-施設部位" <代表表記:席/せき><漢字読み:音><カテゴリ:場所-施設部位><正規化代表表記:席/せき><文頭><漢字><かな漢字><名詞相当語><自立><内容語><タグ単位始><文節始><文節主辞><係:ヲ格>
に に に 助詞 9 格助詞 1 * 0 * 0 NIL
立た たた 立つ 動詞 2 * 0 子音動詞タ行 6 未然形 3 "代表表記:立つ/たつ 付属動詞候補(基本) 自他動詞:他:立てる/たてる 反義:動詞:座る/すわる" <代表表記:立つ/たつ><付属動詞候補(基本)><自他動詞:他:立てる/たてる><反義:動詞:座る/すわる><正規化代表表記:立つ/たつ><かな漢字><活用語><自立><内容語><タグ単位始><文節始><文節主辞>
ないで ないで ぬ 助動詞 5 * 0 助動詞ぬ型 27 タ系連用テ形 9 NIL <かな漢字><ひらがな><活用語><否定><付属>
ください ください くださる 接尾辞 14 動詞性接尾辞 7 子音動詞ラ行イ形 11 命令形 6 "代表表記:下さる/くださる" <代表表記:下さる/くださる><正規化代表表記:下さる/くださる><文末><表現文末><かな漢字><ひらがな><活用語><付属>
""".split(
            "\n"
        )[
            1:-1
        ]

        self.assertEquals(actual, expected)
Beispiel #2
0
    def test_change_case_ni_to_kara(self):
        knp_lines = """
# S-ID:1 KNP:4.12-CF1.1 DATE:2015/10/28 SCORE:-18.54409
* 0 1D <文頭><ニ><助詞><体言><係:ニ格><区切:0-0><格要素><連用要素><正規化代表表記:防波堤/ぼうはてい><主辞代表表記:防波堤/ぼうはてい>
+ 0 1D <文頭><ニ><助詞><体言><係:ニ格><区切:0-0><格要素><連用要素><名詞項候補><先行詞候補><正規化代表表記:防波堤/ぼうはてい><解析格:ニ>
防波堤 ぼうはてい 防波堤 名詞 6 普通名詞 1 * 0 * 0 "代表表記:防波堤/ぼうはてい カテゴリ:場所-施設" <代表表記:防波堤/ぼうはてい><カテゴリ:場所-施設><正規化代表表記:防波堤/ぼうはてい><文頭><漢字><かな漢字><名詞相当語><自立><内容語><タグ単位始><文節始><文節主辞><係:ニ格>
に に に 助詞 9 格助詞 1 * 0 * 0 NIL <かな漢字><ひらがな><付属>
* 1 -1D <文末><否定表現><〜ぬ><用言:動><レベル:C><区切:5-5><ID:(文末)><並キ:述:&ST:3.5&&&レベル:B><提題受:30><主節><動態述語><モダリティ-禁止><敬語:尊敬表現><正規化代表表記:近付く/ちかづく><主辞代表表記:近付く/ちかづく><並列類似度:-100.000>
+ 1 -1D <文末><否定表現><〜ぬ><用言:動><レベル:C><区切:5-5><ID:(文末)><並キ:述:&ST:3.5&&&レベル:B><提題受:30><主節><動態述語><モダリティ-禁止><敬語:尊敬表現><正規化代表表記:近付く/ちかづく><用言代表表記:近付く/ちかづく><主題格:一人称優位><格関係0:ニ:防波堤><格解析結果:近付く/ちかづく:動1:ガ/U/-/-/-/-;ヲ/U/-/-/-/-;ニ/C/防波堤/0/0/1;ト/U/-/-/-/-;デ/U/-/-/-/-;カラ/U/-/-/-/-;ヨリ/U/-/-/-/-;マデ/U/-/-/-/-;ヘ/U/-/-/-/-;時間/U/-/-/-/-;外の関係/U/-/-/-/-;修飾/U/-/-/-/-;ノ/U/-/-/-/-;トスル/U/-/-/-/-;ニヨル/U/-/-/-/-;ヲツウジル/U/-/-/-/-;ニムケル/U/-/-/-/-;ニオク/U/-/-/-/-;ニツヅク/U/-/-/-/-;ニクラベル/U/-/-/-/->
近づか ちかづか 近づく 動詞 2 * 0 子音動詞カ行 2 未然形 3 "代表表記:近付く/ちかづく 自他動詞:他:近付ける/ちかづける 反義:動詞:遠ざかる/とおざかる;動詞:遠退く/とおのく" <代表表記:近付く/ちかづく><自他動詞:他:近付ける/ちかづける><反義:動詞:遠ざかる/とおざかる;動詞:遠退く/とおのく><正規化代表表記:近付く/ちかづく><かな漢字><活用語><自立><内容語><タグ単位始><文節始><文節主辞>
ないで ないで ぬ 助動詞 5 * 0 助動詞ぬ型 27 タ系連用テ形 9 NIL <かな漢字><ひらがな><活用語><否定><付属>
ください ください くださる 接尾辞 14 動詞性接尾辞 7 子音動詞ラ行イ形 11 命令形 6 "代表表記:下さる/くださる" <代表表記:下さる/くださる><正規化代表表記:下さる/くださる><文末><表現文末><かな漢字><ひらがな><活用語><付属>
EOS
""".split(
            "\n"
        )[
            1:-1
        ]

        prev_case = "ニ"
        new_case = "カラ"
        chunk_ind = 5

        actual = replace_lib.change_case(knp_lines, prev_case, new_case, chunk_ind)
        expected = """
防波堤 ぼうはてい 防波堤 名詞 6 普通名詞 1 * 0 * 0 "代表表記:防波堤/ぼうはてい カテゴリ:場所-施設" <代表表記:防波堤/ぼうはてい><カテゴリ:場所-施設><正規化代表表記:防波堤/ぼうはてい><文頭><漢字><かな漢字><名詞相当語><自立><内容語><タグ単位始><文節始><文節主辞><係:ニ格>
から から から 助詞 9 格助詞 1 * 0 * 0 NIL
近づか ちかづか 近づく 動詞 2 * 0 子音動詞カ行 2 未然形 3 "代表表記:近付く/ちかづく 自他動詞:他:近付ける/ちかづける 反義:動詞:遠ざかる/とおざかる;動詞:遠退く/とおのく" <代表表記:近付く/ちかづく><自他動詞:他:近付ける/ちかづける><反義:動詞:遠ざかる/とおざかる;動詞:遠退く/とおのく><正規化代表表記:近付く/ちかづく><かな漢字><活用語><自立><内容語><タグ単位始><文節始><文節主辞>
ないで ないで ぬ 助動詞 5 * 0 助動詞ぬ型 27 タ系連用テ形 9 NIL <かな漢字><ひらがな><活用語><否定><付属>
ください ください くださる 接尾辞 14 動詞性接尾辞 7 子音動詞ラ行イ形 11 命令形 6 "代表表記:下さる/くださる" <代表表記:下さる/くださる><正規化代表表記:下さる/くださる><文末><表現文末><かな漢字><ひらがな><活用語><付属>
""".split(
            "\n"
        )[
            1:-1
        ]

        self.assertEquals(actual, expected)
def sentence_func(knp_lines):
    tokens = [line for line in knp_lines if replace_lib.is_token(line)]
    orig_str = "".join([line.split(' ')[0] for line in tokens])

    #最後の文節のインデックス, その正規化代表表記
    last_chunk_ind, last_chunk_line = [(ind, line) for ind, line in enumerate(knp_lines) if replace_lib.is_chunk(line) and ("-1D" in line)][0]
    last_chunk_num = replace_lib.get_chunk_num(last_chunk_line)

    #最後の文節内のheadのトークン
    head_token_line = ""
    try:
        head_token_line = get_head_token_of_chunk(knp_lines, last_chunk_ind)
    except:
        Exception('No head token')
        # print orig_str + '\t' + 'ERROR'
        return #FIXME 本当はこうしたくないけど、仕方ない。


    ans = []

    #否定されている動詞は反義語を持つか?
    if "反義" in head_token_line:
        #最後の文節内のトークンを取るので、もし同一のトークンが複数あった場合は最後のものを取る
        head_token_ind = [ind for ind, line in enumerate(tokens) if line == head_token_line][-1]

        #ヲ格をニ格に変換した文を生成し、反義語を置き換える
        #「席を立たないでください」→「席に座ってください」
        wo_to_ni_case_tokens = [line for line in replace_lib.change_case(knp_lines, 'ヲ', 'ニ', last_chunk_ind) if replace_lib.is_token(line)]
        if len(wo_to_ni_case_tokens) != 0:
            ans.extend(replace_lib.get_tokens_lst_replaced_with_antonym(wo_to_ni_case_tokens, head_token_ind, head_token_line))

        #ニ格をヲ格に変換した文を生成し、反義語を置き換える
        #「席に座らないでください」→「席を立っていてください」…?
        ni_to_wo_case_tokens = [line for line in replace_lib.change_case(knp_lines, 'ニ', 'ヲ', last_chunk_ind) if replace_lib.is_token(line)]
        if len(ni_to_wo_case_tokens) != 0:
            ans.extend(replace_lib.get_tokens_lst_replaced_with_antonym(ni_to_wo_case_tokens, head_token_ind, head_token_line))

        #ニ格をカラ格に変換した文を生成し、反義語を置き換える
        #「波打ち際に近づかないでください」→「波打ち際から遠ざかってください」
        ni_to_kara_case_tokens = [line for line in replace_lib.change_case(knp_lines, 'ニ', 'カラ', last_chunk_ind) if replace_lib.is_token(line)]
        if len(ni_to_kara_case_tokens) != 0:
            ans.extend(replace_lib.get_tokens_lst_replaced_with_antonym(ni_to_kara_case_tokens, head_token_ind, head_token_line))

        #カラ格をニ格に変換した文を生成し、反義語を置き換える
        #「波打ち際から遠ざからないでください」→「波打ち際に近づいて(いて)ください」?
        kara_to_ni_case_tokens = [line for line in replace_lib.change_case(knp_lines, 'カラ', 'ニ', last_chunk_ind) if replace_lib.is_token(line)]
        if len(kara_to_ni_case_tokens) != 0:
            ans.extend(replace_lib.get_tokens_lst_replaced_with_antonym(kara_to_ni_case_tokens, head_token_ind, head_token_line))



        ans.extend(replace_lib.get_tokens_lst_replaced_with_antonym(tokens, head_token_ind, head_token_line))



    arg_chunks = [(ind, line) for ind, line in enumerate(knp_lines) if replace_lib.is_chunk(line) and line.split(' ')[2] == (str(last_chunk_num) + "D") and re.search("<係:[^>]+>", line)]
    for arg_chunk_ind, arg_chunk in arg_chunks:
        head_token_of_arg = get_head_token_of_chunk(knp_lines, arg_chunk_ind)
        if head_token_of_arg == "":
            pass
        else:

            # pat_case = re.compile("<係:[^>]+格>")
            # if ("<修飾>" in arg_chunk) or pat_case.search(arg_chunk):
            #まず、argの主辞に反義語が存在するかどうか?
            if ("反義" in head_token_of_arg):
                token_ind = get_token_ind(knp_lines, arg_chunk_ind, head_token_of_arg)
                ans.extend(replace_lib.get_tokens_lst_replaced_with_antonym(tokens, token_ind, head_token_of_arg))

        #次に、そのチャンクにかかっている動詞or名詞or形容詞に反義語が存在するか?
        #FIXME これだと、「分かりにくい表現を使わないでください」が変換できない
        chunk_num = replace_lib.get_chunk_num(arg_chunk)
        for mod_chunk_ind, mod_chunk in replace_lib.get_mod_chunk_and_mod_chunk_ind_lst(knp_lines, chunk_num):
            mod_chunk_token = get_head_token_of_chunk(knp_lines, mod_chunk_ind)
            if mod_chunk_token == "":
                pass
            else:
                if (get_pos_of_token(mod_chunk_token) == "名詞" or get_pos_of_token(mod_chunk_token) == "形容詞") and ("<係:連格>" in mod_chunk_token):
                    # print "DEBUG:hit"
                    if "反義" in mod_chunk_token:
                        tok_ind = get_token_ind(knp_lines, mod_chunk_ind, mod_chunk_token)
                        # print "DEBUG: hit"
                        ans.extend(replace_lib.get_tokens_lst_replaced_with_antonym(tokens, tok_ind, mod_chunk_token))


    #この段階で、変換が起こらなかった文を排除する
    ans = remove_unchanged_str(orig_str, ans)
    ans = ["".join([token_line.split(' ')[0] for token_line in replace_lib.remove_negation_from_banning(token_lines)]) for token_lines in ans]
    ans = [s for s in ans if s != orig_str] #元の文は除く
    ans = list(set(ans)) #重複した文を削除
    for s in ans:
        print (orig_str + '\t' + s)