文本分析 - 高频形容词词云
1 课程概览
本课演示如何获取训练集中正负样本的高频形容词,并生成词云图。使用 jieba 的词性标注功能(POS)筛选形容词(词性标记 'a'),使用 WordCloud 库生成词云可视化。
2 核心概念与定义
- 词性标注(POS Tagging):使用 jieba 的
posseg.lcut()对文本进行切词并标注词性。 - 形容词(Adjective):词性标记为 'a',如"好"、"差"、"漂亮"。
- 词云(Word Cloud):将词语按频率可视化展示,频率越高字体越大。
3 模型与算法详解
处理流程
- 获取形容词列表:使用 jieba 词性标注,筛选词性为 'a' 的词
- 生成词云图:使用 WordCloud 库可视化高频形容词
jieba 词性标注
import jieba.posseg as pseg
for value in pseg.lcut(text):
word = value.word # 词
flag = value.flag # 词性
常见词性标记
| 标记 | 词性 |
|---|---|
| a | 形容词 |
| n | 名词 |
| v | 动词 |
| d | 副词 |
WordCloud 参数
| 参数 | 说明 |
|---|---|
| font_path | 字体路径(中文需指定) |
| max_words | 最大显示词数 |
| background_color | 背景色 |
4 数学原理与推导
词频统计
$$\text{freq}(w) = \text{count}(w \text{ in corpus})$$
词云字体大小
$$\text{size}(w) \propto \text{freq}(w)$$
频率越高,字体越大。
5 代码示例
import jieba.posseg as pseg
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 5.1 获取文本中的形容词列表
def get_a_list(text):
"""
获取文本中的形容词列表
:param text: 输入文本(一个句子)
:return: 形容词列表
"""
a_list = [] # 用于存储形容词
# 使用 jieba 词性标注切分文本
for value in pseg.lcut(text):
# value.word 是词,value.flag 是词性
if value.flag == "a": # 判断是否是形容词
a_list.append(value.word)
return a_list
# 5.2 根据词列表生成词云图
def get_word_cloud(word_list):
"""
根据词列表生成词云图
:param word_list: 词列表
"""
# 实例化词云对象
wordcloud = WordCloud(
font_path="./SimHei.ttf", # 字体路径(中文)
max_words=100, # 最大显示词数
background_color="white" # 背景色
)
# 将词列表拼接成字符串
text = " ".join(word_list)
# 生成词云
wordcloud.generate(text)
# 显示词云
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
# 5.3 测试:获取正负样本的高频形容词词云
def dm05_test():
import pandas as pd
# 读取训练集
train_data = pd.read_csv("./data/train.tsv", sep="\t")
# 获取正样本(好评)和负样本(差评)
positive_data = train_data[train_data["label"] == 1]
negative_data = train_data[train_data["label"] == 0]
# 获取正样本的形容词
positive_words = []
for text in positive_data["sentence"]:
positive_words.extend(get_a_list(text))
# 生成正样本形容词词云
get_word_cloud(positive_words)
# 获取负样本的形容词
negative_words = []
for text in negative_data["sentence"]:
negative_words.extend(get_a_list(text))
# 生成负样本形容词词云
get_word_cloud(negative_words)
# 测试
if __name__ == "__main__":
dm05_test()
6 重难点与易错提醒
- ❗重点:使用
jieba.posseg.lcut()进行词性标注,value.flag == "a"筛选形容词。 - ⚠️易错:WordCloud 需指定
font_path(中文字体),否则中文显示为方块。 - 💡深入理解:可替换词性标记获取其他词类(如 'n' 名词、'v' 动词)。
- 💡深入理解:词云图中频率越高的词字体越大,直观展示高频词。
7 课堂问答精选
Q1:如何获取文本中的形容词?
A:使用 jieba.posseg.lcut(text) 进行词性标注,遍历结果,筛选 value.flag == "a" 的词,添加到列表中。
Q2:如何生成词云图?
A:使用 WordCloud(font_path, max_words, background_color) 实例化,调用 generate(text) 生成,用 plt.imshow() 显示。
Q3:除了形容词,还能获取哪些词类?
A:可以获取名词('n')、动词('v')、副词('d')等,只需修改词性标记判断条件。
8 本课小结
- 形容词获取:
jieba.posseg.lcut()+value.flag == "a"。 - 词云生成:
WordCloud(font_path, max_words, background_color)。 - 词性标记:a=形容词,n=名词,v=动词,d=副词。
- 正负样本分别生成词云,分析高频形容词。
9 延伸思考
- 如何通过词云分析正负样本的情感倾向?
- 除了词云,还有哪些可视化方法展示词频?