4-2-image-labeling

This commit is contained in:
2509165046
2026-07-02 23:58:26 +08:00
commit 3547566c4b
17 changed files with 428 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

7
data/reviews.json Normal file
View File

@@ -0,0 +1,7 @@
[
{"id": 1, "text": "外卖小哥送得超快,餐盒还是热的,炸鸡酥脆多汁,酸辣粉也很正宗,分量足,五星好评!"},
{"id": 2, "text": "等了一个半小时才送到,汤全洒了,面坨成一坨,联系客服也不回,太让人失望了。"},
{"id": 3, "text": "奶茶是用料很扎实的现煮茶珍珠Q弹有嚼劲配送员态度也好下次还会再点。"},
{"id": 4, "text": "配送速度一般,但披萨味道不错,芝士拉丝效果好,性价比高,值得推荐。"},
{"id": 5, "text": "点的麻辣烫食材不新鲜,有股怪味,吃完拉肚子,商家推卸责任,再也不点了。"}
]

102
q2_1_crawler/move.html Normal file
View File

@@ -0,0 +1,102 @@
[
{
"id": "1",
"title": "泰坦尼克号",
"director": "Frank Darabont",
"year": "2015",
"rating": "6.8",
"duration": "91",
"genre": "科幻",
"actors_count": "3"
},
{
"id": "2",
"title": "星际穿越",
"director": "陈凯歌",
"year": "2021",
"rating": "6.2",
"duration": "113",
"genre": "科幻",
"actors_count": "2"
},
{
"id": "3",
"title": "三傻大闹宝莱坞",
"director": "Robert Zemeckis",
"year": "2004",
"rating": "7.4",
"duration": "95",
"genre": "悬疑",
"actors_count": "4"
},
{
"id": "4",
"title": "阿甘正传",
"director": "James Cameron",
"year": "2013",
"rating": "6.9",
"duration": "93",
"genre": "爱情",
"actors_count": "4"
},
{
"id": "5",
"title": "放牛班的春天",
"director": "宫崎骏",
"year": "2005",
"rating": "7.1",
"duration": "127",
"genre": "悬疑",
"actors_count": "3"
},
{
"id": "6",
"title": "千与千寻",
"director": "Christopher Nolan",
"year": "2024",
"rating": "6.4",
"duration": "147",
"genre": "动画",
"actors_count": "3"
},
{
"id": "7",
"title": "忠犬八公的故事",
"director": "Lasse Hallström",
"year": "2002",
"rating": "6.2",
"duration": "166",
"genre": "剧情",
"actors_count": "4"
},
{
"id": "8",
"title": "霸王别姬",
"director": "Rajkumar Hirani",
"year": "2005",
"rating": "7.9",
"duration": "149",
"genre": "冒险",
"actors_count": "2"
},
{
"id": "9",
"title": "肖申克的救赎",
"director": "Christophe Barratier",
"year": "2008",
"rating": "9.3",
"duration": "91",
"genre": "冒险",
"actors_count": "2"
},
{
"id": "10",
"title": "盗梦空间",
"director": "Christopher Nolan",
"year": "2019",
"rating": "7.1",
"duration": "132",
"genre": "剧情",
"actors_count": "5"
}
]

102
q2_1_crawler/movie.json Normal file
View File

