Skip to content

Commit

Permalink
update new features
Browse files Browse the repository at this point in the history
  • Loading branch information
pankeyu authored and pankeyu committed Nov 20, 2022
1 parent 34474db commit 6b88509
Show file tree
Hide file tree
Showing 10 changed files with 1,035 additions and 23 deletions.
23 changes: 12 additions & 11 deletions prompt_tasks/p-tuning/class_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,15 @@ def add_batch(self, pred_batch: List[List], gold_batch: List[List]):
添加一个batch中的prediction和gold列表,用于后续统一计算。
Args:
pred_batch (list): 模型预测标签列表, e.g. -> [[0], [0], [1], [2], [0], ...] or [['体', '育'], ['财', '经'], ...]
gold_batch (list): 真实标签标签列表, e.g. -> [[1], [0], [1], [2], [0], ...] or [['体', '育'], ['财', '经'], ...]
pred_batch (list): 模型预测标签列表, e.g. -> [0, 0, 1, 2, 0, ...] or [['体', '育'], ['财', '经'], ...]
gold_batch (list): 真实标签标签列表, e.g. -> [1, 0, 1, 2, 0, ...] or [['体', '育'], ['财', '经'], ...]
"""
assert len(pred_batch) == len(gold_batch), \
f"@params pred_spans_batch(len: {len(pred_batch)}) does not match @param gold_spans_batch(len: {len(gold_batch)})"

pred_batch = [''.join([str(e) for e in ele]) for ele in pred_batch] # 将所有的label拼接为一个整label: ['体', '育'] -> '体育'
gold_batch = [''.join([str(e) for e in ele]) for ele in gold_batch]

if type(gold_batch[0]) in [list, tuple]: # 若遇到多个子标签构成一个标签的情况
pred_batch = [''.join([str(e) for e in ele]) for ele in pred_batch] # 将所有的label拼接为一个整label: ['体', '育'] -> '体育'
gold_batch = [''.join([str(e) for e in ele]) for ele in gold_batch]
self.goldens.extend(gold_batch)
self.predictions.extend(pred_batch)

Expand Down Expand Up @@ -105,12 +106,12 @@ def reset(self):
from rich import print

metric = ClassEvaluator()
# metric.add_batch(
# [['财', '经'], ['财', '经'], ['体', '育'], ['体', '育'], ['计', '算', '机']],
# [['体', '育'], ['财', '经'], ['体', '育'], ['计', '算', '机'], ['计', '算', '机']],
# )
metric.add_batch(
[['财', '经'], ['财', '经'], ['体', '育'], ['体', '育'], ['计', '算', '机']],
[['体', '育'], ['财', '经'], ['体', '育'], ['计', '算', '机'], ['计', '算', '机']],
)
metric.add_batch(
[[0], [0], [1], [1], [0]],
[[1], [1], [1], [0], [0]]
[0, 0, 1, 1, 0],
[1, 1, 1, 0, 0]
)
print(metric.compute())
116 changes: 116 additions & 0 deletions text_classification/class_metrics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# !/usr/bin/env python3
"""
==== No Bugs in code, just some Random Unexpected FEATURES ====
┌─────────────────────────────────────────────────────────────┐
│┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐│
││Esc│!1 │@2 │#3 │$4 │%5 │^6 │&7 │*8 │(9 │)0 │_- │+= │|\ │`~ ││
│├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤│
││ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │{[ │}] │ BS ││
│├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤│
││ Ctrl │ A │ S │ D │ F │ G │ H │ J │ K │ L │: ;│" '│ Enter ││
│├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤│
││ Shift │ Z │ X │ C │ V │ B │ N │ M │< ,│> .│? /│Shift │Fn ││
│└─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴──┬┴───┴┬──┴┬─────┴───┘│
│ │Fn │ Alt │ Space │ Alt │Win│ HHKB │
│ └───┴─────┴───────────────────────┴─────┴───┘ │
└─────────────────────────────────────────────────────────────┘
(多)分类问题下的指标评估(acc, precision, recall, f1)。
Author: pankeyu
Date: 2022/11/20
"""
from typing import List

import numpy as np
from sklearn.metrics import accuracy_score, precision_score, f1_score, recall_score, confusion_matrix


class ClassEvaluator(object):

def __init__(self):
"""
init func.
"""
self.goldens = []
self.predictions = []

def add_batch(self, pred_batch: List[List], gold_batch: List[List]):
"""
添加一个batch中的prediction和gold列表,用于后续统一计算。
Args:
pred_batch (list): 模型预测标签列表, e.g. -> [0, 0, 1, 2, 0, ...] or [['体', '育'], ['财', '经'], ...]
gold_batch (list): 真实标签标签列表, e.g. -> [1, 0, 1, 2, 0, ...] or [['体', '育'], ['财', '经'], ...]
"""
assert len(pred_batch) == len(gold_batch), \
f"@params pred_spans_batch(len: {len(pred_batch)}) does not match @param gold_spans_batch(len: {len(gold_batch)})"

if type(gold_batch[0]) in [list, tuple]: # 若遇到多个子标签构成一个标签的情况
pred_batch = [''.join([str(e) for e in ele]) for ele in pred_batch] # 将所有的label拼接为一个整label: ['体', '育'] -> '体育'
gold_batch = [''.join([str(e) for e in ele]) for ele in gold_batch]
self.goldens.extend(gold_batch)
self.predictions.extend(pred_batch)

def compute(self, round_num=2) -> dict:
"""
根据当前类中累积的变量值,计算当前的P, R, F1。
Args:
round_num (int): 计算结果保留小数点后几位, 默认小数点后2位。
Returns:
dict -> {
'accuracy': 准确率,
'precision': 精准率,
'recall': 召回率,
'f1': f1值,
'class_metrics': {
'0': {
'precision': 该类别下的precision,
'recall': 该类别下的recall,
'f1': 该类别下的f1
},
...
}
}
"""
classes, class_metrics, res = sorted(list(set(self.goldens))), {}, {}
res['accuracy'] = round(accuracy_score(self.goldens, self.predictions), round_num) # 构建全局指标
res['precision'] = round(precision_score(self.goldens, self.predictions, average='weighted'), round_num)
res['recall'] = round(recall_score(self.goldens, self.predictions, average='weighted'), round_num)
res['f1'] = round(f1_score(self.goldens, self.predictions, average='weighted'), round_num)

conf_matrix = np.array(confusion_matrix(self.goldens, self.predictions)) # (n_class, n_class)
for i in range(conf_matrix.shape[0]): # 构建每个class的指标
precision = conf_matrix[i, i] / sum(conf_matrix[:, i])
recall = conf_matrix[i, i] / sum(conf_matrix[i, :])
class_metrics[classes[i]] = {
'precision': round(precision, round_num),
'recall': round(recall, round_num),
'f1': round(2 * precision * recall / (precision + recall), round_num)
}
res['class_metrics'] = class_metrics
return res

def reset(self):
"""
重置积累的数值。
"""
self.goldens = []
self.predictions = []


if __name__ == '__main__':
from rich import print

metric = ClassEvaluator()
# metric.add_batch(
# [['财', '经'], ['财', '经'], ['体', '育'], ['体', '育'], ['计', '算', '机']],
# [['体', '育'], ['财', '经'], ['体', '育'], ['计', '算', '机'], ['计', '算', '机']],
# )
metric.add_batch(
[0, 0, 1, 1, 0],
[1, 1, 1, 0, 0]
)
print(metric.compute())
63 changes: 63 additions & 0 deletions text_classification/data/comment_classify/dev.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
0 (1)这款笔记本外观感觉挺漂亮的,分量吗,对我来说不算沉。 (2)安装了WindowsXP系统后,运行的速度挺快。发热量没有想象中那么大。可能尚未运行很耗资源的程序,没有感到内存的弊病。不过,1G的内存确实有点小。 (3)附赠的包很不错,挺有手感的。但是附赠的鼠标实在是太小了,幸好同时订了一个双飞燕的鼠标哟。
1 什么苹果啊,都没有苹果味,怪怪的味道,而且一点都不甜,超级难吃!
2 价格便宜送货快,质量挺好的
3 当时是因为要写读书报告 所以上网到处抄 就发现这本书感觉以前自己没看过中文版的骆驼祥子就看过电影所以决定买个英文的看看本来以为 是中文翻译过来的 不会太地道结果 令我惊讶翻译的非常好!忠实了原著!很多很多复杂的复合句 而且 用词也很得体觉得 是个 非常不错的拓宽知识面的一本小说推荐!
1 很差的果,表面色泽就已经看到不新鲜啦,跟图片相比,简直一个天一个地,还有烂果,果大细不一致,小到哭。
4 垃圾 垃圾垃圾
4 外表跟图片不太像,而且号码偏大一些,穿着宽松而且裤腿不是很长,除了穿着暖和外还凑合吧,可能我个人试着不太合适
4 不好看,不值这个价钱
5 房间超级小,根本就不值688元的价格,特别是在广州这样一个酒店业十分发达的城市,酒店服务差,入住登记时强调要安静的房间,结果还是给安排在了电梯口。两百米范围内的芸莱斯堡,房价比这便宜,房间也比这大,环境也强很多。打算住两晚的,只住一晚凑合下。下次再也不会选择这家了。
1 脆脆的,甜味可以,可能时间有点长了,水分不是很足。
2 华为机器肯定不错,但第一次碰上京东最糟糕的服务,以后不想到京东购物了。
3 为什么不认真的检查一下, 发这么一本脏脏的书给顾客呢!
4 手感不错,用料也很好,不知道水洗后怎样,相信大品牌,质量过关,五星好评!!!
6 蒙牛除了会造假和抄袭,还会别的不?你妈还纯甄来。
1 苹果有点小,不过好吃,还有几个烂的。估计是故意的放的。差评。
5 房间很宽敞,大床实在是很大,两个大人带个小孩睡着一点儿也不挤,打扫也很干净。站在海景房的阳台上任海风拂面真是很惬意。早餐内容也很丰富,不过性价比不高。但除此之外,就不能要求更多。送餐的食物实在是有失水准,晚上的露天烧烤除了暴贵之外,没留下其它印象。
2 靠,才到就降价很不爽啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!!!!!
4 帮自己的亲亲老公买的 衣裤子摸起来很舒服 老公穿起来帅帅哒 他很喜欢 很满意 我心里也感觉很高兴?? 喜欢的帅哥美女们 快快下手咯
5 是华苑产业园区唯一的酒店,虽说有3星,但总体感觉也就比快捷酒店好一点。
4 京东快递很快,就快递可以,其他就很普通。
5 性价比高的酒店,距离地铁近,邻华师大,环境好。
2 感觉还可以,没有磨损,应该是新机,用一段时间再评论。
4 直接上图。 一起拍下买的两件不同码数的裤子,颜色不同,做工差异很大,一件线头到处都是,一件基本看不到,问客服,客服说工序不同造成的差异???
1 挺不错的苹果,包装结实,物流快
5 1.服务很差,尤其是前台,板着脸不知道谁欠他了 2.下午六点多去入住,房间没打扫,进去后发现一塌糊涂,临时过来打扫。本来已经很累了,还整这么个事情。 3.网络不好,非常不好,无线网页都打开特别慢
5 "很差经。所有酒店人员,总台,总机, 不知谁是客人谁是工作人员。 接待太没有诚意热情好像客人以她们无关。 我自己推行李车到5楼客房却发现房卡不灵 又推车到总台没人说声不好意思。 房间很久地毯很脏电插头也坏。 简直太太差经。 不敢相信这是上海航空开的酒店。 也对携程很生气给我推荐这样的一个烂酒店。 提醒广大旅客们决不要订上海航空酒店浦东机场店。你们定很后悔的。"
2 平板 还是老老实实买iPad吧 各种伤不起
2 平板还不锴使用了一个多星期不怎么卡,就是充电时很郁闷,充电头很热,充电线插进去时很难,感觉是流的……,加油,如果是正的话,还要加油。
5 交通方便,室内干净,基本生活电器都配备。出嫁那天需要红色床单,前晚给前台打了电话,他们回复说要去仓库找下,没想到第二天真给送来并布置好了,态度还不错!
4 诚信很差,骗人
2 不能插手机卡不好用
5 很不错的一家5星级酒店。房间也很干净,就是电视太小,而且离床比较远,看不太清楚。服务人员态度也很好。下次一定会再住。
7 清扬的洗发水用着比较清爽,适合夏天用,男士专用,这个貌似可以用将近一年了……还是蛮划算的。
2 不错,不错,还是蛮好的
4 褪色太严重了用食盐固色还是没有效果!裤子也是不是那种穿着修身的种面料摸这也不怎么样我把送的衣服还你你给我把裤子发好点行吗
5 房内地毯感觉陈旧,楼层与商业楼宇混在一起,不是很好。交通较方便,离地铁口近。
7 京东自营就是好又快!昨天订单,今天送货。喜欢用“沙宣”牌子的洗发水系列,顺滑,好用。用后继续关注的。 若商家再提供手提袋就好了,送朋友很实用哟。 快递员服务好!
2 价格实惠,屏幕大看电影很棒。最没想到的是很省电!!!
4 大小合适。质量和做工都很好!款式也很好看,穿着很休闲!不错。全五星好评!
4 质量差,特别是那商标,割皮肤
4 第二次买,感觉还不错,挺有型的,然后也挺好看的,挺舒服的,然后,嗯,以后还会买的
5 "出行打车不方便,退房等待时间较长,现在好多酒店都实行免等候退房.酒店楼下的广场舞蛮吵的,周边吃饭的店家还是很多的,有24小时的KFC。"
2 我比较倒霉,他们给我一个里面有别人照片的平板给我了
7 都漏了,能不能走点心呀,京东的第一个差评就给你了,大宝贝,再来一瓶的话可以消差评
1 物流太慢了 东西称不足 打开里面还小了一个 吃还是可以 感觉比我们这店里卖的还贵了
2 同样的购买方式购买同样的价格的华为平板,有的赠送贴膜支架和内存卡,有的没有赠送任何东西,有些坑蒙的感觉!
4 差差差差差差差差
5 "交通很方便,附近有很多公交车.房间虽然不大,但很干净,床很硬很舒服,卫生间是小了点.酒店员工对客人很友好.我与大堂经理商量是否可以把退房时间延迟到下午2点钟,他一口就答应了."
2 很划算,今后还会继续购买的!
5 "房间不错, 但服务质素极低,服务员态度生硬,冷淡.入住两晚, 虽然大部份时间都在外游玩, 但也没少看服务员白眼,好象咨询下的士的状况也打扰了该酒店高贵的服务员."
4 618买的,不错,便宜,就是厚了点,估计会热
4 你们快递收件要付费?服务差?
5 刚从三亚回来,在寰岛住了一个晚上,房间刚进去因为是阴面的关系,有点霉味。但是相对于亚龙湾其他酒店的价格来说,还是很具有性价比的!宾馆的服务很好,门口的门迎每次见我们都给我们问好,并把行李一直送到房间里面。酒店离海边很近,走路也就是两分钟。旁边就是亚龙湾海底世界的入口,住在这里方便一些觉得亚龙湾吃东西很贵的人,因为酒店门口西临有个员工餐厅,一份饭也就6元,还不错!比起其他地方动辄几百元的餐费还是很划算的!总体来说寰岛是亚龙湾最具有性价比的酒店了!
4 掉色掉的厉害,洗一次就花了
0 用了一段时间了,赶上硬盘的WD的,没有卡滞现象,温度控制的也不错,总之是一款性价比非常高的本本。
1 上午上班不忙的时候下单的,晚上到住处收到苹果,开箱子洗干净吃了一个。苹果很脆,也很甜,很好吃!包装也很用心,没有磕碰坏了的。所以,我决定给个好评!
5 携程的价格和酒店前台的价格一样。第一天到酒店后没有水果,第二天没有通过携程直接在前台开了一个标间,天天都有水果赠送。早餐还可以,品种够多。晚上没有骚扰电话,但是你如果想被骚扰,可以给按摩中心打电话让人上门按摩。房间内的装修还可以,只是窗户的玻璃与窗框居然有很大的缝隙。总体感觉还是不错,不到三百块钱的价格还可以。
5 岛上没有像样的宾馆,这家马马虎虎过得去。硬件设施很差,没有暖气,最多只能算1+。
7 非常好用,洗完头后感觉很清爽,味道也很好闻
3 "很差劲的一本书,没有任何营养成分...看了会消化不良"
7 买货不发货,垃圾,快递也垃圾!
5 第N次入住了,就是方便去客户那里哈哈。还有啥说的
7 洗完头发打结,超级毛糙,是不是假货?和我屈臣氏买的差距好大
Empty file.
Loading

0 comments on commit 6b88509

Please sign in to comment.