V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
954880786
V2EX  ›  分享创造

使用 cpython 和 swig 重写了原作者计算 DAG 和 HMM 中的 vitrebi 函数,速度得到大幅提升。

  •  3
     
  •   954880786 ·
    deepcs233 · 2017-12-20 23:27:03 +08:00 · 2836 次点击
    这是一个创建于 2528 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 cpythonswig重写了原作者计算 DAG 和 HMM 中的 vitrebi 函数,速度得到大幅提升。

    特点

    • 对两种分词模式进行的加速:精确模式,搜索引擎模式
    • 利用cpython重新实现了 viterbi 算法,使默认带 HMM 的切词模式速度提升 60%左右
    • 利用cpython重新实现了生成 DAG 以及从 DAG 计算最优路径的算法,速度提升 50%左右
    • 基本只是替换了核心函数,对源代码的侵入型修改很少
    • 使用import jieba_fast as jieba 可以无缝衔接原代码。

    安装说明

    代码目前对 Python 2/3 兼容,对*unix 兼容良好,对 windows 不能保证

    性能测试

    测试机器 mbp17,i7,16G

    测试过程: 先按行读取文本《围城》到一个数组里,然后循环对《围城》每行文字作为一个句子进行分词。然后循环对围城这本书分词 50 次。分词算法分别采用 [开启 HMM 的精确模式] 、 [关闭 HMM 的精确模式] 、 [开启 HMM 的搜索引擎模式] 、 [开启 HMM 的搜索引擎模式] 具体测试数据如下:

    5a3a7ef7e4500.png

    可以看出在开启 HMM 模式下时间缩减了 60%左右,关闭 HMM 时时间缩减了 50%左右。

    一致性测试

    为了保证 jieba_fast 和 jieba 分词结果相同,做了如下测试。

    对《围城》,《红楼梦》分词结果进行比较,其分词结果完全一致

    ---- Test of 围城 ----
    nums of jieba      results:  164821
    nums of jieba_fast results:  164821
    Are they exactly the same?  True
    ----Test of 红楼梦 ----
    nums of jieba      results:  597151
    nums of jieba_fast results:  597151
    Are they exactly the same?  True
    

    鸣谢

    "结巴"中文分词原作者: SunJunyi

    github: https://github.com/deepcs233/jieba_fast (求 star 哈哈哈😄) 源代码在 source/ 下

    6 条回复    2017-12-21 18:52:15 +08:00
    Kisesy
        1
    Kisesy  
       2017-12-20 23:48:25 +08:00
    使用 cpython? 应该是用 cython 吧
    ligyxy
        2
    ligyxy  
       2017-12-20 23:49:06 +08:00 via Android
    954880786
        3
    954880786  
    OP
       2017-12-20 23:52:48 +08:00
    @Kisesy 对的,查了一下是 cython。。之前一直理解错了
    Arnie97
        4
    Arnie97  
       2017-12-21 09:54:00 +08:00 via Android   ❤️ 1
    赞!

    提几点代码之外的小建议:

    1. @Kisesy 他并未用到 Cython,只有普通的 Python ( CPython )代码和 SWIG 代码 。
    话说如果真的同时用 Cython 和 SWIG 会很奇怪吧,两种技术的定位大致相同。

    2. 建议不要在 GitHub 上提交__pycache__ ,*.pyc ,build 和 dist 这些自动生成的产物;尤其是,不要把自己的密码贴出来😂
    原来的 jieba 项目里就有.gitignore,不知道你为什么删掉。

    3. 建议 fork 原项目代码进行修改。
    现在难以辨别哪些是你的改动,哪些是原有的代码,不利于发现第 2 条所说的那些问题,也不利于合并上游的更新。

    4. 本地 Git 的邮箱配置和 GitHub 不一致,建议统一。

    5. 帖子标题里没提到 jieba,直接说“原作者”,看到最后才懂你在说什么😂链接也是最后才给。
    954880786
        5
    954880786  
    OP
       2017-12-21 14:29:00 +08:00
    @Arnie97 谢谢您的建议😂,我是一次做这种开源性质的项目,很多都不太了解。学习到了很多,谢谢大佬的指点。
    哈哈文章说的不够清楚我的锅我的锅。
    hahaha233
        6
    hahaha233  
       2017-12-21 18:52:15 +08:00
    赞!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2803 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:57 · PVG 20:57 · LAX 04:57 · JFK 07:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.