使用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]))

结果如下表所示:

<td>
  个数
</td>
<td>
  21492
</td>
<td>
  11396
</td>
<td>
  7104
</td>
<td>
  3682
</td>
<td>
  2763
</td>

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

停用表

停用表(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) &gt; 0:
            seg_list = jieba.cut(clean_line)
            for seg in seg_list:
                if seg not in stop_words:
                    tokens.append(seg)

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

<td>
  个数
</td>
<td>
  1099
</td>
<td>
  885
</td>
<td>
  827
</td>
<td>
  701
</td>
<td>
  664
</td>

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

《巨婴国》中的父母

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

<td>
  单词
</td>

<td>
  次数
</td>
<td>
  孩子
</td>

<td>
  701
</td>
<td>
  妈妈
</td>

<td>
  664
</td>
<td>
  婴儿
</td>

<td>
  459
</td>
<td>
  父母
</td>

<td>
  438
</td>
<td>
  男人
</td>

<td>
  232
</td>
<td>
  家庭
</td>

<td>
  217
</td>
<td>
  巨婴
</td>

<td>
  205
</td>
<td>
  父亲
</td>

<td>
  186
</td>
<td>
  母亲
</td>

<td>
  158
</td>
<td>
  儿子
</td>

<td>
  137
</td>
<td>
  女儿
</td>

<td>
  127
</td>
<td>
  女人
</td>

<td>
  124
</td>
<td>
  妻子
</td>

<td>
  122
</td>
<td>
  男
</td>

<td>
  101
</td>
<td>
  丈夫
</td>

<td>
  90
</td>

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

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