关于simplifyweibo_4_moods数据集的分类问题

本来打算用情感分类数据集拿Transformer模型来练练手,发现训练效果并不好。当我分析了这个数据集的标签后发现问题了:

  1. 查看标签的分布:
python 复制代码
import pandas as pd

# 先直接读取数据,不进行后续处理
data_file = '~/data/simplifyweibo_4_moods.csv'
df = pd.read_csv(data_file)
print(df.head()) 
df['label'].value_counts().sort_index()

输出如下:

复制代码
   label                                             review
0      0  啊呀呀!要死啦!么么么!只穿外套就好了,我认为里面那件很多余啊周小伦喜歡 你各種 五角星的...
1      0  嗯......既然大姚通知了......那我也表示下收到......姚,你知道吗?假如外星人入侵地球,只要摧毁我们的...
2      0                                  风格不一样嘛,都喜欢!最喜欢哪张?
3      0  好呀,试试D .I .Y .去死皮面膜1.将燕麦片加水中浸泡6小时,加入木瓜牛奶搅拌。2.放...
4      0  张老师,谢谢侬的信任!粉丝多少无所谓重在质地近日发现一个现象------他加了你关注,你回加后,他立...
label
0    199496
1     51714
2     55267
3     55267
Name: count, dtype: int64

这样看确实没啥问题,也正如网上所说的,标签的与id的对应是:

复制代码
'喜悦': 0,
'愤怒': 1,
'厌恶': 2,
'低落': 3

但是使用代码:df.drop_duplicates(subset=['review']) 根据评论数据进行过滤,发现标签3消失了。

  1. 查看代码分布:
python 复制代码
from sklearn.model_selection import train_test_split

# 首先检查原始数据中的标签分布
print("原始数据中的标签分布:")
raw_df = pd.read_csv(data_file)
print(raw_df['label'].value_counts().sort_index())
print("原始数据中的唯一标签:", raw_df['label'].unique())

# 检查标签类型
print("\n标签的数据类型:", raw_df['label'].dtype)

# 读取数据并进行基本清洗
print("\n应用数据清洗后:")
df = pd.read_csv(data_file).dropna(subset=['review','label'])
print("1. 删除空值后的标签分布:")
print(df['label'].value_counts().sort_index())

# 删除重复的评论
df = df.drop_duplicates(subset=['review'])
print("\n2. 删除重复评论后的标签分布:")
print(df['label'].value_counts().sort_index())

# 检查是否有label为3的数据
if 3 not in df['label'].unique():
    print("\n警告:数据清洗后没有label为3的数据!")
    # 查找原因:检查label为3的数据是否都有空值或重复
    label3_raw = raw_df[raw_df['label'] == 3]
    print(f"原始数据中label为3的样本数:{len(label3_raw)}")
    label3_null = label3_raw['review'].isna().sum()
    print(f"其中有空值的样本数:{label3_null}")
    
    # 检查是否所有label为3的样本都是重复的
    temp_df = raw_df.dropna(subset=['review','label'])
    label3_after_dropna = temp_df[temp_df['label'] == 3]
    print(f"删除空值后label为3的样本数:{len(label3_after_dropna)}")
    
    # 检查重复情况
    all_reviews = set(temp_df['review'])
    label3_reviews = set(label3_after_dropna['review'])
    unique_label3_reviews = label3_reviews - (all_reviews - label3_reviews)
    print(f"label为3的唯一评论数:{len(unique_label3_reviews)}")
    print(f"label为3的评论与其他标签重复的数量:{len(label3_reviews) - len(unique_label3_reviews)}")

# 确保label列是整数类型
df['label'] = df['label'].astype(int)

# 如果需要保留label为3的数据,可以修改去重策略
# 例如:只在相同标签内去重,而不是跨标签去重
def preserve_label3(raw_df):
    # 按标签分组,然后在每个组内去重
    groups = []
    for label, group in raw_df.dropna(subset=['review','label']).groupby('label'):
        # 在每个标签组内去重
        group_dedup = group.drop_duplicates(subset=['review'])
        groups.append(group_dedup)
    # 合并所有组
    return pd.concat(groups)

# 应用新的去重策略
print("\n使用修改后的去重策略:")
df_preserved = preserve_label3(raw_df)
print(df_preserved['label'].value_counts().sort_index())
print("修改后的唯一标签:", df_preserved['label'].unique())

# 使用修改后的数据集
df = df_preserved

# 查找相同评论对应不同标签的数据
print("\n查找相同评论对应不同标签的数据:")
raw_df_clean = raw_df.dropna(subset=['review','label'])

# 找出重复的评论
duplicate_reviews = raw_df_clean[raw_df_clean.duplicated(subset=['review'], keep=False)]

