Skip to content

基于 OpenCC 项目的繁简转换词典,利用最早最大匹配的分词方式,将词典转换为状态机

License

Notifications You must be signed in to change notification settings

tiansh/opencc-fsm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

基于 OpenCC 项目的繁简转换词典,利用最早最大匹配的分词方式,将词典转换为状态机。单字转换使用词汇表里的第一个结果。

最早最大匹配指,当存在多条规则同时匹配时,优先匹配起始位置最早的,如果起始位置一样,匹配最长的。

初衷

做这个项目是因为我的网页小说阅读器想加一个把文字转换成简化字的功能。找了一圈繁简转换的字典,OpenCC 在版权协议上比较宽松,所以选择了这个字典。但是 OpenCC 本身的实现方式太复杂,而且性能上不尽理想。所以着手了这个项目。这里通过将转换规则事先编译成状态机,可以有效提高运行时的性能,在浏览器中转换 10MB 的小说可以在大约 2 到 3 秒内完成。

状态机

生成的状态机:

  • 状态机是一个数组,0索引
  • 第0个元素是状态机的起始状态
  • 每次输入一个字
    • 如果当前状态的字典有这个字对应的键:
      • 输出对应的文本后跳转到指定的状态
    • 如果这个字不在字典中,且当前不是0状态:
      • 按照空字符串对应的状态输出和跳转,之后重新处理输入的这个字
    • 如果这个字不在字典中,且当前是0状态:
      • 原封不动输出这个字
  • 当转换结束时,如果不在0状态,反复匹配空串对应的状态,直至到达0状态

示例输出的状态机 fsm/*.json 由 dict 目录下对应的 txt 生成。

词典

项目需要预先将水平制表符分割的词典转换成状态机 JSON 才可以使用。转换仅支持一层的词典,对于在繁简转换后再行应用的地区用词词典,或者需要通过修改词典把他们合并到繁简转换的词典中,或者单独构建一套状态机单独执行。

使用

conv 目录下提供了使用产生的状态机的 Python 和 JavaScript 示例代码。

此外任何支持 JSON 的语言都应当可以简单地参考如上的代码实现对应的功能。

About

本项目使用 MIT 协议释出。但请注意附带的转换结果另有其他项目的版权,与本项目无关。

About

基于 OpenCC 项目的繁简转换词典,利用最早最大匹配的分词方式,将词典转换为状态机

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages