2 * ³ÎÄê(¥³¥ß¥Ã¥È)¸å¤Î½èÍý¤ò¤¹¤ë¡£
3 * ³Æ¼ï¤Î³Ø½¬½èÍý¤ò¸Æ¤Ó½Ð¤¹
5 * anthy_proc_commit() ¤¬³°Éô¤«¤é¸Æ¤Ð¤ì¤ë
10 #include <anthy/ordering.h>
11 #include <anthy/record.h>
12 #include <anthy/splitter.h>
13 #include <anthy/segment.h>
16 #define MAX_OCHAIRE_ENTRY_COUNT 100
17 #define MAX_OCHAIRE_LEN 32
18 #define MAX_PREDICTION_ENTRY 100
20 #define MAX_UNKNOWN_WORD 100
22 /* ¸ò´¹¤µ¤ì¤¿¸õÊä¤òõ¤¹ */
24 learn_swapped_candidates(struct segment_list *sl)
28 for (i = 0; i < sl->nr_segments; i++) {
29 seg = anthy_get_nth_segment(sl, i);
30 if (seg->committed != 0) {
31 /* ºÇ½é¤Î¸õÊä(0ÈÖÌÜ)¤Ç¤Ê¤¤¸õÊä(seg->committedÈÖÌÜ)¤¬¥³¥ß¥Ã¥È¤µ¤ì¤¿ */
32 anthy_swap_cand_ent(seg->cands[0],
33 seg->cands[seg->committed]);
36 anthy_cand_swap_ageup();
39 /* Ťµ¤¬ÊѤï¤Ã¤¿Ê¸Àá¤ÎÊѹ¹¸å¤ËÂФ·¤Æ */
41 learn_resized_segment(struct splitter_context *sc,
42 struct segment_list *sl)
47 = alloca(sizeof(struct meta_word*) * sl->nr_segments);
49 = alloca(sizeof(int) * sl->nr_segments);
51 /* ³ÆʸÀá¤ÎŤµ¤ÎÇÛÎó¤Èmeta_word¤ÎÇÛÎó¤òÍÑ°Õ¤¹¤ë */
52 for (i = 0; i < sl->nr_segments; i++) {
53 struct seg_ent *se = anthy_get_nth_segment(sl, i);
54 mw[i] = se->cands[se->committed]->mw;
55 len_array[i] = se->str.len;
58 anthy_commit_border(sc, sl->nr_segments, mw, len_array);
61 /* Ťµ¤¬ÊѤï¤Ã¤¿Ê¸Àá¤ÎÊѹ¹Á°¤ËÂФ·¤Æ */
63 clear_resized_segment(struct splitter_context *sc,
64 struct segment_list *sl)
68 mark = alloca(sizeof(int)*sc->char_count);
69 for (i = 0; i < sc->char_count; i++) {
72 /* ¼ÂºÝ¤Ë³ÎÄꤵ¤ì¤¿Ê¸Àá¤ÎŤµ¤ò¥Þ¡¼¥¯¤¹¤ë */
74 for (i = 0; i < sl->nr_segments; i++) {
75 seg = anthy_get_nth_segment(sl, i);
76 mark[from] = seg->len;
77 from = from + seg->len;
79 for (i = 0; i < sc->char_count; i++) {
80 int len = sc->ce[i].initial_seg_len;
81 /* ºÇ½é¤ÎŤµ¤È³ÎÄꤵ¤ì¤¿Ä¹¤µ¤¬°Û¤Ê¤ì¤Ð¡¢
82 »È¤ï¤ì¤Ê¤«¤Ã¤¿Ì¤Ãθì¤Î²ÄǽÀ¤¬¤¢¤ë */
83 if (len && len != mark[i]) {
87 anthy_forget_unused_unknown_word(&xs);
90 if (!anthy_select_section("UNKNOWN_WORD", 0)) {
91 anthy_truncate_section(MAX_UNKNOWN_WORD);
95 /* record¤Ë¤ªÃãÆþ¤ì³Ø½¬¤Î·ë²Ì¤ò½ñ¤¹þ¤à */
97 commit_ochaire(struct seg_ent *seg, int count, xstr* xs)
100 if (xs->len >= MAX_OCHAIRE_LEN) {
103 if (anthy_select_row(xs, 1)) {
106 anthy_set_nth_value(0, count);
107 for (i = 0; i < count; i++, seg = seg->next) {
108 anthy_set_nth_value(i * 2 + 1, seg->len);
109 anthy_set_nth_xstr(i * 2 + 2, &seg->cands[seg->committed]->str);
113 /* record¤ÎÎΰè¤òÀáÌ󤹤뤿¤á¤Ë¡¢¤ªÃãÆþ¤ì³Ø½¬¤Î¥Í¥¬¥Æ¥£¥Ö¤Ê
116 release_negative_ochaire(struct splitter_context *sc,
117 struct segment_list *sl)
122 /* ÊÑ´¹Á°¤Î¤Ò¤é¤¬¤Êʸ»úÎó */
123 xs.len = sc->char_count;
124 xs.str = sc->ce[0].c;
126 /* xs¤ÎÉôʬʸ»úÎó¤ËÂФ·¤Æ */
127 for (start = 0; start < xs.len; start ++) {
128 for (len = 1; len <= xs.len - start && len < MAX_OCHAIRE_LEN; len ++) {
130 part.str = &xs.str[start];
132 if (anthy_select_row(&part, 0) == 0) {
139 /* ¤ªÃãÆþ¤ì³Ø½¬¤ò¹Ô¤¦ */
141 learn_ochaire(struct splitter_context *sc,
142 struct segment_list *sl)
147 if (anthy_select_section("OCHAIRE", 1)) {
151 /* ¤ªÃãÆþ¤ì³Ø½¬¤Î¥Í¥¬¥Æ¥£¥Ö¤Ê¥¨¥ó¥È¥ê¤ò¾Ã¤¹ */
152 release_negative_ochaire(sc, sl);
154 /* ¤ªÃãÆþ¤ì³Ø½¬¤ò¤¹¤ë */
155 for (count = 2; count <= sl->nr_segments && count < 5; count++) {
156 /* 2ʸÀá°Ê¾å¤ÎŤµ¤ÎʸÀáÎó¤ËÂФ·¤Æ */
158 for (i = 0; i <= sl->nr_segments - count; i++) {
159 struct seg_ent *head = anthy_get_nth_segment(sl, i);
164 if (xs.len < 2 && count < 3) {
165 /* ºÙÀÚ¤ì¤ÎʸÀá¤ò³Ø½¬¤¹¤ë¤³¤È¤òÈò¤±¤ë¡¢
166 * ¤¤¤¤²Ã¸º¤Êheuristics */
169 /* ʸÀáÎó¤ò¹½À®¤¹¤ëʸ»úÎó¤òºî¤ë */
170 for (j = 1, s = head->next; j < count; j++, s = s->next) {
171 xs.len += s->str.len;
174 commit_ochaire(head, count, &xs);
177 if (anthy_select_section("OCHAIRE", 1)) {
180 anthy_truncate_section(MAX_OCHAIRE_ENTRY_COUNT);
184 learn_prediction_str(xstr *idx, xstr *xs)
188 time_t t = time(NULL);
189 if (anthy_select_row(idx, 1)) {
192 nr_predictions = anthy_get_nr_values();
194 /* ´û¤ËÍúÎò¤Ë¤¢¤ë¾ì¹ç¤Ï¥¿¥¤¥à¥¹¥¿¥ó¥×¤À¤±¹¹¿· */
195 for (i = 0; i < nr_predictions; i += 2) {
196 xstr *log = anthy_get_nth_xstr(i + 1);
200 if (anthy_xstrcmp(log, xs) == 0) {
201 anthy_set_nth_value(i, t);
206 /* ¤Ê¤¤¾ì¹ç¤ÏËöÈø¤ËÄɲà */
207 if (i == nr_predictions) {
208 anthy_set_nth_value(nr_predictions, t);
209 anthy_set_nth_xstr(nr_predictions + 1, xs);
210 anthy_mark_row_used();
213 anthy_mark_row_used();
218 learn_prediction(struct segment_list *sl)
222 if (anthy_select_section("PREDICTION", 1)) {
225 for (i = 0; i < sl->nr_segments; i++) {
226 struct seg_ent *seg = anthy_get_nth_segment(sl, i);
227 xstr *xs = &seg->cands[seg->committed]->str;
229 if (seg->committed < 0) {
232 if (learn_prediction_str(&seg->str, xs)) {
237 anthy_truncate_section(MAX_PREDICTION_ENTRY);
242 learn_unknown(struct segment_list *sl)
245 for (i = 0; i < sl->nr_segments; i++) {
246 struct seg_ent *seg = anthy_get_nth_segment(sl, i);
247 struct cand_ent *ce = seg->cands[seg->committed];
248 if (ce->nr_words == 0) {
249 anthy_add_unknown_word(&seg->str, &ce->str);
255 anthy_do_commit_prediction(xstr *src, xstr *xs)
257 if (anthy_select_section("PREDICTION", 1)) {
260 learn_prediction_str(src, xs);
264 anthy_proc_commit(struct segment_list *sl,
265 struct splitter_context *sc)
267 /* ³Æ¼ï¤Î³Ø½¬¤ò¹Ô¤¦ */
268 learn_swapped_candidates(sl);
269 learn_resized_segment(sc, sl);
270 clear_resized_segment(sc, sl);
271 learn_ochaire(sc, sl);
272 learn_prediction(sl);
274 anthy_learn_cand_history(sl);