def test_remove_negation_from_banning1(self): token_lines = """ 忘れ わすれ 忘れる 動詞 2 * 0 母音動詞 1 未然形 3 "代表表記:忘れる/わすれる 付属動詞候補(基本) 反義:動詞:覚える/おぼえる" <代表表記:忘れる/わすれる><付属動詞候補(基本)><反義:動詞:覚える/おぼえる><正規化代表表記:忘れる/わすれる><文頭><かな漢字><活用語><自立><内容語><タグ単位始><文節始><文節主辞> ない ない ない 接尾辞 14 形容詞性述語接尾辞 5 イ形容詞アウオ段 18 基本形 2 "代表表記:ない/ない" <代表表記:ない/ない><正規化代表表記:ない/ない><かな漢字><ひらがな><活用語><否定><付属> ように ように ようだ 助動詞 5 * 0 ナ形容詞 21 ダ列基本連用形 7 NIL <かな漢字><ひらがな><活用語><付属> して して する 接尾辞 14 動詞性接尾辞 7 サ変動詞 16 タ系連用テ形 14 "代表表記:する/する" <代表表記:する/する><正規化代表表記:する/する><かな漢字><ひらがな><活用語><付属> ください ください くださる 接尾辞 14 動詞性接尾辞 7 子音動詞ラ行イ形 11 命令形 6 "代表表記:下さる/くださる" <代表表記:下さる/くださる><正規化代表表記:下さる/くださる><文末><表現文末><かな漢字><ひらがな><活用語><付属> """[ 1:-1 ].split( "\n" ) # 初めの改行をカット actual = replace_lib.remove_negation_from_banning(token_lines) expected = """ 忘れる わすれる 忘れる 動詞 * * * 母音動詞 * 基本形 * "代表表記:忘れる/わすれる 付属動詞候補(基本) 反義:動詞:覚える/おぼえる" <代表表記:忘れる/わすれる><付属動詞候補(基本)><反義:動詞:覚える/おぼえる><正規化代表表記:忘れる/わすれる><文頭><かな漢字><活用語><自立><内容語><タグ単位始><文節始><文節主辞> ように ように ようだ 助動詞 5 * 0 ナ形容詞 21 ダ列基本連用形 7 NIL <かな漢字><ひらがな><活用語><付属> して して する 接尾辞 14 動詞性接尾辞 7 サ変動詞 16 タ系連用テ形 14 "代表表記:する/する" <代表表記:する/する><正規化代表表記:する/する><かな漢字><ひらがな><活用語><付属> ください ください くださる 接尾辞 14 動詞性接尾辞 7 子音動詞ラ行イ形 11 命令形 6 "代表表記:下さる/くださる" <代表表記:下さる/くださる><正規化代表表記:下さる/くださる><文末><表現文末><かな漢字><ひらがな><活用語><付属> """[ 1:-1 ].split( "\n" ) # 初めの改行をカット self.assertEquals(actual, expected)
def test_remove_negation_from_banning0(self): token_lines = """ 覚え おぼえ 覚える 動詞 2 * 0 母音動詞 1 未然形 3 "代表表記:覚える/おぼえる 反義:動詞:忘れる/わすれる" <代表表記:覚える/おぼえる><反義:動詞:忘れる/わすれる><正規化代表表記:覚える/おぼえる><文頭><かな漢字><活用語><自立><内容語><タグ単位始><文節始><文節主辞> ないで ないで ぬ 助動詞 5 * 0 助動詞ぬ型 27 タ系連用テ形 9 NIL <かな漢字><ひらがな><活用語><否定><付属> 下さい ください 下さる 接尾辞 14 動詞性接尾辞 7 子音動詞ラ行イ形 11 命令形 6 "代表表記:下さる/くださる" <代表表記:下さる/くださる><正規化代表表記:下さる/くださる><文末><表現文末><かな漢字><活用語><付属> """[ 1:-1 ].split( "\n" ) # 初めの改行をカット actual = replace_lib.remove_negation_from_banning(token_lines) expected = """ 覚えて おぼえて 覚える 動詞 * * * 母音動詞 * タ系連用テ形 * "代表表記:覚える/おぼえる 反義:動詞:忘れる/わすれる" <代表表記:覚える/おぼえる><反義:動詞:忘れる/わすれる><正規化代表表記:覚える/おぼえる><文頭><かな漢字><活用語><自立><内容語><タグ単位始><文節始><文節主辞> 下さい ください 下さる 接尾辞 14 動詞性接尾辞 7 子音動詞ラ行イ形 11 命令形 6 "代表表記:下さる/くださる" <代表表記:下さる/くださる><正規化代表表記:下さる/くださる><文末><表現文末><かな漢字><活用語><付属> """[ 1:-1 ].split( "\n" ) # 初めの改行をカット 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)