一篇中文文本分析入门教程:分词、词频统计与 TF-IDF 关键词提取
一、简介
在做论文复现、政策文本分析、新闻评论研究或者企业年报挖掘时,我们经常会遇到大量中文文本。
这些文本看起来只是普通的句子和段落,但如果借助 Python,就可以把它们转化成可以统计、可以建模、可以可视化的结构化数据。
本期教程以“数字经济与企业创新”相关文本为例,带大家完成一个完整的中文文本分析流程:
原始文本→ 文本清洗→ 中文分词→ 去除停用词→ 词频统计→ TF-IDF 关键词提取→ 结果可视化
通过这个流程,我们可以快速回答两个问题:
二、为什么要做中文文本分析?
在传统数据分析中,我们常用的是 Excel、CSV 或数据库中的结构化数据,比如收入、价格、年份、企业规模等。
但现实研究中,还有大量重要信息隐藏在文本里,例如:
这些文本本身不能直接用于回归分析或机器学习建模,需要先转化为可分析的变量。
中文文本分析的作用,就是把原本非结构化的文字,转化为:
本教程主要介绍其中最基础、最常用的两个方法:
三、案例背景
本案例围绕“数字经济与企业创新”主题构建一组示例文本。
假设我们正在分析一组关于数字经济、人工智能、企业创新和产业升级的短文本,希望从中提取核心关键词,判断文本主要关注哪些主题。
示例文本如下:
这些文本虽然很短,但已经包含了多个重要研究关键词,例如“数字经济”“企业创新”“人工智能”“产业升级”“研发投入”等。
四、分析流程
整个 Python 中文文本分析流程可以分为六步。
第一步:准备文本数据
先将文本整理成列表或表格形式。
documents = [ "数字经济正在成为推动企业创新和产业升级的重要力量。", "人工智能、大数据和云计算正在改变企业生产方式。", "企业通过数字技术提高运营效率并增强市场竞争力。", "研发投入和技术创新是企业实现高质量发展的关键。", "数字化转型推动了产业结构升级和商业模式创新。"]
这里每一行文本可以理解为一篇文章、一段摘要、一条评论或一份政策文件中的一句话。
第二步:文本清洗
文本中通常包含标点符号、数字、英文字符和特殊符号。为了减少干扰,需要先进行清洗。
import redef clean_text(text): text = re.sub(r"[^\u4e00-\u9fa5]", "", text) return text
这段代码的作用是只保留中文字符。
例如:
人工智能、大数据和云计算正在改变企业生产方式。
清洗后变成:
人工智能大数据和云计算正在改变企业生产方式
这样后续分词时,标点符号就不会影响结果。
第三步:中文分词
中文和英文不同,英文单词之间天然有空格,而中文句子是连续的字符。
因此,在统计词频之前,需要先进行中文分词。
import jiebatext = "数字经济正在成为推动企业创新和产业升级的重要力量"words = jieba.lcut(text)print(words)
可能得到的结果是:
['数字经济', '正在', '成为', '推动', '企业', '创新', '和', '产业升级', '的', '重要', '力量']
可以看到,一句话被拆分成了多个词语,例如:
这些词语就是后续统计和建模的基本单位。
第四步:去除停用词
分词之后,结果中会出现一些分析价值较低的词,例如:
的、了、和、是、在、也、都
这些词虽然出现频率很高,但通常不能代表文本主题,所以需要去除。
stopwords = ["的", "了", "和", "是", "在", "也", "都", "并", "与", "及"]filtered_words = [ word for word in words if word not in stopwords and len(word) > 1]
去除停用词后,结果会更加集中,关键词也更有解释意义。
第五步:词频统计
词频统计用于回答一个最直观的问题:
哪些词出现得最多?
from collections import Counterword_counts = Counter(filtered_words)for word, count in word_counts.most_common(10): print(word, count)
如果把所有文本的分词结果合并后统计,就可以得到整体高频词。
词频越高,说明这个词在文本集合中出现得越频繁,通常也更能反映整体主题。
第六步:TF-IDF 关键词提取
词频统计只能说明一个词出现了多少次,但出现次数多,不一定说明它最重要。
例如“企业”这个词可能在很多文本里都出现,但它不一定能区分某一篇文章的独特主题。
这时就需要使用 TF-IDF。
TF-IDF 的基本思想是:
- • 但如果这个词在所有文本中都经常出现,它的区分能力就会下降;
- • 所以 TF-IDF 更适合提取每篇文本中最有代表性的关键词。
from sklearn.feature_extraction.text import TfidfVectorizervectorizer = TfidfVectorizer()tfidf_matrix = vectorizer.fit_transform(processed_documents)feature_names = vectorizer.get_feature_names_out()
通过 TF-IDF,可以得到每个词在每篇文本中的重要性权重。
五、代码展示
下面是一份可以直接运行的 Python 示例代码。
# -*- coding: utf-8 -*-import reimport jiebaimport pandas as pdimport matplotlib.pyplot as pltfrom collections import Counterfrom sklearn.feature_extraction.text import TfidfVectorizer# 1. 示例文本documents = [ "数字经济正在成为推动企业创新和产业升级的重要力量。", "人工智能、大数据和云计算正在改变企业生产方式。", "企业通过数字技术提高运营效率并增强市场竞争力。", "研发投入和技术创新是企业实现高质量发展的关键。", "数字化转型推动了产业结构升级和商业模式创新。", "数字经济背景下,企业创新能力成为影响市场竞争的重要因素。", "人工智能技术能够帮助企业优化生产流程,提高资源配置效率。", "产业升级需要数字技术、研发投入和组织管理创新共同推动。"]df = pd.DataFrame({ "text_id": [f"text_{i+1}" for i in range(len(documents))], "content": documents})# 2. 停用词stopwords = [ "的", "了", "和", "是", "在", "也", "都", "并", "与", "及", "正在", "成为", "通过", "能够", "需要", "实现", "进行", "一个", "下", "为", "对", "中", "上", "等"]# 3. 文本清洗def clean_text(text): text = re.sub(r"[^\u4e00-\u9fa5]", "", text) return text# 4. 分词与去停用词def tokenize_text(text): clean = clean_text(text) words = jieba.lcut(clean) words = [word for word in words if word not in stopwords and len(word) > 1] return wordsdf["tokens"] = df["content"].apply(tokenize_text)df["processed_text"] = df["tokens"].apply(lambda x: " ".join(x))# 5. 词频统计all_words = []for words in df["tokens"]: all_words.extend(words)word_counts = Counter(all_words)word_freq_df = pd.DataFrame( word_counts.most_common(), columns=["关键词", "出现次数"])print("词频统计结果:")print(word_freq_df.head(10))# 6. 绘制词频柱状图top_words = word_freq_df.head(10)plt.figure(figsize=(10, 6))plt.bar(top_words["关键词"], top_words["出现次数"])plt.xlabel("关键词")plt.ylabel("出现次数")plt.title("中文文本高频词统计")plt.xticks(rotation=45)plt.tight_layout()plt.show()# 7. TF-IDF 关键词提取vectorizer = TfidfVectorizer()tfidf_matrix = vectorizer.fit_transform(df["processed_text"])feature_names = vectorizer.get_feature_names_out()tfidf_results = []for i, text_id in enumerate(df["text_id"]): scores = tfidf_matrix[i].toarray()[0] word_scores = list(zip(feature_names, scores)) word_scores = sorted(word_scores, key=lambda x: x[1], reverse=True) for word, score in word_scores[:5]: if score > 0: tfidf_results.append({ "文本编号": text_id, "关键词": word, "TF-IDF权重": round(score, 4) })tfidf_df = pd.DataFrame(tfidf_results)print("TF-IDF 关键词结果:")print(tfidf_df)
六、代码重点解释
1. jieba.lcut()
words = jieba.lcut(clean)
jieba.lcut() 用于中文分词。
中文文本没有天然的空格,因此必须先把一句话拆成一个个词语,后面才能做词频统计和关键词提取。
2. Counter()
word_counts = Counter(all_words)
Counter() 用于统计每个词出现的次数。
它可以快速得到高频词,并通过 most_common() 输出出现次数最多的词语。
3. TfidfVectorizer()
vectorizer = TfidfVectorizer()tfidf_matrix = vectorizer.fit_transform(df["processed_text"])
TfidfVectorizer() 用于计算 TF-IDF 权重。
它会将文本转化为一个数值矩阵:
4. matplotlib
plt.bar(top_words["关键词"], top_words["出现次数"])
matplotlib 用于绘制高频词柱状图。
相比只看表格,图形可以更直观地展示哪些词出现得最多。
七、结果展示
1. 词频统计结果
运行代码后,可以得到如下词频统计结果:
从词频统计结果可以看出,“企业”“创新”“数字”“技术”等词出现频率较高。
这说明文本整体围绕以下几个主题展开:
2. TF-IDF 关键词结果
TF-IDF 结果示例如下:
从结果可以看出,不同文本的代表性关键词并不完全相同。
例如:
3. 高频词柱状图展示
词频柱状图可以直观展示不同关键词的出现次数。
图形一般包括:
从图中可以更清楚地看到,“企业”“创新”“数字”“技术”等词在文本中占据较高位置。
这一结果说明,文本集合整体主题比较集中,主要围绕数字经济背景下的企业创新与技术升级展开。
八、结果解读
1. 高频词说明整体研究主题
词频统计结果反映的是整组文本中最常出现的词。
在本案例中,“企业”“创新”“数字”“技术”等词频较高,说明文本主要讨论的是:
数字技术如何影响企业创新和产业升级。
这种方法适合用于快速判断一批文本的整体主题。
2. TF-IDF 说明单篇文本特征
相比词频统计,TF-IDF 更适合识别每篇文本的差异。
例如:
- • “人工智能”“大数据”“云计算”更能代表 text_2;
- • “研发投入”“技术创新”更能代表 text_4;
- • “数字化转型”“商业模式”更能代表 text_5。
因此,TF-IDF 不仅可以看整体热点,还可以比较不同文本之间的主题差异。
3. 文本分析可以服务后续研究
完成词频统计和 TF-IDF 后,后续还可以继续做:
因此,这个教程可以看作中文文本分析的入门基础。
九、适用场景
这个方法不仅适合本案例,也适合很多常见研究场景。
十、教程总结
本期教程使用 Python 完成了一个完整的中文文本分析流程。
主要步骤包括:
- 6. 使用
TfidfVectorizer 提取 TF-IDF 关键词; - 7. 使用
matplotlib 绘制高频词柱状图。
通过这个案例可以看到,Python 不仅能处理表格数据,也可以处理中文文本数据。
只要完成分词、清洗和向量化,就可以把一篇篇文章转化成可统计、可建模、可解释的数据结果。