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

一个纯 PHP 的分词

  •  
  •   tanszhe · 2017-12-27 11:54:42 +08:00 · 5823 次点击
    这是一个创建于 2283 天前的主题,其中的信息可能已经有所发展或是发生改变。

    VicWord 一个纯 php 的分词

    (顺便安利一下:本人从帝都回来,打算找个兼职 。如果你们正好缺个前端 或者 php 后端 不妨联系我。微信:dongxi828 )

    star 地址 https://github.com/lizhichao/VicWord

    分词说明

    • 含有 3 种切分方法
      • getWord 长度优先切分 。最快
      • getShortWord 细粒度切分。比最快慢一点点
      • getAutoWord 自动切分 (在相邻词做了递归) 。效果最好
    • 可自定义词典,自己添加词语到词库,词库支持文本格式json和二级制格式igb 二进制格式词典小,加载快
    • dict.igb含有 175662 个词
    • 三种分词结果对比
    $fc = new VicWord('igb');
    $arr = $fc->getWord('北京大学生喝进口红酒,在北京大学生活区喝进口红酒');
    //北京大学|生喝|进口|红酒|,|在|北京大学|生活区|喝|进口|红酒
    //$arr 是一个数组 每个单元的结构[词语,词语位置,词性,这个词语是否包含在词典中] 这里只值列出了词语
    
    $arr =  $fc->getShortWord('北京大学生喝进口红酒,在北京大学生活区喝进口红酒');
    //北京|大学|生喝|进口|红酒|,|在|北京|大学|生活|区喝|进口|红酒
    
    $arr = $fc->getAutoWord('北京大学生喝进口红酒,在北京大学生活区喝进口红酒');
    //北京|大学生|喝|进口|红酒|,|在|北京大学|生活区|喝|进口|红酒
    
    //准确度对比
    //q 的分词和百度的分 http://nlp.qq.com/semantic.cgi#page2 http://ai.baidu.com/tech/nlp/lexical
    
    

    分词速度

    机器阿里云 Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz
    getWord 每秒 140w 字
    getShortWord 每秒 138w 字
    getAutoWord 每秒 40w 字
    测试文本在百度百科拷贝的一段 5000 字的文本

    制作词库

    • 词库支持 utf-8 的任意字符
    • 词典大小不影响 分词速度
      VicDict->add(词语,词性 = null)

    demo

    demo

    39 条回复    2018-06-14 15:35:20 +08:00
    dishuibaby
        1
    dishuibaby  
       2017-12-27 12:44:58 +08:00
    mark 一下
    server
        2
    server  
       2017-12-27 12:57:28 +08:00
    1024,😀
    qianmeng
        3
    qianmeng  
       2017-12-27 13:01:13 +08:00 via Android
    这个很厉害啊
    eseeker
        4
    eseeker  
       2017-12-27 13:03:04 +08:00 via Android
    好东西要赞一个。谢谢分享!
    gdtv
        5
    gdtv  
       2017-12-27 13:12:42 +08:00
    感谢,正好需要
    gdtv
        6
    gdtv  
       2017-12-27 13:15:17 +08:00
    试了一下
    广东省广州市解放路 24 号越秀公园
    结果:
    广东省,广州市,解放,路 24 号越秀,公园

    感谢楼主,正好可以用到我现在的项目里。
    assad
        7
    assad  
       2017-12-27 13:15:36 +08:00 via Android
    赞一个
    gdtv
        8
    gdtv  
       2017-12-27 13:18:33 +08:00
    能否区分词性,例如“的、地、得”是助词,“红酒”是名词
    tanszhe
        9
    tanszhe  
    OP
       2017-12-27 14:11:21 +08:00
    @gdtv 补充在词库就能支持了 目前的词库没有词性
    babytomas
        10
    babytomas  
       2017-12-27 14:14:18 +08:00
    可以配合你这个做本地翻译引擎耶。
    predator
        11
    predator  
       2017-12-27 14:16:42 +08:00
    棒棒哒非常好
    ORZRRR
        12
    ORZRRR  
       2017-12-27 14:17:21 +08:00
    支持下,这玩意核心在词典,希望大家可以开源一起维护完善词典?已经人工给一个星星
    LeungJZ
        13
    LeungJZ  
       2017-12-27 15:05:13 +08:00
    支持支持。已 star。
    kn007
        14
    kn007  
       2017-12-27 15:07:53 +08:00
    nice,支持
    x86
        15
    x86  
       2017-12-27 15:12:59 +08:00
    好东西
    Sornets
        16
    Sornets  
       2017-12-27 15:43:55 +08:00
    厉害了,star+1
    lyz745704689
        17
    lyz745704689  
       2017-12-27 16:20:03 +08:00
    有一个个人项目,目前安卓已经上架,ios 在开发中,不知道楼主有兴趣没有,已经加您微信了
    rebill
        18
    rebill  
       2017-12-27 16:23:51 +08:00
    看来切词的准确性在于词典
    pkm
        19
    pkm  
       2017-12-27 16:37:07 +08:00
    结婚|的|和尚|未结婚的
    pkm
        20
    pkm  
       2017-12-27 16:40:36 +08:00
    楼主棒棒哒,细粒度挺准确的
    aksoft
        21
    aksoft  
       2017-12-27 17:19:19 +08:00
    php 是最好的语言
    imNull
        22
    imNull  
       2017-12-27 19:42:18 +08:00
    fork 了楼主的,简单改了改支持 composer: https://github.com/xu42/VicWord
    tanszhe
        23
    tanszhe  
    OP
       2017-12-27 21:08:17 +08:00
    @imNull 感谢😄,还是把 json 格式保留 方便没有安装 igbinary 的人
    qianmeng
        24
    qianmeng  
       2017-12-27 21:58:47 +08:00 via Android
    刚才试了一下,感觉词库的大小限制了分词效果,看来智能程序的阅读量也很重要啊
    singer
        25
    singer  
       2017-12-27 22:01:28 +08:00 via iPhone
    哇塞,好厉害啊
    heybuddy
        26
    heybuddy  
       2017-12-27 22:03:26 +08:00 via Android
    老兄 666
    mingyun
        27
    mingyun  
       2017-12-27 23:49:48 +08:00
    @imNull 安装提示

    [InvalidArgumentException]
    Could not find a matching version of package xu42/vic-word. Check the packa
    ge spelling, your version constraint and that the package is available in a
    stability which matches your minimum-stability (stable).
    arsom
        28
    arsom  
       2017-12-28 01:13:12 +08:00 via iPhone
    mark
    polymerdg
        29
    polymerdg  
       2017-12-28 08:44:36 +08:00
    mark
    imNull
        30
    imNull  
       2017-12-28 09:15:21 +08:00
    @mingyun 再试试
    imNull
        31
    imNull  
       2017-12-28 09:16:21 +08:00
    @tanszhe 安装个扩展 做一点小小的牺牲也是可以的
    TangMonk
        32
    TangMonk  
       2017-12-28 09:21:54 +08:00 via Android
    每个单独的 http 请求都要重新加载词库吗?
    tanszhe
        33
    tanszhe  
    OP
       2017-12-28 09:27:29 +08:00
    @TangMonk 可这么做 ,这样每次都会浪费加载词库的时间。可以做个服务 每次去调用就好了,这样词库就只加载一次
    TangMonk
        34
    TangMonk  
       2017-12-28 11:17:49 +08:00 via Android
    @tanszhe 用 apcu 来缓存可以吧
    mumu
        35
    mumu  
       2017-12-28 16:52:44 +08:00
    mark
    Outshine
        36
    Outshine  
       2017-12-29 11:09:05 +08:00
    好东西,已 star
    leon1900
        37
    leon1900  
       2017-12-29 19:57:38 +08:00
    wbz93815
        38
    wbz93815  
       2017-12-30 21:31:21 +08:00
    好东西,收藏下。
    artandlol
        39
    artandlol  
       2018-06-14 15:35:20 +08:00
    安装完一直提示故障,composer 和 git 的方式都有问题。

    PHP Fatal error: Uncaught Error: Call to undefined function Lizhichao\Word\igbinary_unserialize() in /data/web/vendor/lizhichao/word/Lib/VicWord.php:31
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3272 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 12:03 · PVG 20:03 · LAX 05:03 · JFK 08:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.