• 基于开源中文分词工具pkuseg-python,我用张小龙的3万字演讲做了测试


    做过搜索的同学都知道,分词的好坏直接决定了搜索的质量,在英文中分词比中文要简单,因为英文是一个个单词通过空格来划分每个词的,而中文都一个个句子,单独一个汉字没有任何意义,必须联系前后文字才能正确表达它的意思。

    因此,中文分词技术一直是nlp领域中的一大挑战。Python 中有个比较著名的分词库是结巴分词,从易用性来说对用户是非常友好的,但是准确度不怎么好。这几天发现另外一个库,pkuseg-python,看起来应该是北大的某个学生团队弄出来的,因为这方面没看到过多的介绍,pkuseg-python 的亮点是领域细分的中文分词工具,简单易用,跟现有开源工具相比提高了分词的准确率。

    于是我想起用张小龙的3万字演讲做下测试,前几天在朋友圈流传了一张图,采铜统计出张小龙演讲中各个词出现的频率,不知他是怎么统计的,不过作为技术人,我们用更专业的工具来试试会是什么效果。

    fjqV-hrpcmqv3996433.jpg

    安装 pkuseg

    pip3 install pkuseg
    

    第一步是将演讲内容下载下来,保存到一个txt文件中,然后将内容加载到内存

    content = []
    with open("yanjiang.txt", encoding="utf-8") as f:
        content = f.read()
    

    我统计了一下,文字总数是32546个。

    接下来我们用pkuseg对内容进行分词处理,并统计出现频率最高的前20个词语是哪些。

    import pkuseg
    from collections import Counter
    import pprint
    
    content = []
    with open("yanjiang.txt", encoding="utf-8") as f:
        content = f.read()
    
    seg = pkuseg.pkuseg()
    text = seg.cut(content)
    counter = Counter(text)
    pprint.pprint(counter.most_common(20))
    

    输出结果:

    [(',', 1445),
     ('的', 1378),
     ('。', 755),
     ('是', 707),
     ('一', 706),
     ('个', 591),
     ('我', 337),
     ('我们', 335),
     ('不', 279),
     ('你', 231),
     ('在', 230),
     ('会', 220),
     ('了', 214),
     ('有', 197),
     ('人', 190),
     ('就', 178),
     ('这', 172),
     ('它', 170),
     ('微信', 163),
     ('做', 149)]
    

    什么鬼,这都是些啥玩意,别急,其实啊,分词领域还有一个概念叫做停用词,所谓停用词就是在语境中没有具体含义的文字,例如这个、那个,你我他,的得地,以及标点符合等等。因为没人在搜索的时候去用这些没意义的停用词搜索,为了使得分词效果更好,我们就要把这些停用词过去掉,我们去网上找个停用词库。

    第二版代码:

    import pkuseg
    from collections import Counter
    import pprint
    
    content = []
    with open("yanjiang.txt", encoding="utf-8") as f:
        content = f.read()
    
    seg = pkuseg.pkuseg()
    text = seg.cut(content)
    
    
    stopwords = []
    
    with open("stopword.txt", encoding="utf-8") as f:
        stopwords = f.read()
    
    new_text = []
    
    for w in text:
        if w not in stopwords:
            new_text.append(w)
    
    
    counter = Counter(new_text)
    pprint.pprint(counter.most_common(20))
    

    打印的结果:

    [('微信', 163),
     ('用户', 112),
     ('产品', 89),
     ('朋友', 81),
     ('工具', 56),
     ('程序', 55),
     ('社交', 55),
     ('圈', 47),
     ('视频', 40),
     ('希望', 39),
     ('时间', 39),
     ('游戏', 36),
     ('阅读', 33),
     ('内容', 32),
     ('平台', 31),
     ('文章', 30),
     ('信息', 29),
     ('团队', 27),
     ('AI', 27),
     ('APP', 26)]
    

    看起来比第一次好多了,因为停用词都过滤掉了,跟采铜那张图片有点像了,不过他挑出来的词可能是从另外一个维度来的,毕竟人家是搞心理学的。但是我们选出来的前20个高频词还是不准确,有些不应该分词的也被拆分了,例如朋友圈,公众号,小程序等词,我们认为这是一个整体。

    对于这些专有名词,我们只需要指定一个用户词典, 分词时用户词典中的词固定不分开,重新进行分词。

    lexicon = ['小程序', '朋友圈', '公众号']  #
    seg = pkuseg.pkuseg(user_dict=lexicon)  # 加载模型,给定用户词典
    text = seg.cut(content)
    

    最后的出来的结果前50个高频词是这样的

    163 微信
    112 用户
    89 产品
    72 朋友圈
    56 工具
    55 社交
    53 小程序
    40 视频
    39 希望
    39 时间
    36 游戏
    33 阅读
    32 内容
    31 朋友
    31 平台
    30 文章
    29 信息
    27 团队
    27 AI
    26 APP
    25 公众号
    25 服务
    24 好友
    22 照片
    21 时代
    21 记录
    20 手机
    20 推荐
    20 企业
    19 原动力
    18 功能
    18 真实
    18 生活
    17 流量
    16 电脑
    15 空间
    15 发现
    15 创意
    15 体现
    15 公司
    15 价值
    14 版本
    14 分享
    14 未来
    13 互联网
    13 发布
    13 能力
    13 讨论
    13 动态
    12 设计
    

    张小龙讲得最多的词就是用户、朋友、原动力、价值、分享、创意、发现等这些词,这些词正是互联网的精神,如果我们把这些做成词云的话,可能效果会更好

    微信截图_20190114155825.png

    代码传送门:https://github.com/lzjun567/crawler_html2pdf/tree/master/fencitongji

  • 相关阅读:
    Kali-linux物理访问攻击
    Kali-linux使用NVIDIA计算机统一设备架构(CUDA)
    Kali-linux创建密码字典
    Kali-linux破解操作系统用户密码
    Kali-linux破解纯文本密码工具mimikatz
    Kali-linux绕过Utilman登录
    POJ
    LightOJ
    UVa
    Hdu
  • 原文地址:https://www.cnblogs.com/zhijun/p/10270504.html
Copyright © 2020-2023  润新知