前言
前面我们已经介绍了文本分析中的中文分词和去除停用词,这篇文章将详细介绍分词后如何进行词频统计分析。
词频统计的概念
词频统计是指在文本或语音数据中,统计每个单词或符号出现的次数,以便对文本或语音数据进行分析和预处理。词频统计是自然语言处理中的一个重要任务,其目的是为后续的文本分析、情感分析、机器翻译等任务做好准备。
在词频统计中,通常将文本或语音数据转换成单词或符号的形式,然后统计每个单词或符号出现的次数,并将其存储为一个数据集或字典。这些数据集或字典可以用来训练机器学习模型或进行文本分类、情感分析等任务。
词频统计可以应用于许多领域,例如文本分类、情感分析、机器翻译、信息检索等。在文本分类中,词频统计可以帮助确定最重要的单词或符号,以帮助分类器进行分类。在情感分析中,词频统计可以帮助确定文本中最常见的情感,以便进行分类。在机器翻译中,词频统计可以帮助确定翻译的单词或符号。在信息检索中,词频统计可以帮助确定查询中最重要的单词或符号,以便进行查询匹配。
总之,词频统计是自然语言处理中的一个重要任务,其目的是为后续的文本分析、情感分析、机器翻译等任务做好准备。
常用的方法和工具:
- Python:Python 是一种非常流行的编程语言,有许多库和工具可以用于文本处理和统计,其中最流行的是 NumPy、Pandas 和 SciPy。可以使用这些库中的任何一个来计算文本中词频统计,例如使用 NumPy 中的 str_freq 函数来计算字符串中单词出现的频率。
- R:R 是一种统计软件,可以轻松地进行数据可视化和统计分析。可以使用 R 中的 text mining 包来计算文本中词频统计,例如使用 tm 包中的 tf_idf 函数来计算文本的分词和词频统计。
- Java:Java 是一种流行的编程语言,也有许多库和工具可以用于文本处理和统计。可以使用 Java 中的 Apache Commons Text 和 Apache Commons Collections 库来计算文本中词频统计,例如使用 Commons Text 中的 getWords method 来获取文本中的单词。
- JavaScript:JavaScript 是一种前端编程语言,也可以用于后端开发。可以使用 JavaScript 中的 Node.js 和 npm 包管理器来运行文本处理和统计任务,例如使用 npm 包中的 text-parser 和 text-count 包来计算文本中词频统计。
Python实现词频统计
关于python的实现,我给大家介绍两种最常用的方法。
在做词频统计之前,需要要用到前面介绍中文分词封装的函数,然后我这里使用了关于大唐不夜城的一条评论文本作为示范先进行分词。
import re import jieba def chinese_word_cut(mytext): jieba.load_userdict('自定义词典.txt') # 这里你可以添加jieba库识别不了的网络新词,避免将一些新词拆开 jieba.initialize() # 初始化jieba # 文本预处理 :去除一些无用的字符只提取出中文出来 new_data = re.findall('[\u4e00-\u9fa5]+', mytext, re.S) new_data = " ".join(new_data) # 文本分词 seg_list_exact = jieba.lcut(new_data) result_list = [] # 读取停用词库 with open('停用词库.txt', encoding='utf-8') as f: # 可根据需要打开停用词库,然后加上不想显示的词语 con = f.readlines() stop_words = set() for i in con: i = i.replace("\n", "") # 去掉读取每一行数据的\n stop_words.add(i) # 去除停用词并且去除单字 for word in seg_list_exact: if word not in stop_words and len(word) > 1: result_list.append(word) return result_list comment = '大唐不夜城,不夜城趣味性很高,里面地方特色东西好吃,也有星巴克麦当劳等等选择,有不少场表演,外景夜景一定要薅一个,其它地方很难有这般景象了。娱乐体验了不倒翁,还有十二时辰里面表演更加精彩、内景拍照不错,簋唐楼可以尝试一下沉浸剧本杀……' comment_cutted = chinese_word_cut(comment) comment_cutted
方法1:使用Pandas库实现
首先使用pandas将前面分词结果进行转化DataFrame类型
import pandas as pd df = pd.DataFrame(comment_cutted) df
接着使用groupby函数对第0列进行统计,然后降序输出
word_frequency_df = df.groupby(0).size().sort_values(ascending=False) word_frequency_df
最后将词频统计的结果保存为文件
# 将词频统计进行保存 word_frequency_df.to_excel('词频统计结果.xlsx') # 保存为excel文件 # word_frequency_df.to_csv('词频统计结果.xlsx') # 保存为csv文件
方法2:使用collections库
# 方法2-使用collections库 from collections import Counter Counter(comment_cutted)
使用Counter函数对前面的分词结果进行统计,然后使用most_common输出按词频频次降序排列的结果,如果你只想输出前n个单词,传入数值即可。 默认是全部输出。
word_counts = Counter(comment_cutted) word_counts.most_common() # word_counts.most_common(10) # 输出词频最高的前十个单词
如果想将上面结果保存为文件的话,执行以下代码:
# 将词频统计结果保存为txt文件 word_counts_top = word_counts.most_common() with open('词频统计结果.txt','w',encoding='utf-8')as f: for i in word_counts_top: f.write(str(i[0])) f.write('\t') f.write(str(i[1])) f.write('\n')
如果我们想将TOP10高频词进行可视化展示,可以执行下面代码:
import matplotlib.pylab as plt plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示 plt.rcParams['axes.unicode_minus'] = False #解决符号无法显示 word_counts = Counter(comment_cutted) word_counts_top = word_counts.most_common() x = [item[0] for item in word_counts_top[:10]] y = [item[1] for item in word_counts_top[:10]] plt.bar(x,y) plt.title('Top10高频词') plt.xlabel('词语') plt.ylabel('频次') plt.show()
案例实战
词频分析只是文本分析的一个环节,我在之前的文章中也用到过,大家可以参考学习: