import collections
import re
def contains_chinese(ustr):
"""判斷unicode字符串中是否包含中文
:param ustr:unicode字符串
"""
return any('\u4e00' <= char <= '\u9fff' for char in ustr)
def strip_symbol(ustr):
"""刪除unicode字符串中英文的標點符號
:param ustr:unicode字符串
"""
return re.sub('[’!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~]+',' ',ustr)
def count_word(filename):
"""統計filename文本文件中非中文詞的出現頻率
:param filename:需要統計詞頻的文本文件
"""
# 返回值爲dict,會自動進行計數
word_counter=collections.Counter()
with open(filename,'r',encoding='utf-8') as f:
for line in f:
#過濾中文
if contains_chinese(line):
continue
# 去除英文標點符號
line=strip_symbol(line)
# 全部轉爲小寫
line=line.lower()
word_counter.update([word for word in re.split('\s+',line) if word !=''])
return dict(word_counter)
def get_top(filename,topk=10):
"""獲取出現頻率最高的topk個詞
:param filename:需要統計詞頻的文本文件
:param topk:需要返回的出現頻率最高的前topk個詞,默認爲10個
"""
# 統計filename文本中的詞頻信息,保存到dict中
word_dict=count_word(filename)
# 對word_dict根據出現的詞頻進行降序排序
topk_words=sorted(word_dict.items(),key=lambda x:x[1],reverse=True)
return topk_words[:topk]
if '__main__'==__name__:
import sys
if len(sys.argv)!=3:
print('Usage: {} filename topk'.format(sys.argv[0]),file=sys.stderr)
sys.exit(0)
top_words=get_top(sys.argv[1],int(sys.argv[2]))
for k,v in top_words:
print(k,v)
運行示例:
python 詞頻統計.py 英文文本.txt 50