Published on

中文词频分析

Authors

一般而言,英文词汇的处理要比中文处理起来简单,先来分析一片英文文章词汇的频率,看一下词汇分析的基本原理。

原文链接:点我

具体处理流程

  1. 预处理,删除所有的标点符号,把正片文章转化为一个单词序列;
  2. 使用字典,统计每一个单词出现的频率;
  3. 对统计的结果进行由大到小进行排序;
  4. 输出排序的结果。

英文处理示例

# 文件名: count_words.py
import re

class CountWord(object):
    def __init__(self, text):
        self.word_string = text
        self.word_list = []
        self.sorted_dict = {}

    def split_word(self, pattern):
        temp_list = re.split(pattern, self.word_string)
        self.trim_word_list(temp_list)

    def trim_word_list(self, word_list):
        for item in word_list:
            if item != '':
                self.word_list.append(item)

    def count_word(self):
        word_dict = {}
        for word in self.word_list:
            if word in word_dict.keys():
                word_dict[word] += 1
            else:
                word_dict[word] = 1
        self.sorted_dict = sorted(word_dict.items(), key=lambda d: d[1], reverse=True)
        return self.sorted_dict

if __name__ == '__main__':
    pattern = r'[;,".!\'\n\s]\s*'
    with open('textfile.txt', 'r') as f:
        data = f.read()
    CW = CountWord(data)
    CW.split_word(pattern)
    CW.count_word()
    for item in CW.sorted_dict:
        print(item)

输出结果:

('the', 20)
('and', 13)
('in', 13)
('that', 10)
('scheduled', 9)
('to', 9)
('with', 9)
('has', 8)
('on', 8)
('for', 8)
('shows', 7)
('law', 7)
('said', 7)
('The', 6)
('Biloxi', 6)
('of', 6)
('stupid', 5)
('is', 5)
('a', 5)
('Rock', 4)
('Carolina', 4)
('people', 4)
('Hard', 4)
('at', 4)
('are', 4)
('North', 4)
('events', 3)
('Mississippi', 3)
('Coliseum', 3)
('not', 3)
('&', 3)
('or', 3)
('Buffett', 3)
('Casino', 3)
('April', 3)
('also', 3)
('from', 3)

...后面还有很长,省略不写了

中文处理

有了热身运动,接下来再来看看中文词频分析。

对中文词频的分析难点在于分词,很难有一个工具可以对中文的词汇进行非常精确的划分。因为有些词不管是结合在一起还是分开都可以表示一个完整的意思。从头开始做一个中文分词工具是非常困难的,我这里采用第三方的中文分析库 jieba,封装了常用的中文分词算法。

选取一片文章进行分析,原文链接:点我

代码示例:

# 文件名 count_ch_word.py
import jieba
from count_words import CountWord

class Count_CH(CountWord):
    def __init__(self, text):
        super().__init__(text)

    def split_word(self):
        iter_t = jieba.cut(self.word_string, cut_all=False)
        self.trim_word_list(iter_t)

    def trim_word_list(self, dict_iter):
        # 忽略一些无意义的符号
        ignore_symbol = (' ', '。', '“', '”', '‘', '’', '?', ':', '!', '\n', ',', '(', ')')
        for item in dict_iter:
            if item not in ignore_symbol:
                self.word_list.append(item)

if __name__ == '__main__':
    with open('chtext.txt', 'r') as f:
        data = f.read()

    CW = Count_CH(data)
    CW.split_word()
    CW.count_word()
    for item in CW.sorted_dict:
        print(item)

分析结果:

('的', 104)
('这些', 19)
('你', 18)
('了', 14)
('我', 13)
('所谓', 11)
('工具', 11)
('软件工程', 11)
('编程', 10)
('用', 10)
('人', 9)
('什么', 9)
('不', 9)
('就', 8)
('是', 8)
('跳蚤', 8)
('东西', 8)
('软件', 8)
('很多', 8)
('方法论', 7)
('也', 7)
('一样', 7)
('做出', 7)
('发现', 7)
('和', 6)
('一些', 6)
('说', 6)
('他们', 6)
('提出', 6)
('公司', 6)
('一个', 6)
('好', 6)
('有', 5)
('都', 5)
('专家', 5)
('把', 5)
('失败', 5)
('在', 5)
('使用', 5)
('没有', 4)
('跟', 4)
('这', 4)
('艺术', 4)
('可以', 4)
('药', 4)
('…', 4)
('呢', 4)
('还', 4)
('做', 4)
('自己', 4)
('上', 4)
('对', 4)
('不好', 4)
('别人', 4)
('很', 4)
('过', 3)
('就是', 3)
('觉得', 3)
('因为', 3)
('能', 3)
('比如', 3)
('教条', 3)
('相机', 3)
('高质量', 3)
('如果', 3)
('被', 3)
('肤浅', 3)
('以为', 3)
('Agile', 3)
('说明书', 3)
('各种', 3)
('得', 3)
('代码', 3)
('Programming', 3)
('方法', 3)
('真正', 3)
('出', 3)
('借口', 3)
('吗', 3)
('它们', 3)
('所以', 3)
('容易', 3)
('好多', 3)
('喜欢', 3)
('当成', 3)
('不会', 3)
('制造', 2)
('之后', 2)
('DRY', 2)
('再', 2)
('撒', 2)
('像', 2)
('领域', 2)
('这是', 2)
('高明', 2)
('照片', 2)
('TDD', 2)
('买', 2)
('知道', 2)
('Design', 2)
('丈夫', 2)
('造成', 2)
('software', 2)
('代替', 2)
('却', 2)
('教育', 2)
('等', 2)
('出来', 2)
('想起', 2)
('咬', 2)
('根本', 2)
('程序员', 2)
('为什么', 2)
('才', 2)
('叫做', 2)
('会', 2)
('可是', 2)
('不用', 2)
('有人', 2)
('床上', 2)
('偏僻', 2)
('作品', 2)
('原则', 2)
('结果', 2)
('整个', 2)
('工程师', 2)
('们', 2)
('照', 2)
('永远', 2)
('最后', 2)
('开发', 2)
('理解', 2)
('程序', 2)
('这个', 2)
('推行', 2)
('者', 2)
('特征', 2)
('行业', 2)
('办法', 2)
('手上', 2)
('久而久之', 2)
('初学', 2)
('大包', 2)
('看看', 2)
('无法', 2)
('Pair', 2)
('有些', 2)
('其实', 2)
('去', 2)
('工程', 2)
('新', 2)
('质量', 2)
('或者', 2)
('摄影师', 2)
('如何', 2)
('减肥药', 2)
('而', 2)
('不是', 2)
('嘴', 2)
('计算', 2)
('没', 2)
('Git', 1)
...还有很多,不全贴出来了

我们可以通过词汇出现的频率大致判断出作者的职业,很有意思吧。也许你已经才出来了,作者其实是学计算机的。