NIIBE Yutaka
gniib****@fsij*****
2010年 7月 6日 (火) 14:51:48 JST
janitor/mkdepgraph-cleanup branch からさらに分岐した feature/depgraph-wt branch で下記の depgraph の変更を入れました。 使う際には janitor/no-ptab-use と merge されることが前提です。 (ないと "数接尾辞" の ptab.h での定義が WF_NONE の影響がでて 例えば「100%」、「3番センター」の変換が変わってしまいます。) wt based depgraph implementation. (No ptab.) 2010-07-05 NIIBE Yutaka <gniib****@fsij*****> * anthy/dic.h (anthy_get_seq_ent_wtype_freq0): New. * depgraph/indepword-wt.txt: New file. * depgraph/Makefile.am: Use indepword-wt.txt. * depgraph/mkdepgraph.c (INDEPWORD_INPUT_FILENAME): Use indepword-wt.txt. (parse_indep): Support #XX type description. (init_indep_word_seq_tab): # is not comment any more. * src-splitter/compose.c (enum_candidates): Use anthy_wtype_equal. * src-splitter/wordlist.c (make_word_list): Use anthy_get_seq_ent_wtype_freq0. * src-worddic/ext_ent.c (anthy_get_ext_seq_ent_wtype): Bug fix. Swap arg1 and arg2. * src-worddic/word_dic.c (anthy_get_seq_ent_wtype_freq0): New. (anthy_get_seq_ent_wtype_compound_freq): Use anthy_wtype_equal. diff --git a/anthy/dic.h b/anthy/dic.h index 6105999..6c5efaf 100644 --- a/anthy/dic.h +++ b/anthy/dic.h @@ -39,6 +39,7 @@ int anthy_get_nth_dic_ent_wtype(seq_ent_t, xstr *, int nth, wtype_t *w); int anthy_get_seq_ent_pos(seq_ent_t, int pos); int anthy_get_seq_ent_ct(seq_ent_t, int pos, int ct); int anthy_get_seq_ent_wtype_freq(seq_ent_t, wtype_t); +int anthy_get_seq_ent_wtype_freq0(seq_ent_t, wtype_t); int anthy_get_seq_ent_indep(seq_ent_t se); /* 複合語 */ compound_ent_t anthy_get_nth_compound_ent(seq_ent_t se, int nth); diff --git a/depgraph/Makefile.am b/depgraph/Makefile.am index 713cfcd..a12cb1e 100644 --- a/depgraph/Makefile.am +++ b/depgraph/Makefile.am @@ -4,14 +4,14 @@ DEPWORDS = conjugate.table conjugate.depword fix.depword noun.depword \ a.depword ajv.depword master.depword INCLUDES = -I$(top_srcdir)/ -DSRCDIR=\"$(srcdir)\" CLEANFILES = anthy.dep all.depword -EXTRA_DIST = indepword.txt $(DEPWORDS) +EXTRA_DIST = indepword-wt.txt $(DEPWORDS) # Generate the dictionary noinst_PROGRAMS = mkdepgraph mkdepgraph_SOURCES = mkdepgraph.c mkdepgraph_LDADD = ../src-main/libanthy.la ../src-worddic/libanthydic.la -anthy.dep : mkdepgraph all.depword indepword.txt +anthy.dep : mkdepgraph all.depword indepword-wt.txt ./mkdepgraph all.depword: $(DEPWORDS) diff --git a/depgraph/indepword-wt.txt b/depgraph/indepword-wt.txt new file mode 100644 index 0000000..c64b2ef --- /dev/null +++ b/depgraph/indepword-wt.txt @@ -0,0 +1,161 @@ +#kxi @カ変活用動詞連用形 +#kxo @カ変活用動詞未然形 +#kxoi @カ変活用動詞命令形 +#kxure @カ変活用動詞仮定形 +#kxuru @カ変活用動詞終止形 +#kxuru2 +#kxya +#sxi @する未然形「し」 +#sxe @する未然形「せ」 +#sxi2 @する連用形「し」 +#sxuru +#sxure +#sxiro @する命令形「しろ」 +#sxeyo @する命令形「せよ」 +#sxya +#T @名詞*のあと @名詞35のあと +#B5 @バ行5段活用動詞語幹 +#B5r @バ行5段活用動詞語幹 @バ行5段活用動詞名詞化語幹 +#C5r @カ行C5段活用動詞語幹 @カ行C5段活用動詞名詞化語幹 +#CJ @接続詞 +#CN @名詞*のあと @地名のあと +#CNPRE +#CNS @名詞*のあと @地名のあと +#CNSUC1 +#CNSUC2 +#D2KY @形容詞語幹 +#yasui @形容詞語幹 +#D2T16 @名詞*のあと @名詞35のあと +#D2T35 @名詞*のあと @名詞15のあと @名詞35のあと +#F00 @副詞 @副詞0のあと +#F01 @副詞 @副詞1のあと +#F02 @副詞 @副詞2のあと +#F03 @副詞 @副詞3のあと +#F04 @副詞 @副詞4のあと +#F05 @副詞 @副詞5のあと +#F06 @副詞 @副詞6のあと +#F07 @副詞 @副詞7のあと +#F08 @副詞 @副詞8のあと +#F09 @副詞 @副詞9のあと +#F10 @副詞 @副詞10のあと +#F11 @副詞 @副詞11のあと +#F12 @副詞 @副詞12のあと +#F13 @副詞 @副詞13のあと +#F14 @副詞 @副詞14のあと +#F15 @副詞 +#G5 @ガ行5段活用動詞語幹 +#G5r @ガ行5段活用動詞語幹 @ガ行5段活用動詞名詞化語幹 +#JCN @名詞*のあと +#JN @名詞*のあと @人名のあと +#JNM @名詞*のあと @人名のあと +#JNMUC @名詞*のあと +#JNS @名詞*のあと @人名のあと +#JNSSUC +#JNSUC +#JS +#JSSUC +#K2T15 @名詞*のあと +#K2T16 @名詞*のあと +#K2T35 @名詞*のあと +#K5 @カ行5段活用動詞語幹 +#K5r @カ行5段活用動詞語幹 @カ行5段活用動詞名詞化語幹 +#KJ @単漢字 +#KK @名詞*のあと @団体名のあと +#KN @名詞*のあと +#KS @上下一段活用動詞語幹 +#KSr @上下一段活用動詞語幹 @上下一段活用動詞名詞化語幹 +#KY @形容詞語幹 +#KYs @形容詞語幹 +#KYE @形容詞語幹 +#KYI @形容詞語幹 +#KYU @形容詞語幹 +#KYii @形容詞語幹 +#KYn @形容詞語幹 +#KYy @形容詞語幹 +#KYme @形容詞語幹 +#KYmi @形容詞語幹 +#KYmime @形容詞語幹 +#KYna @形容詞語幹 +#KYT @形容詞語幹 +#L5 @ラ行L5段活用動詞語幹 +#M5 @マ行5段活用動詞語幹 +#M5r @マ行5段活用動詞語幹 @マ行5段活用動詞名詞化語幹 +#N00 @数詞のあと +#N01 @数詞のあと +#N02 @数詞のあと +#N03 @数詞のあと +#N2KYT @名詞*のあと +#N2T10 @名詞*のあと @名詞35のあと +#N2T16 +#N2T17 +#N2T30 +#N2T35 @名詞*のあと @名詞35のあと +#N5 @ナ行5段活用動詞語幹 +#N5r @ナ行5段活用動詞語幹 @ナ行5段活用動詞名詞化語幹 +#ND2KY +#NN @数詞のあと +#NNPRE +#OKX @動詞丁寧表現語幹 +#PRE +#R5 @ラ行5段活用動詞語幹 +#R5r @ラ行5段活用動詞語幹 @ラ行5段活用動詞名詞化語幹 +#RT @連体詞 +#S5 @サ行5段活用動詞語幹 +#S5r @サ行5段活用動詞語幹 @サ行5段活用動詞名詞化語幹 +#SUC +#SX @サ変活用動詞語幹 @動詞丁寧表現語幹 +#T00 @名詞*のあと @名詞0のあと +#T01 @名詞*のあと @名詞1のあと +#T02 @名詞*のあと @名詞2のあと +#T03 @名詞*のあと @名詞3のあと +#T04 @名詞*のあと @名詞4のあと +#T05 @名詞*のあと @名詞5のあと +#T06 @名詞*のあと @名詞6のあと +#T07 @名詞*のあと @名詞7のあと +#T08 @名詞*のあと @名詞8のあと +#T09 @名詞*のあと @名詞9のあと +#T10 @名詞*のあと @名詞10のあと +#T11 @名詞*のあと @名詞11のあと +#T12 @名詞*のあと @名詞12のあと +#T13 @名詞*のあと @名詞13のあと +#T14 @名詞*のあと @名詞14のあと +#T15 @名詞*のあと @名詞15のあと +#T16 @名詞*のあと @名詞16のあと +#T17 @名詞*のあと @名詞17のあと +#T18 @名詞*のあと @名詞18のあと +#T19 @名詞*のあと @名詞19のあと +#T20 @名詞*のあと @名詞20のあと +#T21 @名詞*のあと @名詞21のあと +#T22 @名詞*のあと @名詞22のあと +#T23 @名詞*のあと @名詞23のあと +#T24 @名詞*のあと @名詞24のあと +#T25 @名詞*のあと @名詞25のあと +#T26 @名詞*のあと @名詞26のあと +#T27 @名詞*のあと @名詞27のあと +#T28 @名詞*のあと @名詞28のあと +#T29 @名詞*のあと @名詞29のあと +#T30 @名詞*のあと @名詞30のあと +#T31 @名詞*のあと @名詞31のあと +#T32 @名詞*のあと @名詞32のあと +#T33 @名詞*のあと @名詞33のあと +#T34 @名詞*のあと @名詞34のあと +#T35 @名詞*のあと @名詞35のあと +#T36 @名詞*のあと @名詞36のあと +#T37 @名詞*のあと @名詞37のあと +#T38 @名詞*のあと @名詞38のあと +#T39 @名詞*のあと @名詞39のあと +#T5 @タ行5段活用動詞語幹 +#T5r @タ行5段活用動詞語幹 @タ行5段活用動詞名詞化語幹 +#U5 @ワ行U5段活用動詞語幹 +#U5r @ワ行U5段活用動詞語幹 @ワ行U5段活用動詞名詞化語幹 +#W5 @ワ行5段活用動詞語幹 +#W5r @ワ行5段活用動詞語幹 @ワ行5段活用動詞名詞化語幹 +#ZX @ザ変活用動詞語幹 +#aru @ラ変活用動詞語幹 +#arazu +#NONE +#N04 @数詞のあと +#N05 @数詞のあと +#SVSUC +#OPEN @開き括弧 +#CLOSE @閉じ括弧 diff --git a/depgraph/mkdepgraph.c b/depgraph/mkdepgraph.c index 4cc4778..fd5e7f6 100644 --- a/depgraph/mkdepgraph.c +++ b/depgraph/mkdepgraph.c @@ -256,7 +256,7 @@ get_tokens (char *buf, char **tokens, int n) #define MAX_TOKEN 256 #define BUFSIZE 1024 #define DEPWORD_INPUT_FILENAME "all.depword" -#define INDEPWORD_INPUT_FILENAME "indepword.txt" +#define INDEPWORD_INPUT_FILENAME "indepword-wt.txt" static void init_depword_tab(void) @@ -305,25 +305,64 @@ init_depword_tab(void) static void parse_indep (char **tokens, int nr, int lineno) { - if (nr < 2) { - fprintf(stderr, "%d: Syntex error in indepword defs.\n", lineno); - return; - } + int node; + wtype_t wt; + int i; + + if (anthy_type_to_wtype (tokens[0], &wt) == NULL) + { + fprintf (stderr, "%d: no such WT\n", lineno); + return; + } + + for (i = 0; i < nrRules; i++) + if (anthy_wtype_equal (gRules[i].wt, wt)) + return; - gRules = (struct wordseq_rule*)realloc (gRules, sizeof(struct wordseq_rule)*(nrRules+1)); + gRules = (struct wordseq_rule *)realloc (gRules, sizeof (struct wordseq_rule)*(nrRules+1)); if (gRules == NULL) { fprintf (stderr, "%d: malloc failed.\n", lineno); exit (1); } - /* 行の先頭には品詞の名前が入っている */ - gRules[nrRules].wt = anthy_init_wtype_by_name(tokens[0]); + if (nr == 2) + node = get_node_id_by_name (tokens[1]); + else if (nr >= 3) + { + int i; + struct dep_branch *db; + struct dep_node *dn; + xstr *strs[1]; + + node = get_node_id_by_name (tokens[0]); /* New node */ + dn = &gNodes[node]; + strs[0] = anthy_cstr_to_xstr ("", ANTHY_EUC_JP_ENCODING); + db = find_branch (dn, strs, 1); - /* その次にはノード名が入っている */ - gRules[nrRules].node_id = get_node_id_by_name(tokens[1]); + db->transition = (struct dep_transition *)realloc (db->transition, + sizeof (struct dep_transition)* + (db->nr_transitions + nr - 1)); + + for (i = 1; i < nr; i++) + { + struct dep_transition *tr; + + tr = &db->transition[db->nr_transitions]; + parse_transition (tokens[i], tr); + db->nr_transitions++; + } + } + else + { + if (nr != 1) + fprintf (stderr, "%d: syntax error (ignored).\n", lineno); + return; + } - nrRules ++; + gRules[nrRules].wt = wt; + gRules[nrRules].node_id = node; + nrRules++; } /** 自立語からの遷移表 */ @@ -350,8 +389,6 @@ init_indep_word_seq_tab (void) goto error; *p = '\0'; - if (buf[0] == '#') - continue; lineno++; nr = get_tokens (buf, tokens, MAX_TOKEN); diff --git a/src-splitter/compose.c b/src-splitter/compose.c index 774df7c..db3f21c 100644 --- a/src-splitter/compose.c +++ b/src-splitter/compose.c @@ -153,8 +153,7 @@ enum_candidates(struct seg_ent *seg, } anthy_get_nth_dic_ent_wtype(ce->elm[n].se, &ce->elm[n].str, i, &wt); - ce->elm[n].wt = anthy_get_wtype_with_ct(ce->elm[n].wt, CT_NONE); - if (anthy_wtype_include(ce->elm[n].wt, wt)) { + if (anthy_wtype_equal (ce->elm[n].wt, wt)) { xstr word, yomi; yomi.len = ce->elm[n].str.len; diff --git a/src-splitter/wordlist.c b/src-splitter/wordlist.c index f677a3c..8f27735 100644 --- a/src-splitter/wordlist.c +++ b/src-splitter/wordlist.c @@ -388,7 +388,7 @@ make_word_list(struct splitter_context *sc, int freq; anthy_get_nth_dep_rule(i, &rule); if (!is_compound) { - freq = anthy_get_seq_ent_wtype_freq(se, rule.wt); + freq = anthy_get_seq_ent_wtype_freq0 (se, rule.wt); } else { freq = anthy_get_seq_ent_wtype_compound_freq(se, rule.wt); } diff --git a/src-worddic/ext_ent.c b/src-worddic/ext_ent.c index e3de315..509e8bd 100644 --- a/src-worddic/ext_ent.c +++ b/src-worddic/ext_ent.c @@ -543,7 +543,7 @@ int anthy_get_ext_seq_ent_wtype(struct seq_ent *se, wtype_t w) { if (se == &num_ent) { - if (anthy_wtype_include(w, wt_num)) { + if (anthy_wtype_include(wt_num, w)) { /* 数字の場合 */ return 10; } diff --git a/src-worddic/word_dic.c b/src-worddic/word_dic.c index d14bedd..47e1434 100644 --- a/src-worddic/word_dic.c +++ b/src-worddic/word_dic.c @@ -516,6 +516,32 @@ anthy_get_seq_ent_wtype_freq(seq_ent_t seq, wtype_t wt) return f; } +int +anthy_get_seq_ent_wtype_freq0(seq_ent_t seq, wtype_t wt) +{ + int i, f; + + if (!seq) { + return 0; + } + /**/ + if (seq->nr_dic_ents == 0) { + return anthy_get_ext_seq_ent_wtype(seq, wt); + } + + f = 0; + /* 単語 */ + for (i = 0; i < seq->nr_dic_ents; i++) { + if (seq->dic_ents[i]->order == 0 && + anthy_wtype_equal (wt, seq->dic_ents[i]->type)) { + if (f < seq->dic_ents[i]->freq) { + f = seq->dic_ents[i]->freq; + } + } + } + return f; +} + /* * wtの品詞を持つ複合語の中で最大の頻度を持つものを返す */ @@ -533,7 +559,7 @@ anthy_get_seq_ent_wtype_compound_freq(seq_ent_t se, wtype_t wt) if (!anthy_get_nth_dic_ent_is_compound(se, i)) { continue; } - if (anthy_wtype_include(wt, s->dic_ents[i]->type)) { + if (anthy_wtype_equal (wt, s->dic_ents[i]->type)) { if (f < s->dic_ents[i]->freq) { f = s->dic_ents[i]->freq; } --