@@ -0,0 +1,102 @@
[
{
"id": "1",
"title": "泰坦尼克号",
"director": "Frank Darabont",
"year": "2015",
"rating": "6.8",
"duration": "91",
"genre": "科幻",
"actors_count": "3"
},
{
"id": "2",
"title": "星际穿越",
"director": "陈凯歌",
"year": "2021",
"rating": "6.2",
"duration": "113",
"genre": "科幻",
"actors_count": "2"
},
{
"id": "3",
"title": "三傻大闹宝莱坞",
"director": "Robert Zemeckis",
"year": "2004",
"rating": "7.4",
"duration": "95",
"genre": "悬疑",
"actors_count": "4"
},
{
"id": "4",
"title": "阿甘正传",
"director": "James Cameron",
"year": "2013",
"rating": "6.9",
"duration": "93",
"genre": "爱情",
"actors_count": "4"
},
{
"id": "5",
"title": "放牛班的春天",
"director": "宫崎骏",
"year": "2005",
"rating": "7.1",
"duration": "127",
"genre": "悬疑",
"actors_count": "3"
},
{
"id": "6",
"title": "千与千寻",
"director": "Christopher Nolan",
"year": "2024",
"rating": "6.4",
"duration": "147",
"genre": "动画",
"actors_count": "3"
},
{
"id": "7",
"title": "忠犬八公的故事",
"director": "Lasse Hallström",
"year": "2002",
"rating": "6.2",
"duration": "166",
"genre": "剧情",
"actors_count": "4"
},
{
"id": "8",
"title": "霸王别姬",
"director": "Rajkumar Hirani",
"year": "2005",
"rating": "7.9",
"duration": "149",
"genre": "冒险",
"actors_count": "2"
},
{
"id": "9",
"title": "肖申克的救赎",
"director": "Christophe Barratier",
"year": "2008",
"rating": "9.3",
"duration": "91",
"genre": "冒险",
"actors_count": "2"
},
{
"id": "10",
"title": "盗梦空间",
"director": "Christopher Nolan",
"year": "2019",
"rating": "7.1",
"duration": "132",
"genre": "剧情",
"actors_count": "5"
}
]

65
q2_1_crawler/q2_1.py Normal file
View File

@@ -0,0 +1,65 @@
import requests
from bs4 import BeautifulSoup as bs
import json
url = 'https://exam.detr.top/exam-b/movies'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36 Edg/149.0.0.0',
'Referer':'https://exam.detr.top/exam-b/movies'}
req = requests.get(url, headers=headers)
req.encoding="utf-8"
data=[]
soup=bs(req.text,"html.parser")
# print(soup)
#id, title, director, year, rating, duration, genre, actors_count
item=soup.select("table tbody tr" )
movie_list=[]
for tr in item:
tds=tr.find_all("td")
tds=list(tds)
# print(tds)
if len(tds)<8:
continue
movie={
"id":tds[0].get_text(strip=True),
"title":tds[1].get_text(strip=True),
"director":tds[2].get_text(strip=True),
"year":tds[3].get_text(strip=True),
"rating":tds[4].get_text(strip=True),
"duration":tds[5].get_text(strip=True),
"genre":tds[6].get_text(strip=True),
"actors_count":tds[7].get_text(strip=True)
}
movie_list.append(movie)
print(movie_list)
with open('movie.json', 'w', encoding='utf-8') as f:
json.dump(movie_list, f, ensure_ascii=False, indent=2)
with open("move.html","w",encoding='utf-8') as f:
json.dump(movie_list, f, ensure_ascii=False, indent=2)
# for i in range(len(items)):
# rank=i+1
# title=items[i].find("span",class_="title").get_text()
# actors=items[i].find("div",class_="bd").get_text().strip()
# try:
# actors=actors.split("主演:")[1].split("\n")[0]
# except:
# actors="无"
# quote=items[i].find("p",class_="quote").get_text().strip()
# data.append({
# "rank":rank,
# "title":title,
# "actors":actors,
# "quote":quote
# })

43
q2_1_crawler/q2_2.py Normal file
View File

@@ -0,0 +1,43 @@
# ① 找出评分最高和最低的电影,打印电影名 + 评分。
# ② 统计各类型的电影数量,用字典格式输出。
# ③ 统计各导演的电影数量,用字典格式输出。
# ④ 统计 2020 年(含)以后上映的电影数量。
import json
with open('movie.json', 'r', encoding='utf-8') as f:
data=json.load(f)
# print(data)
sort_movie=sorted(data,key=lambda x:x["rating"])
min=sort_movie[0]
max=sort_movie[-1]
print("评分最低的电影",min["title"],min["rating"])
print("评分最高的电影",max["title"],max["rating"])
genre_shu={}
for g in data:
ge=g["genre"]
if ge in genre_shu:
genre_shu[ge]+=1
else:
genre_shu[ge]=1
print("各类型的电影数量",genre_shu)
director_shu={}
for d in data:
di=d["director"]
if di in director_shu:
director_shu[di]+=1
else:
director_shu[di]=1
print("各导演的电影数量",director_shu)
a=0
for y in data:
if int(y["year"]) >= 2020:
a+=1
print("2020 年(含)以后上映的电影数量",a)

