Add KANAKANCOST

This commit is contained in:
Nishi 2026-06-21 08:00:28 +09:00
commit a6a7858eaf
20 changed files with 58916 additions and 59081 deletions

File diff suppressed because it is too large Load diff

View file

@ -56,6 +56,7 @@
#define AIATTRIBUTE 0xb0
#define KANJIASSYUKU 0xc0
#define LEADINGHANKAKU 0xd0
#define KANAKANCOST 0xe0
#define KANJISTREND 0x00
#define ISASSYUKU 0x80
#define ASSUKUUSE2BYTE 0x90

View file

@ -118,10 +118,7 @@ int seldict(SJ4_CONTEXT TypeDicID);
u_char* get_idxptr(SJ4_CONTEXT TypeDicSeg);
/* functbl.c */
extern VFunc cvtnum_func[];
extern UCPFunc getkan_func[];
extern IFunc setjrec_func[];
extern IFunc hiraknj_func[];
extern VFunc cvtnum_func[];
/* fuzoku.c */
void setclrec(SJ4_CONTEXT JREC*, u_char*, TypeCnct);

View file

@ -405,10 +405,6 @@
#define rigtadr Jrigtadr
#define cvtnum_func Jcvtnum_func
#define getkan_func Jgetkan_func
#define setjrec_func Jsetjrec_func
#define srchg_func Jsrchg_func
#define hiraknj_func Jhiraknj_func
#define fzkadr Jfzkadr

View file

