1 /* 文節境界の検出に使うデータ */ 2 #ifndef _wordborder_h_included_ 3 #define _wordborder_h_included_ 4 5 6 #include <anthy/dic.h> 7 #include <anthy/alloc.h> 8 #include <anthy/segclass.h> 9 #include <anthy/depgraph.h> 10 11 struct splitter_context; 12 13 /* 14 * meta_wordの使用可能チェックのやり方 15 */ 16 enum mw_check { 17 /* なにもせず */ 18 MW_CHECK_NONE, 19 /* mw->wlが無いか、wlが使える場合 */ 20 MW_CHECK_SINGLE, 21 MW_CHECK_BORDER, 22 MW_CHECK_WRAP, 23 MW_CHECK_OCHAIRE, 24 MW_CHECK_NUMBER, 25 MW_CHECK_COMPOUND 26 }; 27 28 /* 29 * 文字列中のある場所を表し, 30 * そこから始まるmeta_word, word_listのセットを持つ 31 */ 32 struct char_node { 33 int max_len; 34 struct meta_word *mw; 35 struct word_list *wl; 36 }; 37 38 /* 39 * コンテキスト中の自立語などの情報、最初に変換キーを押したときに 40 * 構築される 41 */ 42 struct word_split_info_cache { 43 struct char_node *cnode; 44 45 /* キャッシュ構成時に使う情報 */ 46 /* 接尾辞を探すのに使う */ 47 int *seq_len;/* そこから始まる最長の単語の長さ */ 48 /* 接頭辞を探すのに使う */ 49 int *rev_seq_len;/* そこで終わる最長の単語の長さ */ 50 /* 文節境界contextからのコピー */ 51 int *seg_border; 52 /* 検索で一番成績の良かったクラス */ 53 enum seg_class* best_seg_class; 54 /* */ 55 struct meta_word **best_mw; 56 /* アロケータ */ 57 allocator MwAllocator, WlAllocator; 58 }; 59 60 /* 61 * meta_wordの状態 62 */ 63 enum mw_status { 64 MW_STATUS_NONE, 65 /* mw->mw1に中身が入っている */ 66 MW_STATUS_WRAPPED, 67 /* mw-mw1とmw->mw2から連結 */ 68 MW_STATUS_COMBINED, 69 /* 複合語用 */ 70 MW_STATUS_COMPOUND, 71 /* 複合語の個々の文節を結合して一つの文節として見たもの */ 72 MW_STATUS_COMPOUND_PART, 73 /* OCHAIRE学習から取り出す */ 74 MW_STATUS_OCHAIRE 75 }; 76 77 78 79 /* metawordの種類による処理の違い (metaword.c) */ 80 extern struct metaword_type_tab_ { 81 enum metaword_type type; 82 const char *name; 83 enum mw_status status; 84 enum mw_check check; 85 } anthy_metaword_type_tab[]; 86 87 /* 88 * 0: 接頭辞 89 * 1: 自立語部 90 * 2: 接尾辞 91 */ 92 #define NR_PARTS 4 93 #define PART_PREFIX 0 94 #define PART_CORE 1 95 #define PART_POSTFIX 2 96 #define PART_DEPWORD 3 97 98 struct part_info { 99 /* このpartの長さ */ 100 int from, len; 101 /* 品詞 */ 102 wtype_t wt; 103 seq_ent_t seq; 104 /* 頻度 */ 105 int freq; 106 /* 付属語クラス */ 107 enum dep_class dc; 108 }; 109 110 /* 111 * word_list: 文節を形成するもの 112 * 接頭語、自立語、接尾語、付属語を含む 113 */ 114 struct word_list { 115 /**/ 116 int from, len; /* 文節全体 */ 117 int is_compound; /* 複合語かどうか */ 118 119 /**/ 120 int dep_word_hash; 121 int mw_features; 122 /**/ 123 enum seg_class seg_class; 124 enum constraint_stat can_use; /* セグメント境界に跨がっていない */ 125 126 /* 漢字を得るためではなくて、雑多な処理に使いたい情報 */ 127 int head_pos; /* lattice検索用の品詞 */ 128 int tail_ct; /* meta_wordの結合用の活用形 */ 129 130 /**/ 131 int last_part; 132 struct part_info part[NR_PARTS]; 133 134 /* このword_listを作った際の情報 */ 135 int node_id; /* 付属語グラフの検索開始のnodeのid*/ 136 137 /* 同じfromを持つword_listのリスト */ 138 struct word_list *next; 139 }; 140 141 142 /* splitter.c */ 143 #define SPLITTER_DEBUG_NONE 0 144 /* wordlistの表示 */ 145 #define SPLITTER_DEBUG_WL 1 146 /* metawordの表示 */ 147 #define SPLITTER_DEBUG_MW 2 148 /* latticeの nodeの表示 */ 149 #define SPLITTER_DEBUG_LN 4 150 /* 自立語のマッチした品詞 */ 151 #define SPLITTER_DEBUG_ID 8 152 /**/ 153 #define SPLITTER_DEBUG_CAND 16 154 155 int anthy_splitter_debug_flags(void); 156 157 158 /* defined in wordseq.c */ 159 /* 自立語以降の接続の処理 */ 160 void anthy_scan_node(struct splitter_context *sc, 161 struct word_list *wl, 162 xstr *follow, int node); 163 int anthy_get_node_id_by_name(const char *name); 164 int anthy_init_depword_tab(void); 165 void anthy_quit_depword_tab(void); 166 167 /* depgraph.c */ 168 int anthy_get_nr_dep_rule(void); 169 void anthy_get_nth_dep_rule(int, struct wordseq_rule *); 170 171 /* defined in wordlist.c */ 172 void anthy_commit_word_list(struct splitter_context *, struct word_list *wl); 173 struct word_list *anthy_alloc_word_list(struct splitter_context *); 174 void anthy_print_word_list(struct splitter_context *, struct word_list *); 175 void anthy_make_word_list_all(struct splitter_context *); 176 177 /* defined in metaword.c */ 178 void anthy_make_metaword_all(struct splitter_context *); 179 void anthy_print_metaword(struct splitter_context *, struct meta_word *); 180 181 void anthy_mark_border_by_metaword(struct splitter_context* sc, 182 struct meta_word* mw); 183 184 185 /* defined in evalborder.c */ 186 void anthy_eval_border(struct splitter_context *, int, int, int); 187 188 /* defined at lattice.c */ 189 void anthy_mark_borders(struct splitter_context *sc, int from, int to); 190 191 /* defined at seg_class.c */ 192 void anthy_set_seg_class(struct word_list* wl); 193 194 #endif 195