使用Python进行中文词频统计

目录

最近在看《巨婴国》这本畅销书,先不论书写得怎么样,我就对书中的一个现象很感兴趣:谈论母亲远远多于谈论父亲。 正好可以学学如何使用 Python 进行中文词频统计。

中文分词

统计词频的首要任务就是分词。目前有很多中文分词的Python库,我选用jieba分词。
使用方法极其简单,依次读取对文本文件的每一行并分词。

tokens = []
with open(os.path.join(os.path.dirname(__file__), "JuYingGuo.txt")) as f:
    lines = f.readlines()
    for line in lines:
        clean_line = line.strip()
        if len(clean_line) > 0:
            seg_list = jieba.cut(clean_line)
            tokens.append(seg)

注意需要删除每行末尾的换行符,并过滤掉空行。
分词结果如下图所示:

词频统计

分词得到的是整个文本的单词列表,统计词频需要统计每个词的个数。 Python 标准库 collection 提供的 Counter 类可以很方便地统计个数。

counter = Counter(tokens)

可以使用 most_common 方法直接输出词频最高的5个单词

for a in counter.most_common(5):
    print(a[0] + '\t' + str(a[1]))

结果如下表所示:

单词个数
21492
11396
7104
3682
2763

结果不尽如人意,最高频的竟然是标点符号,第二位的是助词,第五位是人称代词。 我对这类词语不感兴趣,只关心有实际意义的词语。所以需要对分词的结果进行处理。 这就需要使用停用表对结果进行过滤。

停用表

停用表(stop words)就是那些“没有”实际意义的词,在词频统计时可以过滤掉。 有多家机构维护停用词表。 我在下面的 github 链接中找到几份停用词表,包括哈工大、百度、中科院、四川大学等四家机构的停用词表。

https://github.com/LIEWyiyi/JD_spider/tree/master/JD_spider/stopword

分词后,只将那些不在停用词列表里的词加入到 token 中。

tokens = []
stop_words = []
stop_words_file_list = [
    "stop_words/hit_stop_words.txt",
    "stop_words/baidu_stop_words.txt",
    "stop_words/zh_cn_stop_words.txt",
]
for file_path in stop_words_file_list:
    with open(os.path.join(os.path.dirname(__file__), file_path)) as f:
        lines = f.readlines()
        for line in lines:
            stop_words.append(line.strip().decode('utf-8'))
with open(os.path.join(os.path.dirname(__file__), "JuYingGuo.txt")) as f:
    lines = f.readlines()
    for line in lines:
        clean_line = line.strip()
        if len(clean_line) > 0:
            seg_list = jieba.cut(clean_line)
            for seg in seg_list:
                if seg not in stop_words:
                    tokens.append(seg)

这样得到词频最高的5个单词如下:

单词个数
1099
885
827
孩子701
妈妈664

很明显,过滤掉停用词后可以得到更有用的数据。 “妈妈”成功杀入前五,与我阅读时的感觉一致。

《巨婴国》中的父母

列一下《巨婴国》中最高频的百词中与家庭相关的词汇。

排名单词次数
4孩子701
5妈妈664
6婴儿459
10父母438
26男人232
27家庭217
31巨婴205
36父亲186
46母亲158
53儿子137
60女儿127
66女人124
67妻子122
90101
100丈夫90

下图更明显,“妈妈”的词频远高于“男人”和“父亲”。

看来《巨婴国》这本书更适合女性读者了。