前言
词频统计是指在文本或语音数据中,统计每个单词或符号出现的次数,以便对文本或语音数据进行分析和预处理。词频统计是自然语言处理中的一个重要任务,其目的是为后续的文本分析、情感分析、机器翻译等任务做好准备。
文本词频统计(英文字符)
1、普通版
importredefparse(text):# 使用正则表达式去除标点符号和换行符text=re.sub(r'[^\w ]',' ',text)# 转为小写text=text.lower()# 生成所有单词的列表word_list=text.split(' ')# 去除空白单词,并转换为列表返回word_list=list(filter(None,word_list))returnword_list# 测试一下sample_text="Hello, World! \nThis is a test-text. Are you ready?"print(parse(sample_text))结果如下:
['hello','world','this','is','a','test_text','are','you','ready']2.改良版
importredefparse_optimized(text):# 去除标点符号(替换为空格)text=re.sub(r'[^\w ]',' ',text)# 转为小写,并直接使用 split() 自动处理连续空格returntext.lower().split()# 测试sample_text="Hello, World! \nThis is a test-text. Are you ready?"print(parse_optimized(sample_text))python中的split函数,如果不传任何参数(即直接写split()),它会自动按所有空白字符(空格,换行符\n,制表符\t)进行过分割,并且自动去除空字符。
文本词频统计(中文字符)
与英文字符不同,中文的字符之间是没有空格的,所以需引入jieba(结巴分词)进行词频统计。
1.普通版
importreimportjiebafromcollectionsimportCounterdefget_chinese_word_freq(text,top_n=10):# 1. 数据清洗:去除标点符号、数字和英文字母(只保留中文字符)# 如果你想保留英文,可以把正则改成 r'[^\w\u4e00-\u9fa5]'cleaned_text=re.sub(r'[^\u4e00-\u9fa5]','',text)# 2. 中文分词:使用 jieba 的 lcut 方法直接返回列表word_list=jieba.lcut(cleaned_text)# 3. 过滤无意义的词(可选,但强烈建议)# 在实际项目中,通常会读取一个“停用词表”(stop words)文件,这里做简单演示stop_words={"的","了","和","是","就","都","而","及","与","着","或"}filtered_words=[]forwordinword_list:# 过滤掉停用词,并且通常过滤掉长度为 1 的单字(比如“我”、“你”、“啊”)ifwordnotinstop_wordsandlen(word)>=2:filtered_words.append(word)# 4. 统计词频:使用 Counterword_counts=Counter(filtered_words)# 5. 返回出现频率最高的 top_n 个词returnword_counts.most_common(top_n)# ================= 测试一下 =================sample_text=""" 自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。 它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。 自然语言处理是一门融语言学、计算机科学、数学于一体的科学。 因此,这一领域的研究将涉及自然语言,即人们日常使用的语言, 所以它与语言学的研究有着密切的联系。 """# 获取词频最高的 5 个词top_words=get_chinese_word_freq(sample_text,top_n=5)print("中文词频统计结果:")forword,freqintop_words:print(f"词语: '{word}' => 出现次数:{freq}")结果如下:
中文词频统计结果: 词语:'自然语言'=> 出现次数: 4 词语:'领域'=> 出现次数: 3 词语:'研究'=> 出现次数: 3 词语:'处理'=> 出现次数: 2 词语:'计算机科学'=> 出现次数: 2jieba.lcut(text):这是结巴分词的核心方法,它会基于内置的强大中文库,利用统计算法(HMM模型),把一段连续的中文切分成一个词语列表。
\u4e00-\u9fa5 是汉字在 Unicode 编码中的范围。这个正则的意思是“把所有不是汉字的字符全部替换为空”
len(word) >= 2:中文里很多单字(如“的、地、得、我、你、他”)通常对分析文章核心内容帮助不大,所以统计词频时经常会把长度小于 2 的词过滤掉。
Counter:Python 内置的计数神器,把它套在列表外面,它会自动帮你统计每个元素出现的次数,并提供 most_common() 方法直接排序输出。
2.改良版,与普通版相比,改进的一点是可以加载自定义词典和停用词库
importreimportjiebaimportosfromcollectionsimportCounterdefchinese_word_cut(mytext,top_n=10):dict_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),'自定义词典.txt')jieba.load_userdict(dict_path)# 这里你可以添加jieba库识别不了的网络新词,避免将一些新词拆开jieba.initialize()# 初始化jieba# 文本预处理 :去除一些无用的字符只提取出中文出来new_data=re.findall('[\u4e00-\u9fa5]+',mytext)new_data=" ".join(new_data)# 文本分词seg_list_exact=jieba.lcut(new_data)result_list=[]stop_words_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),'停用词库.txt')# 读取停用词库withopen(stop_words_path,encoding='utf-8')asf:# 可根据需要打开停用词库,然后加上不想显示的词语con=f.readlines()stop_words=set()foriincon:i=i.replace("\n","")# 去掉读取每一行数据的\nstop_words.add(i)# 去除停用词并且去除单字forwordinseg_list_exact:ifwordnotinstop_wordsandlen(word)>1:result_list.append(word)returnCounter(result_list).most_common(top_n)comment='大唐不夜城,不夜城趣味性很高,里面地方特色东西好吃,也有星巴克麦当劳等等选择,有不少场表演,外景夜景一定要薅一个,其它地方很难有这般景象了。娱乐体验了不倒翁,还有十二时辰里面表演更加精彩、内景拍照不错,簋唐楼可以尝试一下沉浸剧本杀……'comment_cutted=chinese_word_cut(comment,top_n=5)# word_counts.most_common(10) # 输出词频最高的前十个单词print("中文词频统计结果:")forword,freqincomment_cutted:print(f"词语: '{word}' => 出现次数:{freq}")结果如下:
中文词频统计结果: 词语:'不夜城'=> 出现次数: 2 词语:'里面'=> 出现次数: 2 词语:'地方'=> 出现次数: 2 词语:'表演'=> 出现次数: 2 词语:'大唐'=> 出现次数: 1