文本分析 - 正负样本长度散点分布
1 课程概览
本课使用散点图(strip plot)展示训练集和测试集中正负样本的句子长度分布,通过 sns.stripplot() 可视化不同标签(0=差评,1=好评)的长度分布,有效定位异常点(离群值)的出现位置,帮助精准进行人工语料审核。
2 核心概念与定义
- 散点图(Strip Plot):使用
sns.stripplot()绘制的散点分布图,展示不同类别的数值分布。 - 离群值(Outlier):明显偏离大多数数据的点,如长度接近 3500 的评论。
- hue 参数:用于分组的字段,不同组用不同颜色表示。
3 模型与算法详解
散点图分析流程
- 读取数据:训练集和测试集
- 计算句子长度:新增
sentence_len列 - 绘制散点图:
sns.stripplot(x="label", y="sentence_len", data=df) - 识别异常点:查看离群值位置
sns.stripplot() 参数说明
| 参数 | 说明 |
|---|---|
| x | X 轴数据(如 label) |
| y | Y 轴数据(如 sentence_len) |
| data | 数据集 |
| hue | 分组字段(不同组不同颜色) |
异常点识别
- 大多数数据集中在 20-250 区间
- 离群值长度接近 3500(异常长评论)
- 需人工审查异常点内容
正负样本长度分布对比
| 数据集 | 分布特点 |
|---|---|
| 训练集 | 数据集中,离群值明显 |
| 测试集 | 分布更均匀、更离散 |
4 数学原理与推导
散点图坐标
每个点 $(x_i, y_i)$:
- $x_i$:标签(0 或 1)
- $y_i$:句子长度
离群值判定
$$\text{Outlier}: y_i \gg \text{median}(y) + k \cdot \text{IQR}$$
其中 IQR 为四分位距,$k$ 通常取 1.5 或 3。
5 代码示例
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 定义函数:训练集和测试集的正负样本长度散点分布
def dm03_strip_plot():
# 1. 读取训练集和测试集
train_data = pd.read_csv("./data/train.tsv", sep="\t")
test_data = pd.read_csv("./data/test.tsv", sep="\t")
# 2. 获取数据长度序列
train_data["sentence_len"] = list(
map(lambda x: len(x), train_data["sentence"])
)
test_data["sentence_len"] = list(
map(lambda x: len(x), test_data["sentence"])
)
# 3. 绘制正负样本长度散点分布
plt.figure(figsize=(12, 5))
# 3.1 训练集散点图
plt.subplot(1, 2, 1)
sns.stripplot(
x="label", # X轴:标签(0=差评,1=好评)
y="sentence_len", # Y轴:句子长度
data=train_data, # 数据集
hue="label" # 分组字段(不同标签不同颜色)
)
plt.title("训练集正负样本长度散点分布")
# 3.2 测试集散点图
plt.subplot(1, 2, 2)
sns.stripplot(
x="label",
y="sentence_len",
data=test_data,
hue="label"
)
plt.title("测试集正负样本长度散点分布")
plt.show()
# 测试
if __name__ == "__main__":
dm03_strip_plot()
查看异常点内容
# 查看长度超过 3000 的异常评论
outliers = train_data[train_data["sentence_len"] > 3000]
for idx, row in outliers.iterrows():
print(f"长度: {row['sentence_len']}")
print(f"内容: {row['sentence']}")
print("-" * 50)
6 重难点与易错提醒
- ❗重点:使用
sns.stripplot(x, y, data, hue)绘制正负样本长度散点图。 - ⚠️易错:
hue参数用于分组,不同组用不同颜色。 - 💡深入理解:散点图能有效定位异常点(离群值),帮助人工审核。
- 💡深入理解:大多数数据集中在 20-250 区间,长度 3500 的评论为异常。
- ❗重点:训练集和测试集的散点图代码一致,只需更换数据集。
7 课堂问答精选
Q1:如何绘制正负样本长度散点图?
A:使用 sns.stripplot(x="label", y="sentence_len", data=train_data, hue="label"),其中 x 为标签,y 为句子长度,hue 为分组字段。
Q2:hue 参数的作用是什么?
A:hue 用于分组,不同组用不同颜色表示。例如 hue="label" 会让 0 和 1 标签用不同颜色显示。
Q3:如何识别异常点?
A:通过散点图查看明显偏离大多数数据的点,如长度接近 3500 的评论(大多数集中在 20-250)。可使用 train_data[train_data["sentence_len"] > 3000] 筛选异常点。
Q4:训练集和测试集的散点图有什么区别?
A:训练集分布较集中,离群值明显;测试集分布更均匀、更离散。
8 本课小结
- 散点图:
sns.stripplot(x="label", y="sentence_len", data=df, hue="label")。 - 参数:x(X轴)、y(Y轴)、data(数据集)、hue(分组字段)。
- 异常点识别:大多数集中在 20-250,离群值长度接近 3500。
- 人工审核:通过散点图定位异常点,进行人工语料审查。
- 训练集和测试集代码一致,只需更换数据集。
9 延伸思考
- 如何处理异常长的评论?截断还是删除?
- 离群值对模型训练有什么影响?