中文词频分析
一般而言,英文词汇的处理要比中文处理起来简单,先来分析一片英文文章词汇的频率,看一下词汇分析的基本原理。
原文链接:点我
具体处理流程
- 预处理,删除所有的标点符号,把正片文章转化为一个单词序列;
- 使用字典,统计每一个单词出现的频率;
- 对统计的结果进行由大到小进行排序;
- 输出排序的结果。
英文处理示例
# 文件名: 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)
...还有很多,不全贴出来了
我们可以通过词汇出现的频率大致判断出作者的职业,很有意思吧。也许你已经才出来了,作者其实是学计算机的。