找回密码
 立即注册
首页 业界区 安全 人人能看懂的智能拼音输入法源码及数据,不到300行C++ ...

人人能看懂的智能拼音输入法源码及数据,不到300行C++

浦乐 2025-11-11 17:00:17
1.png
  1. 全部文件的行数
  2.      720 gb2312.utf8
  3.    16463 hz-py.utf8
  4. 2894733 slm.arpa # 文本文件格式的语言模型
  5.       15 h.h
  6.      125 ime.cpp
  7.      109 pinyin.cpp
  8.       44 seg.cpp
  9.       17 Makefile
  10.       63 mk-bin.py
复制代码
百度网盘下载 .7z 17M〕提取码: 243u
语料:别人的词典
语言模型工具:KenSLM
模型:GB2312汉字的2-gram; 未做prune
存储:SQLite. 严正声明:本人会写二分搜索和用Python排序。 :-) 

  • SQLite生成的数据库111M,如果把索引开全,139M,速度还不快
  • 我在KenSLM 里幻想了一通各种优化
NT何意?No Threshold; Nuclear/No Threat; New Technology,都与我不再有关。
-lsqlite3 -lreadline即可,这两个都是系统默认安装的。
seg *.txt 分字 (把字用空格隔开)。输出到stdout,可 >,可 | 给KenSLM,它抱怨不能mmap,使用慢速 read.
mk-bin.py 把 hz-py.utf8 和 slm.arpa 转成 slm.bin
ime用slm.bin,输入行可编辑(用了readline)。源码摘抄:
  1. int main () {
  2.   for (string s; (s = input()).size(); _slm.predict(s));
  3.   return 0;
  4. }
  5. void SLM::predict (const string& s) {
  6.   _m.resize(0);
  7.   for (const auto& py : break_pystr(s.c_str())) _m.emplace_back(get_column(py));
  8.   if (!_m.size()) return;
  9.   for (const auto& v : _m) if (!v.size()) return;
  10.   viterbi(), print();
  11. }
  12. void SLM::viterbi () 第70~第92行
  13. struct SLM {
  14.   vector<vector<Token>> _m; // matrix (lattice)
  15.   vector<int> _path;
  16.   
  17.   vector<Token> get_column(const string& py);
  18.   double bigram(int x, int y, int y2);
  19.   void viterbi();
  20.   void print();
  21.   void predict(const string& s);
  22. };
  23. struct Token { // 抄全了
  24.   Token (const uint8_t* s) { memcpy(hz, s, 4); } // *(int*)... ARM上字节对齐问题...
  25.   bool operator< (const Token& that) const { return prob > that.prob; }
  26.   char  hz[4]; // UTF-8
  27.   double prob, bop; // 1-gram; backoff probability/penalty
  28.   double max;
  29.   int from;
  30. };
复制代码
如何在Windows下开发输入法:Mini How-to

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册