1 /* splitterモジュールのインターフェイス */
2 #ifndef _splitter_h_included_
3 #define _splitter_h_included_
4 
5 #include <anthy/dic.h>
6 #include <anthy/xstr.h>
7 #include <anthy/wtype.h>
8 #include <anthy/segclass.h>
9 
10 /* パラメータ */
11 #define RATIO_BASE 256
12 #define OCHAIRE_SCORE 5000000
13 
14 /** splitterのコンテキスト.
15  * 最初の境界設定からanthy_contextの解放まで有効
16  */
17 struct splitter_context {
18   /** splitter内部で使用する構造体 */
19   struct word_split_info_cache *word_split_info;
20   int char_count;
21   int is_reverse;
22   struct char_ent {
23     xchar *c;
24     int seg_border;
25     int initial_seg_len;/* 最初の文節分割の際にここから始まった文節が
26 			   あればその長さ */
27     enum seg_class best_seg_class;
28     struct meta_word* best_mw; /* 一番優先して使いたいmetaword */
29   }*ce;
30 };
31 
32 /* 制約のチェックの状態 */
33 enum constraint_stat {
34   unchecked, ok, ng
35 };
36 
37 /* とりあえず、適当に増やしてみて問題が出たら分類する */
38 enum metaword_type {
39   /* ダミー : seginfoを持たない */
40   MW_DUMMY,
41   /* wordlistを0個 or 一個含むもの */
42   MW_SINGLE,
43   /* 別のmetaword一個を含む: metaword + 句読点 など :seginfoはmw1から取る */
44   MW_WRAP,
45   /* 複合語先頭 */
46   MW_COMPOUND_HEAD,
47   /* 複合語用 */
48   MW_COMPOUND,
49   /* 複合語の一文節 */
50   MW_COMPOUND_LEAF,
51   /* 複合語の中の個々の文節を結合して一つの文節としてみたもの */
52   MW_COMPOUND_PART,
53   /* 動詞の連用形 + 形容詞 */
54   MW_V_RENYOU_A,
55   /* 動詞の連用形 + 名詞 */
56   MW_V_RENYOU_NOUN,
57   /* 数字 */
58   MW_NUMBER,
59   /**/
60   MW_OCHAIRE,
61   /**/
62   MW_END
63 };
64 
65 #define MW_FEATURE_NONE 0
66 #define MW_FEATURE_SV 1
67 #define MW_FEATURE_WEAK_CONN 2
68 #define MW_FEATURE_SUFFIX 4
69 #define MW_FEATURE_NUM 16
70 #define MW_FEATURE_CORE1 32
71 #define MW_FEATURE_DEP_ONLY 64
72 #define MW_FEATURE_HIGH_FREQ 128
73 #define MW_FEATURE_WEAK_SEQ 256
74 
75 /*
76  * meta_word: 境界の検索の対象となるもの
77  * 単一のword_listを含むものの他にいくつかの種類がある.
78  *
79  */
80 struct meta_word {
81   int from, len;
82   /* 文節境界の検出に使用するスコア */
83   int score;
84   /* 候補の生成の時に使用するスコア */
85   int struct_score;
86   /* 形式の情報 */
87   int dep_word_hash;
88   int mw_features;
89   wtype_t core_wt;
90   enum dep_class dep_class;
91   /**/
92   enum seg_class seg_class;
93   enum constraint_stat can_use; /* セグメント境界に跨がっていない */
94   enum metaword_type type;
95   struct word_list *wl;
96   struct meta_word *mw1, *mw2;
97   xstr cand_hint;
98 
99   int nr_parts;
100 
101   /* listのリンク */
102   struct meta_word *next;
103 };
104 
105 int anthy_init_splitter(void);
106 void anthy_quit_splitter(void);
107 
108 void anthy_init_split_context(xstr *xs, struct splitter_context *, int is_reverse);
109 /*
110  * mark_border(context, l1, l2, r1);
111  * l1とr1の間の文節を検出する、ただしl1とl2の間は境界にしない。
112  */
113 void anthy_mark_border(struct splitter_context *, int from, int from2, int to);
114 void anthy_commit_border(struct splitter_context *, int nr,
115 		   struct meta_word **mw, int *len);
116 void anthy_release_split_context(struct splitter_context *c);
117 
118 /* 作り出した文節の情報を取得する */
119 int anthy_get_nr_metaword(struct splitter_context *, int from, int len);
120 struct meta_word *anthy_get_nth_metaword(struct splitter_context *,
121 					 int from, int len, int nth);
122 /**/
123 int anthy_dep_word_hash(xstr *xs);
124 
125 
126 #endif
127