字的bi-gram是个馊主意么?

续之前的贴子,我们有了部精修词典,二至六字词共169872个。

foreach 词,用字的2-gram去检查首选是否正确,结果很差,可在〔这里〕下载

123094个不一样的。部分结果:

䴔䴖 交警
𫘝𫘨 抉剔
吖嗪 阿嗪
腌菜 言采
腌肉 眼肉
折光度 遮光度
折斤斗 辄筋斗
折腰步 这么不
折子书 折子数
折子戏 着自西
坐言起行 坐厌其形
坐以待毙 做一代币
坐拥书城 作用书城
座无虚席 坐无须喜
爆炒鹅卵石 饱巢蛾卵石
杯酒释兵权 备就是冰泉
北赤道海流 背驰道还留
北京直立人 北京治理人
唯恐天下不乱 惟恐天下不乱
维也纳华尔兹 畏耶纳花儿子
中性日照植物 中兴日照植物
做一行怨一行 做一星愿意行

但是,这不说明如果我作个输入法就不好用。因为我会带苗条利落的词库。

做一行怨一行 zuo'yi'xing'yuan'yi'xing 这样的其实不多,我没事时慢慢手工改,能改得过来。

用这个程序处理了下词典

import re
ptn = re.compile(r'(ch|sh|zh|b|c|d|f|g|h|j|k|l|m|n|p|q|r|s|t|w|x|y|z)')
d = {}
for s in open('sysdic.utf8'):
  f = s.split()
  hz = f[0]; jianpin = []
  for py in f[1].split("'"):
    m = re.match(ptn, py)
    if m == None: shengmu = '0'
    else: shengmu = py[:min(m.span()[1], 1)]
    jianpin.append(shengmu)
  d.setdefault(''.join(jianpin), []).append(hz)
max = 0
for k,v in d.items():
  n = len(v)
  if n > max: max = n; print(k, v)
print('\n', max)
View Code

最多的是yy,817个,如...'郧阳', '陨越', '孕婴', '孕育', '蕴意', '蕴育', '韵语']。第二多的是jj :-)

So,启动时造unordered_map,key是yy这样的简拼(已考虑z-zh...这样的模糊音),

然后顺序匹配。 韵母全变大写以免ng与声母冲突,<regex>(C++11标准库)正则表达式匹配。

等我做好时,电脑更快了。而且我可以查到99个就停止。用户可以输全拼。 

  • 讲普通话是每个公民应尽的义务
  • 电梯口有个年龄和我差不多一样大的,整天捧着个手机刷视频。编程使我快乐
  • 一高兴买了个AOC的显示器,24.5" 1080p 389元,字大还不用老转头

不试验编译12万行程序了。

unordered_map<string, int> map = { {"Alice", 25}, {"Bob", 30} };

SQLite, gcc和regex都很利害,但都不是神,我可能还是得买新电脑。

这个快:

 while (fgets(s, sizeof(s), f)) {
    static const char S[] = " \n";
    char* hz = strtok(s, S); assert(hz);
    char* quanpin = strtok(0, S); assert(quanpin);
    char* jianpin = strtok(0, S); assert(jianpin);
    auto p = _sd.insert({jianpin, vector<HZnQP>()});
    p.first->second.emplace_back(HZnQP{hz, quanpin});
  }
  auto what = _sd["yy"];
  for (const auto& hznqp : what)
    printf("%s %s\n", hznqp.hz.c_str(), hznqp.qp.c_str());
  printf("%d\n", what.size());
View Code

[SysDic] 98960 entries loaded in 0.082s.

const vector<wstring> e; const vector<hz_qp> e2; 常量表达式外提等优化到0.07秒。

鄙人的华容道真快。

posted @ 2025-11-14 14:42  华容道专家  阅读(3)  评论(0)    收藏  举报