@ -51,6 +51,7 @@ typedef struct jiritu {
u_char stbofs;
u_char count;
u_char numlen;
u_short cost; /* new in SJ4 */
} JREC;
typedef struct bunsetu {

View file

@ -79,12 +79,9 @@
#define Connadr connadr
#define Cvtnum_func cvtnum_func
#define Fzkadr(i) fzkadr[i]
#define Getkan_func getkan_func
#define Hiraknj_func hiraknj_func
#define Kigou kigou
#define Kurai1_tbl kurai1_tbl
#define Kurai2_tbl kurai2_tbl
#define Makekan_func makekan_func
#define Num1tbl num1tbl
#define Num2tbl num2tbl
#define Num3tbl num3tbl
@ -94,9 +91,7 @@
#define Rigtadr(i) rigtadr[i]
#define Scncttbl(i, j) scncttbl[i][j]
#define Selsjadrs(i) selsjadrs[i]
#define Setjrec_func setjrec_func
#define Settou_ptr(i) settou_ptr[i]
#define Srchg_func srchg_func
#define Stbadr(i) stbadr[i]
#define Sttpri(i, j) sttpri[i][j]
#define Suuji_tbl suuji_tbl

View file

@ -50,6 +50,7 @@ int codesize(u_char code) {
case LEADINGHANKAKU:
case OFFSETASSYUKU:
case AIATTRIBUTE:
case KANAKANCOST:
return 2;
default:
return 2;

View file

@ -43,27 +43,3 @@ VFunc cvtnum_func[] = {
(VFunc)num_type04, (VFunc)num_type05, (VFunc)num_type06, (VFunc)num_type07,
(VFunc)num_type08, (VFunc)num_type09, (VFunc)num_type10, (VFunc)num_type11,
(VFunc)num_type12, (VFunc)num_type13, (VFunc)num_type14};
UCPFunc getkan_func[] = {
(UCPFunc)getkan_norm, (UCPFunc)getkan_norm, (UCPFunc)getkan_hira, (UCPFunc)getkan_kata,
(UCPFunc)getkan_knj, (UCPFunc)getkan_ofs, (UCPFunc)getkan_norm, (UCPFunc)getkan_none,
(UCPFunc)getkan_norm, (UCPFunc)getkan_norm, (UCPFunc)getkan_hira, (UCPFunc)getkan_kata,
(UCPFunc)getkan_knj, (UCPFunc)getkan_ofs, (UCPFunc)getkan_norm, (UCPFunc)getkan_none};
IFunc setjrec_func[] = {
(IFunc)setj_norm2, (IFunc)setj_norm2, (IFunc)setj_norm1, (IFunc)setj_norm1,
(IFunc)setj_knj, (IFunc)setj_ofs, (IFunc)setj_norm2, (IFunc)setj_atrb,
(IFunc)setj_norm2, (IFunc)setj_norm2, (IFunc)setj_norm1, (IFunc)setj_norm1,
(IFunc)setj_knj, (IFunc)setj_ofs, (IFunc)setj_norm2, (IFunc)setj_atrb};
IFunc hiraknj_func[] = {
(IFunc)hiraknj_hira, (IFunc)hiraknj_norm, (IFunc)hiraknj_hask, (IFunc)hiraknj_kask,
(IFunc)hiraknj_knj, (IFunc)hiraknj_ofs, (IFunc)hiraknj_norm, (IFunc)hiraknj_atrb,
(IFunc)hiraknj_hira, (IFunc)hiraknj_norm, (IFunc)hiraknj_hask, (IFunc)hiraknj_kask,
(IFunc)hiraknj_knj, (IFunc)hiraknj_ofs, (IFunc)hiraknj_norm, (IFunc)hiraknj_atrb};
UCPFunc makekan_func[] = {
(UCPFunc)makekan_norm, (UCPFunc)makekan_norm, (UCPFunc)makekan_1byte, (UCPFunc)makekan_1byte,
(UCPFunc)makekan_knj, (UCPFunc)makekan_ofs, (UCPFunc)makekan_norm, (UCPFunc)makekan_none,
(UCPFunc)makekan_norm, (UCPFunc)makekan_norm, (UCPFunc)makekan_1byte, (UCPFunc)makekan_1byte,
(UCPFunc)makekan_knj, (UCPFunc)makekan_ofs, (UCPFunc)makekan_norm, (UCPFunc)makekan_none};

View file

@ -151,6 +151,7 @@ code2kanji(SJ4_CONTEXT u_char* s, u_char* d, u_char* ym, int yl, int flg) {
break;
case AIATTRIBUTE:
case KANAKANCOST:
d = getkan_none(s, d, ym, yl, flg);
break;
@ -181,6 +182,7 @@ code2kanji(SJ4_CONTEXT u_char* s, u_char* d, u_char* ym, int yl, int flg) {
break;
case AIATTRIBUTE:
case KANAKANCOST:
d = getkan_none(s, d, ym, yl, FALSE);
break;

View file

@ -60,6 +60,16 @@ set2nd(SJ4_CONTEXT CLREC* clrec) {
return rec2 ? (clrec->cllen + rec2->cllen) : (clrec->cllen);
}
static int cost_penalty(CLREC* clrec) {
int c = clrec->jnode->cost;
if(c < 0xfff / 5 * 1) return 8;
if(c < 0xfff / 5 * 2) return 4;
if(c < 0xfff / 5 * 3) return 2;
if(c < 0xfff / 5 * 4) return 1;
return 0;
};
void mk2claus(SJ4_CONTEXT2) {
u_char* keepptr;
int keeplen;
@ -117,7 +127,7 @@ void mk2claus(SJ4_CONTEXT2) {
if(selcl->cl2len > clrec->cl2len) continue;
prty = priority(SJ4_CONTEXT_PASS clrec) - prty2;
prty = priority(SJ4_CONTEXT_PASS clrec) - prty2 + cost_penalty(clrec);
prty2++;

View file

@ -193,6 +193,7 @@ makekan(SJ4_CONTEXT u_char* s, u_char* d, int flg) {
break;
case AIATTRIBUTE:
case KANAKANCOST:
d = makekan_none(SJ4_CONTEXT_PASS s, d, flg);
break;
@ -223,6 +224,7 @@ makekan(SJ4_CONTEXT u_char* s, u_char* d, int flg) {
break;
case AIATTRIBUTE:
case KANAKANCOST:
d = makekan_none(SJ4_CONTEXT_PASS s, d, FALSE);
break;

View file

@ -79,6 +79,10 @@ int setj_ofs(SJ4_CONTEXT u_char* p) {
contf = FALSE;
break;
case KANAKANCOST:
p += 2;
break;
default:
p += setj_norm2(SJ4_CONTEXT_PASS p);
}
@ -123,6 +127,10 @@ int setj_knj(SJ4_CONTEXT u_char* p) {
contf = FALSE;
break;
case KANAKANCOST:
p += 2;
break;
default:
p += setj_norm2(SJ4_CONTEXT_PASS p);
}
@ -171,6 +179,7 @@ void setjrec(SJ4_CONTEXT u_char* tagp, int mode) {
int plen;
int nlen;
int len;
int cost = 0;
plen = getplen(tagp);
nlen = getnlen(tagp);
@ -214,6 +223,11 @@ void setjrec(SJ4_CONTEXT u_char* tagp, int mode) {
tmp++;
break;
case KANAKANCOST:
cost = ((*tmp & 0xf) << 8) | *(tmp + 1);
tmp += 2;
break;
default:
tmp += setj_norm2(SJ4_CONTEXT_PASS tmp);
}
@ -232,6 +246,7 @@ void setjrec(SJ4_CONTEXT u_char* tagp, int mode) {
rec->dicid = curdict->dicid;
rec->hinsi = gram;
rec->sttofs = headcode;
rec->cost = cost;
}
}
@ -282,6 +297,10 @@ void setnumrec(SJ4_CONTEXT u_char* tagp, JREC* rec, TypeGram gram) {
tmp++;
break;
case KANAKANCOST:
tmp += 2;
break;
default:
tmp += setj_norm2(SJ4_CONTEXT_PASS tmp);
}

View file

@ -186,6 +186,11 @@ hiraknj(SJ4_CONTEXT u_char* p) {
result = hiraknj_knj(SJ4_CONTEXT_PASS p, &i);
break;
case KANAKANCOST:
result = 0;
i = 2;
break;
default:
result = hiraknj_hira(SJ4_CONTEXT_PASS p, &i);
}

View file

@ -62,6 +62,18 @@ int u_strcmp(u_char* a, u_char* b) {
int cnvhinsi(u_char* buf) {
int i;
if(buf[0] == 'C') {
int n = atoi(buf + 1);
if(n < 0) n = 0;
if(n > 0xffff) n = 0xffff;
n = n * 0xfff / 0xffff;
return -(KANAKANCOST_BIT | n);
}
#if 1
for(i = 0; i <= GramMax; i++) {
if(u_strcmp(buf, (u_char*)gramtbl[i].name) == 0) return gramtbl[i].code;

View file

@ -107,10 +107,17 @@ makekanji(int* yomi, int* kanji, int* atr, int* len) {
while(*atr) {
i = *atr;
atr++;
if(i & KANAKANCOST_BIT) {
i &= ~KANAKANCOST_BIT;
ktmp[pos++] = (KANAKANCOST | ((i >> 8) & 0xff));
ktmp[pos++] = (i & 0xff);
} else {
#ifndef NO_ATR
ktmp[pos++] = (AIATTRIBUTE | ((i >> 8) & 0xff));
ktmp[pos++] = (i & 0xff);
ktmp[pos++] = (AIATTRIBUTE | ((i >> 8) & 0xff));
ktmp[pos++] = (i & 0xff);
#endif
}
}
if((i = top_strcmp(yomi, kanji))) {

View file

@ -215,7 +215,8 @@ retry:
if(hinsi[0] == '[' && hinsi[i - 1] == ']') {
hinsi[i - 1] = 0;
i = cnvhinsi(hinsi + 1);
i = cnvhinsi(hinsi + 1);
if(i > 0) {
fprintf(stderr,
#ifdef ENGLISH

View file

@ -69,6 +69,7 @@
#define AIATTRIBUTE 0xb0
#define KANJIASSYUKU 0xc0
#define LEADINGHANKAKU 0xd0
#define KANAKANCOST 0xe0
#define KANJISTREND 0x00
#define ISASSYUKU 0x80
#define ASSUKUUSE2BYTE 0x90
@ -168,4 +169,6 @@
#define HINSIREC 7
#define DOUONREC 8
#define KANAKANCOST_BIT (1 << 24)
#endif

View file

@ -1,6 +1,10 @@
#!/usr/bin/env python3
# THIS IS FOR SYSTEM DICTIONARY GENERATION!!!!!
import sys
import re
from math import *
from collections import defaultdict
HINSHI = {
@ -118,6 +122,9 @@ for lineno, line in enumerate(fp, 1):
if h in SKIP:
continue
if re.findall(r'[^あ-んー]', y):
continue
sj = HINSHI[h]
if sj is None:
@ -136,8 +143,13 @@ fp.close()
grouped = defaultdict(list)
maxf = 0
for (y, k, sj), freq in entries.items():
grouped[y].append((freq, k, sj))
if maxf < freq:
maxf = freq
grouped[y].append((freq, k, sj, freq))
fp = open(outp, "w", encoding="utf-8")
for y in sorted(grouped.keys()):
@ -147,7 +159,8 @@ for y in sorted(grouped.keys()):
t = "\t" * (4 - (len(y) // 4))
for freq, k, sj in lst:
for freq, k, sj, freq in lst:
t2 = "\t" * (4 - (len(k) // 4))
fp.write(f"{y}{t}{k}{t2}{sj}:\n")
freq = floor(freq / maxf * 0xffff)
fp.write(f"{y}{t}{k}{t2}{sj}:[C{freq}]:\n")
fp.close()