# 按评论分组,找出每个评论对应的不同标签
review_label_groups = duplicate_reviews.groupby('review')['label'].unique()

# 筛选出有多个不同标签的评论
multi_label_reviews = review_label_groups[review_label_groups.apply(len) > 1]

print(f"有{len(multi_label_reviews)}条评论对应多个不同的标签")

# 显示前10个多标签评论的例子
if len(multi_label_reviews) > 0:
    print("\n以下是前10个多标签评论的例子:")
    for i, (review, labels) in enumerate(multi_label_reviews.items()):
        if i >= 10:
            break
        print(f"评论: {review[:50]}{'...' if len(review) > 50 else ''}")
        print(f"对应的标签: {labels}")
        print("-" * 50)

输出如下:

复制代码
原始数据中的标签分布:
label
0    199496
1     51714
2     55267
3     55267
Name: count, dtype: int64
原始数据中的唯一标签: [0 1 2 3]

标签的数据类型: int64

应用数据清洗后:
1. 删除空值后的标签分布:
label
0    199496
1     51714
2     55267
3     55267
Name: count, dtype: int64

2. 删除重复评论后的标签分布:
label
0    199496
1     51661
2     55169
Name: count, dtype: int64

警告:数据清洗后没有label为3的数据!
原始数据中label为3的样本数:55267
其中有空值的样本数:0
删除空值后label为3的样本数:55267
label为3的唯一评论数:55267
label为3的评论与其他标签重复的数量:0

使用修改后的去重策略:
label
0    199496
1     51714
2     55267
3     55267
Name: count, dtype: int64
修改后的唯一标签: [0 1 2 3]

查找相同评论对应不同标签的数据:
有55318条评论对应多个不同的标签

以下是前10个多标签评论的例子:
评论: !!!!!!!!!!我的胃~ ~ ~ 这个星期你受苦了~ ~ ~ 留口水。。。看着照片,老想家了。。...
对应的标签: [2 3]
--------------------------------------------------
评论: !!!!!!!【今年12星座最终留下啥遗憾】从我遇见你的那天起,我所做的每一件事都是为了接近你。
对应的标签: [2 3]
--------------------------------------------------
评论: !!!!!!!忘了刚梦啥了。再梦一个。
对应的标签: [2 3]
--------------------------------------------------
评论: !!!!!!終 於出了..好想要吖 : 炒起距!闽Α 2还 ?100。颇为贵左d 。
对应的标签: [2 3]
--------------------------------------------------
评论: !!!!!败了。。这个狠。这个...真狠~
对应的标签: [2 3]
--------------------------------------------------
评论: !!!半夜三更饿了什么的最讨厌了
对应的标签: [2 3]
--------------------------------------------------
评论: !!!抽自己,还有什么脸!!!还有什么脸面胖下去T .T 求掉肉那是相当相当的励志太励志了太励志了,...
对应的标签: [2 3]
--------------------------------------------------
评论: !" !一个开头恐怖,中间可笑,结局悲惨的故事:遇见芙蓉姐姐,爱上芙蓉姐姐,娶了芙蓉姐姐
对应的标签: [2 3]
--------------------------------------------------
评论: !~ !~ !~ !~ !忒可爱了,这毛毛腿。每次见到你肥肥的小手,我就想到了铜锣烧。
对应的标签: [2 3]
--------------------------------------------------
评论: !"癌症妈妈"郭雪姣一路走好!让我们记住她的乐观与坚强。【"癌症妈妈"昨天走了让我们记住她的乐观和勇...
对应的标签: [2 3]
--------------------------------------------------

可以看出标签3就是一个摆设,这个数据集就是一个三分类的数据集,而不是四分类的。

请大家注意一下。

相关推荐
Draina1 小时前
CBC填充预言攻击-CBC Padding Oracle Crypto Attack
python·安全·web安全·网络安全·密码学·安全性测试
Angel Q.1 小时前
特征提取 | DINO 到 DINOv3
图像处理·python
不如语冰2 小时前
AI大模型入门-pytorch-张量2 tensor创建
python
NPE~2 小时前
[AI]Agent开发——ADK框架使用
人工智能·python·ai·教程·adk·agent开发
矮个史蒂芬2 小时前
统计verilog .v文件中output 的bit数
python
gwf2162 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
爱吃提升3 小时前
python 分布式爬虫、爬虫合规与综合实战项目
分布式·爬虫·python
审小匠OpenCPAi3 小时前
银行流水核查怎么自动化?单边匹配、双向勾稽与图聚类异常检测的工程对比
java·前端·人工智能·python·审计
元Y亨H4 小时前
Pandas 解析 Excel 导致的内存溢出(MemoryError)
python·excel
金銀銅鐵5 小时前
[Python] 用 turtle 来绘制瑞典国旗
python