Binary file not shown.

File diff suppressed because one or more lines are too long

13
q3/q3_3_质量自评.md Normal file
View File

@@ -0,0 +1,13 @@
1.标注前准备:
在图片标注中
1边界框必须紧贴目标物轮廓
2标签必须为 cat、dog、car必须小写英文不能写成"猫/狗/车"或"Cat/Dog/Car"
在文本标注中
1标注必须包含每条评论的 id 和 text 字段
2每个标注必须有一个 sentiment 字段,值为 "正面" 或 "负面"
2.标注过程
在图像的标注中,边界框内的留白较多,解决方法:最大限度地贴近目标轮廓
在文本的标注中,可能会遇到情感模糊的问题,解决办法:抓住关键词进行标注。
3.标注后检查
在图像标注中,再次检查边界框与目标轮廓是否贴合,检查导出的 yolo 文件内容是否完整
在文本标注中,对照关键词检查情感是否判断正确,检查导出的 json文件内容是否完整

33
q4/q4_1/q4_1.py Normal file
View File

@@ -0,0 +1,33 @@
import matplotlib.pyplot as plt
import json
with open('movie.json', 'r', encoding='utf-8') as f:
data=json.load(f)
# print(data)
genre_shu={}
for g in data:
ge=g["genre"]
if ge in genre_shu:
genre_shu[ge]+=1
else:
genre_shu[ge]=1
# print("各类型的电影数量",genre_shu)
genre_lei=list(genre_shu.keys())
genre_liang=list(genre_shu.values())
print(genre_liang)
plt.figure(figsize=(14, 12))
plt.bar(genre_lei, genre_liang, # 类别, 数值
width=0.6) # 柱子宽度0~1之间
# 标题和标签
plt.title('类型电影数量分布', fontsize=14)
plt.xlabel('类型名称', fontsize=12)
plt.ylabel('电影数量', fontsize=12)
plt.show()

BIN
q4/q4_1/q4_1_bar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

24
q4/q4_2/q4_2.py Normal file
View File

@@ -0,0 +1,24 @@
import matplotlib.pyplot as plt
import json
rating=[]
duration=[]
with open('movie.json', 'r', encoding='utf-8') as f:
data=json.load(f)
# print(data)
for i in data:
rating.append(i["rating"])
duration.append(i["duration"])
plt.figure(figsize=(12, 8))
plt.scatter(duration, rating,
c='red',
s=80, # 点的大小
alpha=0.6, # 透明度
edgecolors='white') # 点的边框
plt.title('时长与评分关系散点图', fontsize=14)
plt.xlabel('时长', fontsize=12)
plt.ylabel('评分', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()

BIN
q4/q4_2/q4_2_scatter.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

19
q4/q4_3a/q4_3a.py Normal file
View File

@@ -0,0 +1,19 @@
import matplotlib.pyplot as plt
import json
rating=[]
with open('movie.json', 'r', encoding='utf-8') as f:
data=json.load(f)
# print(data)
for i in data:
rating.append(i["rating"])
plt.figure(figsize=(12,8))
plt.hist(rating, # 数据
bins=3, # 分成几个柱子
color='#3498DB', # 颜色
edgecolor='white') # 柱子边框颜色
plt.title('评分分布', fontsize=14)
plt.xlabel('评分', fontsize=13)
plt.grid(True, linestyle='--', alpha=0.5, axis='y')
plt.show()

BIN
q4/q4_3a/q4_3a_hist.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

19
q4/q4_3b/q4_3b.py Normal file
View File

@@ -0,0 +1,19 @@
import matplotlib.pyplot as plt
import json
duration=[]
with open('movie.json', 'r', encoding='utf-8') as f:
data=json.load(f)
# print(data)
for i in data:
duration.append(i["duration"])
plt.figure(figsize=(12,8))
plt.hist( duration, # 数据
bins=3, # 分成几个柱子
color='#3498DB', # 颜色
edgecolor='white') # 柱子边框颜色
plt.title('时长分布', fontsize=14)
plt.xlabel('时长(分钟)', fontsize=13)
plt.grid(True, linestyle='--', alpha=0.5, axis='y')
plt.show()

BIN
q4/q4_3b/q4_3b_hist.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB