跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • 浅色
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • 深色
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠

清风输入法社区

  1. 主页
  2. 功能建议
  3. 【实验性需求】英文词组的分词快速输入设想方案

【实验性需求】英文词组的分词快速输入设想方案

已定时 已固定 已锁定 已移动 功能建议
4 帖子 2 发布者 0 浏览 1 关注中
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • T
    T
    太阳雨
    编写于 最后由 编辑
    #1

    背景

    最近在修订英文词库,发现有很多词组有如下特点:

    • 类型1: 单词多,总长非常长, 如:automatic water quality monitor(自动水质监测仪)
    • 类型2: 单词不多,但单词很长, 如:environmental degradation(环境退化)
    • 类型3: 普通型,总长正常,单词正常, 如: a lot of, good idea

    当前编码方案

    • 方案1(姑且叫“首字母编码”): 各单词首字母拼接, 缺点,用户需要记得每个单词,并提取首字母,重码率高,打了第1个单词的首字母,但是不记得第2个单词是什么,想浏览候选列表,几乎是不现实的,所以这种编码方案放弃了!
    • 方案2(姑且叫“首全从简编码”): 第1个单词使用全编码,后面的单词使用首字母拼接,优点:可能通过打全第1个单词,缩小候选列表的范围,并且打第2个单词的首字母后,将极大缩小候选范围,对类型1、类型3将是非常有效的编码方式, 但是有如下缺点:
      • 对于类型2的词组, 要打完第1个完整的单词,将是非常痛苦的事,明明智能提示已经把单词放到候选1了,却不能空格上屏,需要完全手工打完,再打第2个单词的触发字母。

    注:使用“首全从简编码”,解决了一大部分的词组用户输入方便性的问题,但效率仍然捉襟见肘。

    新“分词编码”方案设想

    • 单词不需要打全, 只需要打单词1的一部分前缀,再接分词符号“‘”,接着输入单词2的部分前缀....单词3前缀...,这样可以极大的减少输入负担。如:envi'deg,即可精确命中environmental degradation
    • 兼容“首字母编码”,使用首字母加分词符,即可退化到单词“首字母编码”, 如:a'l'o 精确命中a lot of

    约束

    • “分词编码”无法在词库里进行固定形式的编码,词库只能默认内置“首全从简编码”(个人优选)
    • 需要输入法内置代码逻辑,实现英文词组的“分词编码”功能, 用户使用分词方式时,需要清风按单词前缀进行分词匹配,而使用“首全从简编码”时,按现有的匹配方式。
    1 条回复 最后回复
    0
    • T
      T
      太阳雨
      编写于 最后由 编辑
      #2

      英文分词编码算法看看能不能申请专利:)

      1 条回复 最后回复
      0
      • 幻枫A
        幻枫A
        幻枫
        编写于 最后由 编辑
        #3

        这个算法看起来难度不大,但问题是如果直接使用遍历的方式,性能比较差。

        当前拼音之类的词库是做了索引的,所以才能在海量词库数据里快速的找到需要的词。

        而英文的话,索引的方式肯定不太一样。后面有空会研究一下。

        1 条回复 最后回复
        0
        • T
          T
          太阳雨
          编写于 最后由 编辑
          #4

          1 关于英文词组分词查询算法的设计思路

          注:仅做为思路参考。

          1.1 词库加载

          1.1.1 现有部分不变

          • 继续加载词库码表及相应的创建索引
          • 不区分单词还是词组,词组的编码为由词库内置

          1.1.2 增加词组的额外处理

          • 当发现加载的词条包含空格时,认定为词组,做特殊处理。
          • 新设计一张tbl_phrases表,字段为:word,p1,p2,...p10, 共11个字段,word是词组原文,p1为word以空格分割后的第1个单词,p2为第2个...依次类推,词组只需要最多拆分到10个单词就够了,有些太长的有点扯。
          • tbl_phrases表的各字段都要建立索引,注:很多词条可能后面的p3 - p10都是空的。
          • 将拆分后的词组存入tbl_phrases表中,如果词组只有2个单词,则p3到p10字段填充空值。
          • 词组数量并不会太多,经筛选,40W的词库里面,大概有2W条词组。
          • 表结构示意:

          1.2 单词输入时的查询

          1.2.1 按分词方式查询词组

          • 当用户输入的内容不包含分词符号时,按原逻辑进行筛选,只查询主表
          • 当用户输入内容包含分词时,切换到查询词组表tbl_phrases
          • 查询行为,以SQLite数据库为例(已导入2W词组), 查询目标词组为:two heads are better than one
          • 输入分词方式:two'he'a'be, 甚至不用输完,转成内部查询语句为:
          SELECT word
          FROM tbl_phrases
          WHERE p1 LIKE 'two%' 
            AND p2 LIKE 'he%' 
            AND p3 LIKE 'a%' 
            AND p4 LIKE 'be%';
          

          注:这个查询操作即可命中词组,本机耗时约0.002秒。

          • 哪怕按极端的,只输入第1个分词字母时,性能也很快:
          SELECT word
          FROM tbl_phrases
          WHERE p1 LIKE 't%'; 
          

          注:这个查询操作本机耗时也只约0.002秒。

          1.3 后记

          • 以上只是基于SQLite数据库的一些操作参考,清风输入法如果使用的内存库,则性能会更加优异。
          1 条回复 最后回复
          0

          你好!看起来您对这段对话很感兴趣,但您还没有一个账号。

          厌倦了每次访问都刷到同样的帖子?您注册账号后,您每次返回时都能精准定位到您上次浏览的位置,并可选择接收新回复通知(通过邮件或推送通知)。您还能收藏书签、为帖子顶,向社区成员表达您的欣赏。

          有了你的建议,这篇帖子会更精彩哦 💗

          注册 登录
          回复
          • 在新帖中回复
          登录后回复
          • 从旧到新
          • 从新到旧
          • 最多赞同


          • 登录

          • 没有帐号? 注册

          • 登录或注册以进行搜索。
          Powered by NodeBB Contributors
          • 第一个帖子
            最后一个帖子
          0
          • 版块
          • 最新
          • 标签
          • 热门
          • 用户
          • 群组