zoukankan      html  css  js  c++  java
  • Python如何进行词频统计?3种方法教给你

    前言

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

    以下文章来源于快学Python ,作者小小明

    Python爬虫、数据分析、网站开发等案例教程视频免费在线观看

    https://space.bilibili.com/523606542

    Python如何进行词频统计?3种方法教给你

     

    数据准备

    import jieba
    
    with open("D:/hdfs/novels/天龙八部.txt", encoding="gb18030") as f:
        text = f.read()
    with open('D:/hdfs/novels/names.txt', encoding="utf-8") as f:
        for line in f:
            if line.startswith("天龙八部"):
                names = next(f).split()
                break
    
    for word in names:
        jieba.add_word(word)
    
    #  加载停用词
    with open("stoplist.txt", encoding="utf-8-sig") as f:
        stop_words = f.read().split()
    stop_words.extend(['天龙八部', '
    ', 'u3000', '目录', '一声', '之中', '只见'])
    stop_words = set(stop_words)
    all_words = [word for word in cut_word if len(word) > 1 and word not in stop_words]
    print(len(all_words), all_words[:20])

    结果:

    216435 ['天龙', '释名', '青衫', '磊落', '险峰', '行玉壁', '月华', '明马', '疾香', '幽崖', '高远', '微步', '生家', '子弟', '家院', '计悔情', '虎啸', '龙吟', '换巢', '鸾凤']

    统计词频排名前N的词

    原始字典自写代码统计:

    wordcount = {}
    for word in all_words:
        wordcount[word] = wordcount.get(word, 0)+1
    sorted(wordcount.items(), key=lambda x: x[1], reverse=True)[:10]

    结果:

    Python如何进行词频统计?3种方法教给你

     

    使用计数类进行词频统计:

    from collections import Counter
    
    wordcount = Counter(all_words)
    wordcount.most_common(10)

    结果:

    Python如何进行词频统计?3种方法教给你

     

    使用pandas进行词频统计:

    pd.Series(all_words).value_counts().head(10)

    结果:

    Python如何进行词频统计?3种方法教给你

     

    从上面的结果可以看到使用collections的Counter类来计数会更快一点,而且编码也最简单。

    分词过程中直接统计词频

    Pandas只能对已经分好的词统计词频,所以这里不再演示。上面的测试表示,Counter直接对列表进行计数比pyhton原生带快,但循环中的表现还未知,下面再继续测试一下。

    首先使用原生API直接统计词频并排序:

    %%time
    wordcount = {}
    for word in jieba.cut(text):
        if len(word) > 1 and word not in stop_words:
            wordcount[word] = wordcount.get(word, 0)+1
    print(sorted(wordcount.items(), key=lambda x: x[1], reverse=True)[:10])

    结果:

    [('段誉', 2496), ('说道', 2151), ('虚竹', 1633), ('萧峰', 1301), ('武功', 1095), ('阿紫', 922), ('阿朱', 904), ('乔峰', 900), ('王语嫣', 877), ('慕容复', 871)]
    Wall time: 6.04 s

     

    下面我们使用Counter统计词频并排序:

    %%time
    wordcount = Counter()
    for word in jieba.cut(text):
        if len(word) > 1 and word not in stop_words:
            wordcount[word] += 1
    print(wordcount.most_common(10))

    结果:

    [('段誉', 2496), ('说道', 2151), ('虚竹', 1633), ('萧峰', 1301), ('武功', 1095), ('阿紫', 922), ('阿朱', 904), ('乔峰', 900), ('王语嫣', 877), ('慕容复', 871)]
    Wall time: 6.21 s

     

    可以看到Counter在循环中计数时反而慢了一丁点,但由于Counter类整体性能更佳,编写起来简单,所以一般都用Counter进行统计计数。

     
  • 相关阅读:
    ERP/MIS开发 30道ORM问题与解答 LLBL Gen 3.x Adapter
    升级LLBL Gen 2.x项目到3.x
    软件公司为什么要加密源代码,而且是前前后后,反反复复
    ERP/MIS系统中集成命令行式的功能调用
    工作多年后才明白的.NET底层开发技术
    OSGI:从面向接口编程来理解OSGI
    幸福框架:如何阅读幸福框架的代码
    OSGI:C#如何实现简单的OSGI
    技术人生:技术之路,需要的是热情和梦想
    EHR:对人力资源信息系统的认识
  • 原文地址:https://www.cnblogs.com/hhh188764/p/14277112.html
Copyright © 2011-2022 走看看