文本分析 - 句子长度分布分析
1 课程概览
本课演示训练集和测试集的句子长度分布可视化分析。使用 map(lambda x: len(x), sentences) 或 apply(lambda x: len(x)) 计算每个句子的长度,通过柱状图和密度图展示分布情况,为后续文本长度规范(截断/补齐)提供依据。
2 核心概念与定义
- 句子长度分布(Sentence Length Distribution):统计每个句子的长度,可视化展示分布情况。
- 密度图(Density Plot / dist plot):展示数据分布的连续曲线,反映概率密度。
- 截断(Truncation):句子长度超过固定长度时,截取前面的部分。
- 补齐(Padding):句子长度不足固定长度时,用 0 填充至固定长度。
3 模型与算法详解
句子长度计算方法
思路一:map() 函数
train_data["sentence_len"] = list(map(lambda x: len(x), train_data["sentence"]))
思路二:apply() 函数
train_data["sentence_len"] = train_data["sentence"].apply(lambda x: len(x))
两种方法效果一致,apply 是 pandas 提供的方法。
可视化图表类型
| 图表类型 | 函数 | 用途 |
|---|---|---|
| 柱状图 | sns.countplot() | 统计每个长度的数量 |
| 密度图 | sns.distplot() | 展示长度分布的概率密度 |
句子长度分布分析流程
- 读取数据:训练集和测试集
- 计算句子长度:新增
sentence_len列 - 绘制分布图:柱状图 + 密度图
- 确定固定长度:根据分布选择合适长度(如 20-250 区间)
截断与补齐
| 操作 | 条件 | 方法 |
|---|---|---|
| 截断 | 句子长度 > 固定长度 | 截取前面的部分 |
| 补齐 | 句子长度 < 固定长度 | 用 0 填充至固定长度 |
4 数学原理与推导
句子长度计算
给定句子 $s$,其长度为:
$$\text{len}(s) = |s|$$
分布统计
$$P(l) = \frac{\text{count}(\text{len}(s) = l)}{N}$$
其中 $N$ 为句子总数,$l$ 为长度。
5 代码示例
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 定义函数:训练集和测试集的句子长度分布可视化
def dm02_len_dist():
# 1. 读取训练集和测试集
train_data = pd.read_csv("./data/train.tsv", sep="\t")
test_data = pd.read_csv("./data/test.tsv", sep="\t")
# 2. 计算训练集每个句子的长度
# 思路一:map 函数
train_data["sentence_len"] = list(
map(lambda x: len(x), train_data["sentence"])
)
# 思路二:apply 函数(效果一致)
# train_data["sentence_len"] = train_data["sentence"].apply(lambda x: len(x))
# 计算测试集每个句子的长度
test_data["sentence_len"] = list(
map(lambda x: len(x), test_data["sentence"])
)
# 查看前几行
print(train_data.head())
# 输出:sentence | label | sentence_len
# "..." | 0 | 48
# "..." | 1 | 87
# ...
# 3. 绘制训练集句子长度分布
plt.figure(figsize=(12, 5))
# 3.1 柱状图
plt.subplot(1, 2, 1)
sns.countplot(x="sentence_len", data=train_data)
plt.title("训练集句子长度分布(柱状图)")
# 3.2 密度图
plt.subplot(1, 2, 2)
sns.distplot(train_data["sentence_len"])
plt.title("训练集句子长度分布(密度图)")
plt.show()
# 4. 绘制测试集句子长度分布
plt.figure(figsize=(12, 5))
sns.distplot(test_data["sentence_len"])
plt.title("测试集句子长度分布(密度图)")
plt.show()
# 测试
if __name__ == "__main__":
dm02_len_dist()
6 重难点与易错提醒
- ❗重点:使用
map(lambda x: len(x), sentences)或apply(lambda x: len(x))计算句子长度。 - ⚠️易错:map 返回迭代器,需用
list()转换后赋值给 DataFrame 列。 - 💡深入理解:句子长度分布用于确定固定长度,超过截断,不足补齐(用 0)。
- 💡深入理解:数据分析只查看分布,不做处理,是文本处理前的第一步。
- ❗重点:map 和 apply 两种方法效果一致,任选其一。
7 课堂问答精选
Q1:如何计算每个句子的长度?
A:两种方法:①list(map(lambda x: len(x), train_data["sentence"]));②train_data["sentence"].apply(lambda x: len(x))。两种方法效果一致。
Q2:句子长度分布分析的作用是什么?
A:查看句子长度集中在哪个区间(如 20-250),为后续文本长度规范提供依据。超过固定长度截断,不足用 0 补齐。
Q3:map 和 apply 有什么区别?
A:map 是 Python 内置函数,apply 是 pandas 方法。两者效果一致,apply 更适合 DataFrame 操作。
Q4:补齐一般用什么填充?
A:一般用 0 填充。例如固定长度为 10,当前句子长度为 8,则在末尾补 2 个 0。
8 本课小结
- 句子长度计算:
map(lambda x: len(x), sentences)或apply(lambda x: len(x))。 - 可视化:柱状图(
sns.countplot)+ 密度图(sns.distplot)。 - 分布分析:查看长度集中区间,确定固定长度。
- 截断:超过固定长度截取前面部分。
- 补齐:不足固定长度用 0 填充。
- 数据分析只查看,不做处理。
9 延伸思考
- 如何选择最优的固定长度?
- 截断和补齐对模型性能有什么影响?