我们之前已经学习了如何读取文件、多线程处理数据,接下来让我们一起探索如何从文本中提取有价值的信息!
1. 词频分析
词频分析是指统计文本中每个词出现的频率,从而找出文本中最常出现的词汇。这不仅能帮助我们快速了解文本的主题,还能发现一些有趣的趋势。
词频分析的基本原理是基于统计学,利用程序统计文本中每个词的出现次数。这需要我们对文本进行分词处理,然后构建一个"词频字典",记录每个词和对应的出现次数。举个例子,就像统计一篇文章中"苹果""香蕉""橙子"出现的次数,出现次数多的词语,可能就是文章的重点讨论对象。
1.1 词频分析的一般步骤
- 分词:将文本分割成一个个独立的词语。
- 过滤停用词:去除常见的无意义词汇(如"的""是""和"等)。
- 统计词频:计算每个词出现的次数。
- 展示:找出出现频率最高的几个词,可以通过词云展示。
1.2 使用 jieba
进行分词
jieba
是一个非常流行的中文分词库,支持精确模式、全模式和搜索引擎模式。
pip install jieba
分词是关键一步,中文分词常用的是基于词典匹配的方法。例如,有一段文本"我爱吃苹果,苹果真好吃",分词后得到"我""爱""吃""苹果"",""苹果""真""好吃"。然后统计词频,"苹果"出现两次,"我""爱""吃"等各出现一次,于是可以推测文章的主题可能与"苹果"相关。
而英文分词相对简单,以空格为分隔符,直接将句子拆分成一个个单词。例如句子"Python is a powerful language",分词结果为"Python""is""a""powerful""language"。
因此我们一般使用jieba
这个库来分析中文词频,让我们看段代码如何统计词频。
python
import jieba
def word_frequency(text):
# 分词
words = jieba.lcut(text)
# 构建词频字典
freq_dict = {}
for word in words:
if word not in freq_dict:
freq_dict[word] = 1
else:
freq_dict[word] += 1
return freq_dict
# 测试段落
text = "我爱吃苹果,苹果真好吃。我每天都要吃一个苹果,它很甜。"
result = word_frequency(text)
# 输出结果
print(result)
# 输出示例:{'我': 2, '爱': 1, '吃': 3, '苹果': 4, '真': 1, '好吃': 1, '每天': 1, '都': 1, '要': 1, '一个': 1, '它': 1, '很': 1, '甜': 1}
看到了吗?"苹果" 出现了 4 次,妥妥的是重点。
另外,jieba
还支持三种分词模式:
- 精确模式(默认):尽可能切分最合理的词,不会漏掉重要词汇
- 全模式:把所有可能的词都列出来,适用于搜索引擎
- 搜索引擎模式:在精确模式基础上,对长词再进行拆分,适用于搜索推荐
python
import jieba
text = "我今天去了超市买了一些苹果和香蕉,但是忘记买牛奶了。"
# 精确模式(默认)
words1 = jieba.lcut(text)
print("精确模式:", words1)
# 全模式
words2 = jieba.lcut(text, cut_all=True)
print("全模式:", words2)
# 搜索引擎模式
words3 = jieba.lcut_for_search(text)
print("搜索引擎模式:", words3)
#精确模式: ['我', '今天', '去', '了', '超市', '买', '了', '一些', '苹果', '和', '香蕉', ',', '但是', '忘记', '买', '牛奶', '了', '。']
#全模式: ['我', '今天', '去', '了', '超市', '买', '了', '一些', '苹果', '和', '香蕉', ',', '但是', '忘记', '买', '牛奶', '了', '。']
#搜索引擎模式: ['我', '今天', '去', '超','市', '买', '一些', '苹果', '香蕉', '但是', '忘记', '买', '牛奶']
主要区别:
- 精确模式:按常规分词,去掉标点
- 全模式:会多拆分一些可能的词,比如 "今天" 会拆成 "今" 和 "天"
- 搜索引擎模式:在精确模式基础上,对长词再拆分,比如 "超市" 可能拆成 "超" 和 "市"
1.3 过滤停用词
停用词是指在文本中频繁出现但没有实际意义的词汇,常见停用词如下,我们可以使用一个停用词表来过滤这些词。
- 虚词(如 "的"、"了"、"是"):对句子结构重要,但没有具体含义
- 高频但无信息量的词(如 "我们"、"你们"、"这个"):无法提供有价值的信息
- 介词、连词、副词(如 "因为"、"但是"、"然后"):主要起连接作用
停用词库是一个包含常见停用词的列表 ,一般存储在 .txt
文件中,每一行一个词,我们这里给大家推荐哈工大停用词表(746 个)。
哈工大停用词表: https://github.com/goto456/stopwords/blob/master/cn_stopwords.txt
加载停用词的代码实现:
python
import jieba
# 读取文本
text = "我今天去了超市买了一些苹果和香蕉,但是忘记买牛奶了。"
# 加载停用词
stopwords = load_stopwords("stopwords.txt")
# 进行分词
words = jieba.lcut(text)
# 过滤停用词
filtered_words = [word for word in words if word not in stopwords and len(word) > 1]
print("去掉停用词后的结果:", filtered_words)
#去掉停用词后的结果: ['今天', '超市', '买', '苹果', '香蕉', '忘记', '买', '牛奶']
有时候,默认停用词库不够用,我们可以添加一些专属的停用词:
arduino
# 自定义停用词
custom_stopwords = {"苹果", "香蕉"}
# 过滤停用词
filtered_words = [word for word in words if word not in stopwords and word not in custom_stopwords and len(word) > 1]
print("自定义停用词后的结果:", filtered_words)
1.4 统计词频
我们可以使用 Counter
来统计词频。
python
from collections import Counter
text = "我今天去了超市买了一些苹果和香蕉,但是忘记买牛奶了。"
# 分词(去除停用词)
stopwords = {"的", "了", "是", ",", "。", "但"} # 这里可以加载停用词文件
# 进行分词
words = jieba.lcut(text)
filtered_words = [word for word in words if word not in stopwords and len(word) > 1]
# 统计词频
word_counts = Counter(filtered_words)
print("词频统计结果:", word_counts)
#词频统计结果: [('买', 2), ('今天', 1), ('超市', 1), ('苹果', 1), ('香蕉', 1), ('忘记', 1), ('牛奶', 1)]
1.5 词频可视化
1.5.1 统计图
我们可以用 matplotlib
来画一个简单的坐标系来直观的进行展示
python
import jieba
import matplotlib.pyplot as plt
from collections import Counter
# 示例文本
text = "Python是一种高级编程语言,因其简洁和易读性而受到广泛欢迎。它支持多种编程范式,包括面向对象、命令式和函数式编程。Python拥有强大的标准库和丰富的第三方库,使得开发者能够快速构建各种应用程序。Python社区活跃且友好,提供了大量的资源和支持。初学者可以通过在线教程、书籍和视频课程轻松入门。许多大型科技公司如Google、Facebook和Netflix都在使用Python进行开发,因此掌握Python技能对于职业发展非常有利。Python的应用领域非常广泛,包括Web开发、数据分析、人工智能、自动化脚本等。其灵活性和广泛的用途使其成为当今最受欢迎的编程语言之一。"
# 设置 Matplotlib 中文字体
plt.rcParams["font.family"] = "SimHei" # 黑体
plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题
# 1. 使用 jieba 进行分词
words = jieba.lcut(text)
# 2. 加载停用词表(这里手动定义,实际可以用完整的停用词库)
stopwords = {"的", "了", "是", "我", "在", "有"} # 这里可以用外部停用词文件
# 3. 过滤掉停用词
filtered_words = [word for word in words if word not in stopwords and len(word) > 1]
# 4. 统计词频
word_freq = Counter(filtered_words)
# 5. 取前 10 个高频词
top_words = word_freq.most_common(10) # 取前10个高频词
words, counts = zip(*top_words) # 解包成两个列表:词语 & 计数
# 6. 绘制柱状图
plt.figure(figsize=(10, 5))
plt.bar(words, counts, color="skyblue") # 画柱状图
plt.xlabel("词语", fontsize=12)
plt.ylabel("次数", fontsize=12)
plt.title("高频词", fontsize=14)
plt.xticks(rotation=45) # 让横坐标倾斜,避免重叠
plt.grid(axis="y", linestyle="--", alpha=0.7) # 添加网格,增强可读性
plt.show()
1.5.2 词云
词云是一种将文本中出现频率高的词以大字体显示,频率低的词以小字体显示的可视化方法。通过词云,我们可以直观地看到文本的重点内容。
wordcloud
是一个非常流行的词云生成库,支持多种语言和自定义样式。
安装 **wordcloud**
pip install wordcloud
运行后,程序会生成一个词云图,其中 "Python""编程语言""的" 等高频词会特别显眼,"的"、"和"这种词在我们词频分析中是没有价值的,可以通过停用词去掉。
代码示例:
python
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba
def generate_wordcloud(text):
# 分词
words = jieba.lcut(text)
# 应用空格连接
text_joined = ' '.join(words)
# 参数设置
wc = WordCloud(
font_path='simhei.ttf', # 需要指定支持中文的字体,如黑体
background_color='white', # 背景色
width=1920,
height=1080
)
# 生成词云
wc.generate(text_joined)
# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()
# 测试文本
text = "Python是一种高级编程语言,因其简洁和易读性而受到广泛欢迎。它支持多种编程范式,包括面向对象、命令式和函数式编程。Python拥有强大的标准库和丰富的第三方库,使得开发者能够快速构建各种应用程序。Python社区活跃且友好,提供了大量的资源和支持。初学者可以通过在线教程、书籍和视频课程轻松入门。许多大型科技公司如Google、Facebook和Netflix都在使用Python进行开发,因此掌握Python技能对于职业发展非常有利。Python的应用领域非常广泛,包括Web开发、数据分析、人工智能、自动化脚本等。其灵活性和广泛的用途使其成为当今最受欢迎的编程语言之一。"
generate_wordcloud(text)
wordcloud
库还有一些更高级的用法,我们简单介绍几个
高级功能 | 方法 |
自定义形状 | mask=np.array(Image.open("xxx.png")) |
颜色控制 | colormap="coolwarm" 或 ImageColorGenerator |
限制词数 | max_words=50 |
过滤停用词 | stopwords={"的", "了", "是"} |
设置字体大小 | min_font_size=10, max_font_size=100 |
保存高清图片 | wordcloud.to_file("wordcloud.png") |
默认情况下,WordCloud
生成的是矩形词云 ,但我们可以使用自定义形状 (如圆形、人物、Logo)来生成个性化词云。(务必转换为黑白图片)
使用图片形状
python
import jieba
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
from wordcloud import WordCloud
# 读取文本
text = "数据分析、机器学习、人工智能、Python、深度学习、爬虫、数据可视化、NLP"
# 使用 jieba 分词
words = " ".join(jieba.lcut(text))
# 读取自定义形状的图片(必须是黑白图,黑色部分显示词云,白色部分为空)
mask = np.array(Image.open("图片.png")) # 替换成你的图片路径
# 生成词云
wordcloud = WordCloud(
font_path="SimHei.ttf", # 设置中文字体
background_color="white", # 背景色
mask=mask, # 形状
contour_width=1, # 轮廓线宽度
contour_color="black", # 轮廓颜色
).generate(words)
# 显示词云
plt.figure(figsize=(8, 8))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
效果:你的词云可以是 ❤️、🚀、🐼 、人物头像或者公司Logo!
默认词云颜色随机,我们可以指定颜色:
代码示例:使用渐变色
python
wordcloud = WordCloud(
font_path="SimHei.ttf",
background_color="white",
colormap="coolwarm", # 颜色方案(可换成 "Blues", "Greens", "Reds")
width=800,
height=400,
).generate(words)
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
当然,我们还可以使用第三方服务,无需代码,直接生成美观的图片!
2. 文本情感分析
文本不仅在讲内容,还在传递情绪,情感分析是指通过分析文本中的词汇和语句,判断文本的情感倾向(正面、负面或中性)。比如一条用户对产品的评价,到底是好评还是差评?情感分析就能帮你摸清楚文本的情绪底色------是正面、负面还是中性。
2.1 情感分析的两种流派
1️⃣ 基于情感词典
这种方法是通过预先准备一个情感词典,里面包含大量的积极词和消极词,比如 "好""棒""差""坏" 等,每个词都有一个权重值。分析时,程序会在文本中搜索这些情感词,根据它们的权重累计总分。总分高,说明文本情绪积极;反之则是消极。
情感词典的例子:
- 积极情感词:好(权重 2)、棒(权重 3)、喜欢(权重 2)
- 消极情感词:差(权重 -3)、坏(权重 -2)、讨厌(权重 -3)
- 文本:"这个电影真的好棒,我喜欢!" 情感分析结果:总分为 2+3+2=7,积极情感。
2️⃣ 基于机器学习模型
这有点像 "拜师学艺"。先用带有标记的大量文本数据训练一个分类器,让它识别哪些词语组合倾向于积极情感,哪些倾向于消极情感,当新文本来时,让这个分类器判断情感类别。
常用的算法有朴素贝叶斯、支持向量机(SVM)、深度学习中的 LSTM 等。
2.2 使用 SnowNLP
进行情感分析
SnowNLP
是一个简单易用的中文文本处理库,支持情感分析、文本摘要等功能。
安装 SnowNLP
pip install snownlp
使用 SnowNLP
进行情感分析的代码其实很简单
python
from snownlp import SnowNLP
text = "这部电影真的很好看,我非常喜欢!"
s = SnowNLP(text)
sentiment_score = s.sentiments
print(f"情感分析结果:{sentiment_score:.2f}")
我们最终得到的结果是一个数值,得分范围为 0 到 1,当
- 得分接近 1:正面情感
- 得分接近 0:负面情感
我们试着分析下面三段不同情感的语句。
python
from snownlp import SnowNLP
texts = [
"这部电影真的很好看,我非常喜欢!",
"这部电影太糟糕了,我一点也不喜欢。",
"这部电影一般般,没什么特别的感觉。"
]
for text in texts:
s = SnowNLP(text)
sentiment_score = s.sentiments
if sentiment_score > 0.9:
print(f"正面情感:{text}得分:{sentiment_score:.2f}")
elif sentiment_score < 0.6:
print(f"负面情感:{text}得分:{sentiment_score:.2f}")
else:
print(f"中性情感:{text}得分:{sentiment_score:.2f}")
# 结果
# 正面情感:这部电影真的很好看,我非常喜欢!得分:0.99
# 负面情感:这部电影太糟糕了,我一点也不喜欢。得分:0.57
# 中性情感:这部电影一般般,没什么特别的感觉。得分:0.84
运行结果:
通过调整阈值,我们就可以轻松判断一段文本的情感色彩!
3. 小结
通过本文的学习,我们掌握了三大文本分析技能:词频分析 帮我们找出文本重点,词云 则让我们直观地看到高频词的分布情况,情感分析帮我们了解文本情绪,分析文字背后的价值。
⚠️一些注意事项:
- 词频分析:记得排除一些无意义的停用词(如 "的""是""啊" 等),避免干扰分析结果。
- 情感分析:中文情感分析可以尝试对比一下两种不同实现的库,看看哪种效果更好。
- 词云 :可以设置不同的词云形状,比如心形、三角形等,让词云更有趣。只需要在
WordCloud
参数中添加mask
参数,传入一张遮罩图片即可,也可以使用一些第三方服务,轻松制作词云。
在实际应用中,这些技能可以用于舆情监测(比如分析用户对产品的评价)、内容创作(根据高频词构思文章主题)、市场调研(挖掘消费者关注点)等场景。只要肯动手实践,你就能不断挖掘文本背后的价值。