【更新】囚生CYのMemo(20231118~)

2023-12-14 22:59
文章标签 更新 memo 囚生 cy 20231118

本文主要是介绍【更新】囚生CYのMemo(20231118~),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 20231118
  • 20231119~20231120
  • 20231121~20231123
  • 20231124
  • 20231125
  • 20231126
  • 20231127~20231129
  • 20231130~20231201
  • 20231202
  • 20231203
  • 20231204~20231206
  • 20231207~20231209
  • 20231210~20231211
  • 20231212~20231214


20231118

  • 日常八点醒,但天气转冷并不想早起(其实这周四周五都差点迟到,都是因为天冷赖床,本来每天赶8点53分的车,还有一班8点56分兜底,周四连后者都错过了,结果9点30分30秒险些没打到卡,周五是因为在18号线上发消息坐过站到迎春路,当时慌得一批,想想还是只能回头转9号线,好在9点29分多打到卡),吃点东西回去睡回笼觉,结果第二次醒来已是十二点,下午还要陪嘉伟拉长距离,赶紧收拾东西去学校。
  • 阳光明媚,6~12℃,最喜欢冬天这样的天气,感觉有用不完的力量。陪嘉伟做上马前最后一次30km拉练,我只跟随了前15km,配速4’44",心率155bpm,对我来说是很满意的数据,因为周四蛙跳没热身,大腿酸痛得厉害,并不想太苛求自己跑更多。事实上现在我压住75%的最大心率就可以达到4’45"左右的配速,远远优于之前的水平,跑得非常轻松,12km后依然可以轻松聊天,如果不是因为跑前已处战损状态,这样的天气我能一路跑到天黑。
  • 不熟悉马拉松的人可能不知道,半马和全马是两种完全不同的运动,前者对于我们这样的业余跑者是可以一口气不补给不停歇地冲下来,与普通跑个10km并没有太大区别,无非是配速慢10~15秒。但是全马过了30km,任何人,哪怕是最顶尖的职业运动员,都会极其痛苦,因为30km之后所有人体内储存的糖原都消耗殆尽,能量补充大多来源于脂肪,但此时距离终点还有10km以上的路程,这是最令人绝望的一段路程。都说马拉松从30km才刚刚开始,绝大多数业余跑者30km之后配速会显著下降。如果这段遇到长上坡、过大桥,很可能就会转为走走停停,因为意志一旦被冲垮,就很难重建。
  • 我也认为全马是反人类的项目,但是终有一天我也一定会完赛全马。后AK时代,嘉伟是第一个将要参加全马的学生,首马即上马,壮志凌云,剑指破三,当共勉之。

m3e-base的中文嵌入效果确实是非常好,最近直接拿来不作任何微调,就可以把很脏的招聘信息title直接匹配到职业大典里的标准职业字段,精确度非常高,远远超过之前用的许多基于规则以及应用序列距离的方法。另外还有两个近期的中文预训练模型也很不错,bge和stella,但是模型比m3e大很多,m3e基本上只有半个标准BERT的大小,CPU上也能跑得很快。

最后,该死的textarea问题终于解决:

# -*- coding: utf-8 -*-
# @author: caoyang
# @email: caoyang@163.sufe.edu.cnimport os
import re
import time
import logging
import requestsfrom bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditionsclass BaseCrawler:tag_regex = re.compile(r"<[^>]+>|\n|\t")global_timeout = 60global_interval = 300chrome_user_data_path = r"C:\Users\caoyang\AppData\Local\Google\Chrome\User Data"# Convert request headers copied from Firefox to dictionary@classmethoddef headers_to_dict(cls, headers: str) -> dict:lines = headers.splitlines()headers_dict = {}for line in lines:key, value = line.strip().split(':', 1)headers_dict[key.strip()] = value.strip()return headers_dict# Easy use of WebDriverWait@classmethoddef check_element_by_xpath(cls, driver, xpath, timeout=30):WebDriverWait(driver, timeout).until(lambda _driver: _driver.find_element_by_xpath(xpath).is_displayed())# @param method: e.g. GET, POSTdef easy_requests(self, method, url, **kwargs):while True:try:response = requests.request(method, url, **kwargs)breakexcept Exception as e:logging.warning(f"Error {method} {url}, exception information: {e}")logging.warning(f"Wait for {self.global_interval} seconds ...")time.sleep(self.global_interval)return response# Initialize driverdef initialize_driver(self, browser="chrome", headless=True, timeout=60, **kwargs):browser = browser.lower()assert browser in ["chrome", "firefox"], f"Unknown browser name: {browser}"return eval(f"self._initialize_{browser}_driver")(headless, timeout, **kwargs)# Initialize Google Chrome driverdef _initialize_chrome_driver(self, headless, timeout, **kwargs):chrome_options = webdriver.ChromeOptions()		chrome_options.add_argument(f"user-data-dir={self.chrome_user_data_path}")	# Import user dataif headless:chrome_options.add_argument("--headless")driver = webdriver.Chrome(chrome_options=chrome_options)driver.set_page_load_timeout(timeout)if not headless:driver.maximize_window()return driver# Initialize Mozilla Firefox driverdef _initialize_firefox_driver(self, headless, timeout, **kwargs):options = webdriver.FirefoxOptions()if headless:options.add_argument("--headless")driver = webdriver.Firefox(options=options)driver.set_page_load_timeout(timeout)if not headless:driver.maximize_window()return driver# Get cookies by driverdef get_cookies(self, url, driver=None, browser="chrome"):quit_flag = Falseif driver is None:# If there is no driver passedquit_flag = Truedriver = self.initialize_driver(browser=browser, headless=True, timeout=30)driver.get(url)cookies = driver.get_cookies()def _cookie_to_string(_cookies):_string = str()for _cookie in _cookies:_name = _cookie["name"]_value = _cookie["value"].replace(' ', '%20') # %20 refers to space char in HTML_string += f"{_name}={_value};"return _string.strip()if quit_flag:driver.quit()return _cookie_to_string(cookies)class ChatGLMCrawler(BaseCrawler):urls = {"home": "https://chatglm.cn/main/detail",	# Home URL}layout_xpaths = {"input-box"			: "//textarea[@class=\"scroll-display-none\"]",					# XPath of the input box for human# "input-box"			: "//div[@class=\"input-box-inner\"]",							# XPath of the input box for human (div tag cannot be interacted)"send-button-1"		: "//img[@class=\"enter_icon\"]",								# XPath of the button to send text of input box"send-button-2"		: "//div[@class=\"enter\"]",									# XPath of the button to send text of input box"chat-area"			: "//div[@id=\"session-container\"]",							# XPath of the chat area which contains all the talks (consist of several chat boxes)"human-box"			: "//div[@class=\"pr\"]",										# XPath of human chat box"ai-box"				: "//div[@class=\"answer-content-wrap\"]",						# XPath of AI chat box"ai-box-text"			: "//div[@class=\"markdown-body\"]",							# XPath of the text contained in AI chat box"create-new-button"	: "//div[@class=\"new-session-button\"]",						# XPath of create new talk"like-or-dislike-area"	: "//div[@class=\"interact-operate\"]",							# XPath of div tag contains like and dislike icons"delete-session"		: "//span[@class=\"btn delete\"]",								# XPath of button to delete old talk}forbidden_strings = []def __init__(self):super(ChatGLMCrawler, self).__init__()# @param driver		: WebDriver object# @param prompt		: The question you would like to ask AI# @param model_name	: One of the key in `model_card_xpath`, e.g. "chatgpt3.5(16k)"def request(self, driver, prompt, first_trial=True):prompt = prompt.replace('\n', "\\n")if first_trial:driver.get(self.urls["home"])self.check_element_by_xpath(driver, xpath=self.layout_xpaths["input-box"], timeout=60)		# Check if input box is renderedself.check_element_by_xpath(driver, xpath=self.layout_xpaths["send-button-1"], timeout=60)	# Check if send button is renderedself.check_element_by_xpath(driver, xpath=self.layout_xpaths["send-button-2"], timeout=60)	# Check if send button is rendered# Delete old talktry:driver.find_element_by_xpath(self.layout_xpaths["delete-session"]).click()logging.info("Delete old talk ...")except:logging.info("No old talk found ...")# Requestlogging.info("Prompt ...")try:## Method 1: Use `element.send_keys`driver.find_element_by_xpath(self.layout_xpaths["input-box"]).send_keys(prompt)	# Input the given promptlogging.info("  - ok!")except:# ## Method 2: Use Javascript with one auguments (Fail)# js = """var txt = arguments[0]; document.getElementsByTagName("textarea")[0].value = txt;"""		# driver.execute_script(js, prompt)# logging.info("  - Use Javascript to input ...")# # Method 3: Use Javascript with event dispatch (Fail)# js = """var elm = arguments[0], txt = arguments[1]; elm.value += txt; elm.dispatchEvent(new Event('change'));"""# element = driver.find_element_by_xpath(self.layout_xpaths["input-box"])# driver.execute_script(js, element, prompt)# logging.info("  - Use Javascript to input ...")# # Method 4: Use keyboard operation (Success)# import pyperclip# pyperclip.copy(prompt)# time.sleep(1)# driver.find_element_by_xpath(self.layout_xpaths["input-box"]).send_keys(Keys.CONTROL, 'v')# logging.info("  - Use keyboard to input ...")# Method 5: Use Javascript with DispatchEvent (Success)js = """var txt = arguments[0];const textarea = $("textarea");var nativeTextAreaValueSetter = Object.getOwnPropertyDescriptor(window.HTMLTextAreaElement.prototype, "value").set;nativeTextAreaValueSetter.call(textarea, txt);const event = new Event("input", {bubbles: true});textarea.dispatchEvent(event);"""driver.execute_script(js, prompt)logging.info("  - Use Javascript to input ...")while True:# The button is dynamic and sometimes fail to click ontry:driver.find_element_by_xpath(self.layout_xpaths["send-button-1"]).click()		# Click on the button to send the promptlogging.info("Use send button 1 ...")breakexcept:try:driver.find_element_by_xpath(self.layout_xpaths["send-button-2"]).click()	# Click on the button to send the promptlogging.info("Use send button 2 ...")breakexcept:logging.info("Use send button error ...")raise Exception("Use send button error ...")# Wait for responseself.check_element_by_xpath(driver, xpath=self.layout_xpaths["chat-area"], timeout=30)	# Check if chat area is renderedself.check_element_by_xpath(driver, xpath=self.layout_xpaths["human-box"], timeout=30)	# Check if human chat box is renderedself.check_element_by_xpath(driver, xpath=self.layout_xpaths["ai-box"], timeout=30)		# Check if AI chat box is renderedfinish_flag = True	# Indicating if AI generation is finishedwhile finish_flag:try:# If like or dislike appear, then stopdriver.find_element_by_xpath(self.layout_xpaths["like-or-dislike-area"])finish_flag = Falseexcept:ai_box_text = driver.find_element_by_xpath(self.layout_xpaths["ai-box-text"])						# Find AI response text element# ai_box_text = driver.find_element_by_xpath(self.layout_xpaths["ai-box"])							# Find AI response text elementai_box_text_inner_html = ai_box_text.get_attribute("innerHTML")										# Get inner HTML of the elementresponse = self.tag_regex.sub(str(), ai_box_text_inner_html).strip("\n\t ").replace('\n', '\\n')	# Process response textforbidden_flags = [forbidden_string in response for forbidden_string in self.forbidden_strings]if sum(forbidden_flags) > 0:# It indicates that a forbidden string occursfinish_flag = False# Extract AI response textai_box_text = driver.find_element_by_xpath(self.layout_xpaths["ai-box-text"])	# Find AI response text elementai_box_text_inner_html = ai_box_text.get_attribute("innerHTML")					# Get inner HTML of the elementresponse = self.tag_regex.sub(str(), ai_box_text_inner_html).strip("\n\t ")		# Process response textreturn response# @param data_path: EXCEL file of job descriptions# @param save_path: file path for storing AI response# @param model_name: defined in model_card_xpathsdef demo(self, model_name="chatgpt3.5(16k)"):driver = self.initialize_driver(browser="chrome", headless=False, timeout=60)driver.implicitly_wait(15) # prompt = "给我讲述一下《基督山伯爵》的故事,500字左右。"response = self.request(driver, prompt)with open(f"d:/answer-chatglm.txt", 'w', encoding="utf8") as f:f.write(response)time.sleep(5)driver.quit()if __name__ == "__main__":crawler = ChatGLMCrawler()crawler.demo()

20231119~20231120

  • 昨天擦眼镜把眼镜擦断了,从鼻梁架中间断成两截,去年暑期在丹阳眼镜城买的,戴了一年多,真是假冒伪劣,每次店家都说镜架是钛合金还是啥,绝对够硬,那家店叫司徒吧。还好当时一起买了副备用的,结果找到它带上觉得度数特别深,晕得很,真是纳了闷,一起配的眼镜怎么度数还有差别呢… 本来坏掉的这副是可以折叠镜腿,专门买来跑步戴的,后来嫌麻烦不想换来换去就一直带的这副,现在坏了以后就只好不带眼镜跑了。想搞个那种橙色的护目镜,看起来贼好看,看AK跑步经常戴,像超人一样。
  • 今日跑休,周末两天练到位,昨天也干了16圈,从4’50"加速到3’30",均配4’23",真的很舒服,冬天只要跑5圈热起来,后面就是怎么跑都不会累。(现在吊杆一分钟比较轻松了,在试着拉一拉,好想有一天能拉起一个引体向上)
  • Rebuttling… 9月投稿又到开奖时刻…
  • 半年没登微博,午休没忍住看了一眼,原来天池就在杭州,这么近,我还以为在东北。看起来真的很棒,年轻就应该多出去看一看,等我顺利毕业后,我一定要抽一段时间认真训练,去跑个越野赛,看看不同的风景,年轻时要是做不到,等老了只能望山兴叹了。

编辑距离与bleu-score计算(为什么Levenshtein包算编辑距离这么慢,还不如自己写个带cache的递归函数):

import gc
from functools import lru_cache
from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction# 编辑距离
def calc_edit_distance(a, b):@lru_cache()def _easy_distance(i, j):if min(i, j) == 0:return max(i, j)else:return min(_easy_distance(i - 1, j) + 1, _easy_distance(i, j - 1) + 1, _easy_distance(i - 1, j - 1) + (a[i - 1] != b[j - 1]))return _easy_distance(len(a), len(b))def calc_bleu_score(reference, candidate):# return sentence_bleu(reference, candidate, weights=(.5, .5), smoothing_function=SmoothingFunction().method1)return sentence_bleu(reference, candidate, weights=(.25, .25, .25, .25), smoothing_function=SmoothingFunction().method1)

关于sentence_bleu里的平滑函数,没有细看,但是一般是用method1,用于平滑掉分母是零的情况。


20231121~20231123

  • 最近两天很疲劳,另一副眼镜度数应该是一样的,但就是带得很累,我走路和在地铁上都得把眼镜摘了才舒服些。
  • 诸事不利,前天晚上回去又找不到钥匙开门(这已经是搬完家两个月里第二次找不到钥匙了),想想回来在学校走了好多地方,可能在操场也可能在食堂,时间太晚只能第二天早上去找。第二天觉得还是先去最后接水的地方大活看了一下,结果一下子就在水箱旁边的洗手台上找到了。(因为我上一次找不到钥匙也是丢在大活厕所的洗手台上,不知道为什么总是丢在这个位置…)
  • 昨天升温,晚上短裤上了点强度,4’10"均配跑了5km(前2k是4’25",后面冲的4分配)。前天陪董祖浩摇了5km,穿的羊毛裤瞎跑跑,但是董祖浩可不是瞎跑啊,4’30"配速跑了10km,我是跟了他最后5km,而且看他嘴巴紧闭,只用鼻子呼吸,这是有bear而来啊,这小子以前练短跑的,高百填预计成绩填个55分钟,结果正赛跑了47分半,不过就前晚这情况看,跑进45分钟绰绰有余,能跑到四十二三分也不奇怪,小伙子高百肯定还是放水了。
  • 距离上马还有不到三天,起点很近在外滩,但终点在徐家汇体育公园,有些远,我要是起得来就去接一下嘉伟和吴安迪,他俩昨晚一起遛了会儿,没有碰到我,吴安迪看起来状态很好,小伙子又帅气跑得又稳,预计能到315,嘉伟自然还是奔着破三去跑,但是全马变数太多了,能匀速跑完全程就已经是一种奢求,大多数人30km后都会掉速很多,所以我也很想能在终点给他们单独拍点照片,毕竟首马对于每一个跑者都是很神圣的事情,何况首马是在上马。说实话还是挺想跟他们一起参加上马,可是时间、身体、精力都难以维持,而且中签率太低。

EXCEL统计单元格内某个字符出现次数的方法:LEN(A2)-LEN(SUBSTITUTE(A2,"-",""))

饼图绘制:

import matplotlib.pyplot as plt
plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1,startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)
  1. x即每个扇形的占比的序列或数组
  2. explode如果不是None,则是一个len(x)长度的数组(float类型),指定每一块的突出程度(每个扇形会沿着离心方向突出);突出显示,设置每一块分割出来的间隙大小
  3. labels为每个扇形提供标签的字符串序列
  4. colors为每个扇形提供颜色的字符串序列
  5. autopct如果它是一个格式字符串,标签将是fmt % pct。如果它是一个函数,它将被调用。它的默认值是每个扇片的百分比数,你可以做一些修正
  6. shadow阴影
  7. startangle从x轴逆时针旋转,饼的旋转角度
  8. pctdistance, default: 0.6每个饼片的中心与由autopct生成的文本的开头之间距离与半径的比率,大于1的话会显示在圆外
  9. labeldistance, default: 1.1饼状图标签绘制时的径向距离(我认为这个也与8类似是个比率)。如果设置为None,则不绘制标签,而是存储在图例中使用。

20231124

  • 昨晚均配4’45"慢摇20圈,平均心率150bpm,这是最舒适的区间,哪怕再累这样跑都是极其轻松愉悦的。如今核心稳定,上半身几乎不晃,视野保持静止。跑了四年,终于能看起来跑得轻松。今晚去小姨家补一下,明天陪嘉伟做最后的准备,虽然我不参赛,但真的很想跑一次全马。
  • 早上帮宝玺姐一起下去寄件,完事在小邮局她又收了一封明信片,我觉得现在寄明信片的人已经很少了,问她是谁寄来的,告诉我是她在武汉的时候寄给上海的自己,是个有趣的人呐。
  • 本来下午要给步执汇报,结果他儿子发烧,请假回家照顾,听步执说家里好几个都发烧了,又是流感季,我现在出门都会带口罩,但是晚上在宿舍都是赤膊短裤干到十二点,运气不错,没有感冒。
  • 看聊天记录上一次已是4月8日,其实每次都觉得熟悉又陌生,大半年没有见,但彼此似乎都摸得清对方的近况,却害怕失去而心照不宣,默而不语。年前或许能再见一面吗?再别无奢求。

numpy基于余弦相似度的快速计算与排序代码片段,比如两个矩阵作product的计算相似度,循环就太费事了:

sent_embeddings = model.encode(sents) 				# (n_sents, 768) 一般为 (buffer_size, 768) 最后一个少点
n_sents = sent_embeddings.shape[0]
sent_emb_norms = norm(sent_embeddings, axis=1)												# (n_sents, 768)
dot_res = np.dot(sent_embeddings, occupation_embeddings.T)									# (n_sents, n_occ)
norm_matrix = np.dot(sent_emb_norms.reshape(n_sents, 1), occ_emb_norms.reshape(1, n_occ))	# (n_sents, n_occ)
cosine_matrix = dot_res / norm_matrix														# (n_sents, n_occ)W
argsort_res = np.argsort(cosine_matrix)												# (n_sents, N_OCCUPATION)

20231125

  • 周六依然是好天气,今天只是稍微出力,就把5000米跑到20分钟整,其实并没有奔着跑成绩,只是想比平时养生快一点,但前4000米就跑到了16’12",并不累,但是想想可以试试能不能自己一个人跑进20分钟,所以第5个1000米就加速冲了一下,3’48",刚好20分钟整,平均心率171bpm。身体各方面素质上去之后,即便平时不上强度,也依然可以有提升。跑完补了10圈慢跑,4’45"配速,很舒畅。
  • 明日计划七点一刻出门,骑车赶往25k江滨路瑞宁路处的上财私补点等嘉伟和吴安迪,等他们38k折返回来陪着一起到终点前给他们拍照。宋某人纯懒怂,赖床上都不想来为嘉伟加油,他在田径队群里的昵称是陈嘉伟粉丝,我的是陈嘉伟老粉,他就一纯假粉。
  • 我是看着嘉伟从本科入学一步一步走到今天的,很高兴与自己一起训练的朋友即将冲击首马破三,将来有一天我也能做到的,一定。
2、expected_conditions模块常用类
title_is(title)
title_is(title)判断网页title是否是特定文本(英文区分大小写),若完全相同则返回True,否则返回False。
title_contains(title)
title_contains(title)判断网页title是否包含特定文本(英文区分大小写),若包含则返回True,不包含返回False。
presence_of_element_located(locator)(重点,常用)
presence_of_element_located(locator)判断一个元素存在于页面DOM树中,存在则返回元素本身,不存在则报错。
locator为一个(by, path)元祖,这个(by, path)的by是Selenium的一个类selenium.webdriver.common.by.By,包括CLASS_NAME,CSS_SELECTOR,ID,LINK_TEXT,NAME,PARTIAL_LINK_TEXT,TAG_NAME和XPATH,和我们8种基本元素定位中使用的方法相同。
presence_of_all_elements_located(locator)
presence_of_all_elements_located(locator)判断定位的元素范围内,至少有一个元素存在于页面当中,存在则以list形式返回元素本身,不存在则报错。
visibility_of_element_located(locator)
visibility_of_element_located(locator)判断特定元素是否存在于DOM树中并且可见,可见意为元素的高和宽都大于0,元素存在返回元素本身,否则返回False。
这个类和presence_of_element_located(locator)有点像,但后者只强调元素存在于DOM树中,可见不可见无所谓,而前者要求必须高和宽必须都大于0,因此后者在性能上会稍微快一点点。
visibility_of(element)
visibility_of(element)同上面visibility_of_element_located(locator),不过参数从locator的元组变为元素。
invisibility_of_element_located(locator)
invisibility_of_element_located(locator)判断元素是否隐藏。
text_to_be_present_in_element(locator,text)
text_to_be_present_in_element(locator,text)判断给定文本是否出现在特定元素中,若存在则返回True,不存在返回False。
text_to_be_present_in_element_value(locator,text)
text_to_be_present_in_element_value(locator,text) 判断某文本是否是存在于特定元素的value值中,存在则返回True,不存在则返回False,对于查看没有value值的元素,也会返回False。
frame_to_be_available_and_switch_to_it(locator)
frame_to_be_available_and_switch_to_it(locator) 判断某个frame是否可以切换过去,若可以则切换到该frame,否则返回False 。
element_to_be_clickable(locator)
element_to_be_clickable(locator)判断某元素是否可访问并且可启用,比如能够点击,若可以则返回元素本身,否则返回False。
staleness_of(element)
staleness_of(element)判断某个元素是否不再附加于于DOM树中,不再附加的话返回True,依旧存在返回False。可以用于判断页面是否刷新了。
alert_is_present
alert_is_present判断alert是否存在,若存在则切换到alert,若不存在则返回False。
element_to_be_selected(element)
element_to_be_selected(element) 判断某元素是否被选中。
element_located_to_be_selected(locator)
element_located_to_be_selected(locator) 判断某元素是否被选,locator为一个(by, path)元祖。
element_selection_state_to_be (element, is_selected)
element_selection_state_to_be (element, is_selected)判断某元素的选中状态是否与预期相同,相同则返回True,不同则返回False。
element_located_selection_state_to_be(locator, is_selected)
element_located_selection_state_to_be(locator, is_selected) 判断某元素是否与预期相同,相同则返回True,不同则返回False,locator为一个(by, path)元祖。
总结:这些方法与WebDriverWait类和 until()、until_not()方法组合能使用,够实现很多判断功能,如果能自己灵活封装,将会大大提高脚本的稳定性。

20231126

  • 2:59:15,首马破三,他做到了。全中国全马有破三能力的人大约有5000,许多人究其一生练不到破三水平,首马破三,可以算是地区一哥的水平了。
  • 今天差不多骑行了40km,跑了10km,突破重重封锁终于抵达了赛道38km处,陪跑了最后4km,见证了这个传奇的诞生。
  • 崔洲宸3:43:14(违规完赛,他报的是10km健康跑,但是偷偷跟着大部队跑到了全马终点),吴安迪3:45:50(小伙子还是没能顶住),两个人都是25km之后跑崩,只能走走停停,事实上两个人的5k和10k差距非常大,但是全马就是最好的有氧能力鉴别器。嘉伟是到35km后跑崩,但即便是跑崩也维持了4’30"以内的配速,天赋可见一斑。照目前的心率水平来说,我是有能力以4’45"的配速跑完全马的,对标的成绩是3小时20分,至少开3小时半是没有问题的。
  • 下一次,该轮到我了。

关于捕获元和findall函数返回结果的关系

  1. 如果不带捕获元,那么regex.findall(string)的结果将是一个纯列表,返回所有匹配的结果(str),但是注意这些结果在string中是不overlap,如果想要匹配所有overlap的结果,我不知道怎么做,match函数不是很能搞得明白,可能只能在正则上下功夫。
  2. 如果带捕获元,那么findall返回的结果仍是列表,但每个元素是tuple,包含每个捕获元的结果。
  3. 这里特别的是捕获元在findall结果中出现的次序,如果是不嵌套的,那么很简单,按顺序出现,如果嵌套,则按照层次遍历顺序出现,如((regex1)(regex2))(regex3),返回的结果是(regex1regex22, regex1, regex2, regex3)

20231127~20231129

  • 这周前三日太累,状态不好,周一13圈(@455),周二15圈(@444),下班没时间换衣服,穿牛仔裤厚底鞋跑,平均心率都快到160bpm了,尤其是周一,跑的很慢但都觉得累。昨天本来约了AK下班8点半去跑,结果我一直拖到8点半才走,最后AK只是在小区跑了会儿,我确实也累得不行,但还是从9.25跑到操场关门。今天带了换的裤子,准备认真摇一会儿。
  • 昨晚本来跟AK约了下班回来跑的,结果都加到好晚,我9点20分才到操场,疲劳得不行,但还是跑到操场关门,拉了会儿引体,现在勉强能提一些上去了。
  • 高百全国总决赛拉开序幕(12.16,地点位于上海徐汇滨江),今年因为上海站成绩特别好(其实我们的总时间在上海站只能排20名,到其他站依然是能进前8的,上海站今年主要是高手来的太多,别的站40分台稳进前100,上海站只能排到250名开外),所以我们还是可以报名参加全国总决赛,总决赛的形式是16km×10人的接力(分两组各5人同时出发,关门时间为6个小时,意味着平均每人至少跑进1小时12分,均配4’30"),其中至少包含2名女生,如果只是8个男生的话,马协还是可以凑出来的,全马sub250的人就有不少(现役第一人是09级经济的李朝松,上个月合肥全马232PB,历史第二人应该就是AK了,PB237,但目前处于复健状态,此外须任荣,郑俊荣,俞国峰,葉凯浩,信欣都是250左右的选手),破三的人就更多了,女子全马接近国一水平的还有3个人。但是日期和杭马(12.17)略有冲突,而且和在校生期末考试周也有冲突,之前听吴安迪说,上海站决赛时浙大好几个大一大二的学生就是因为期中考试来不了。
  • 如果最强的一批阵容真的凑齐,必然豪华无比,嘉伟都排不进前五,万米40分台选手只能担任替补,值得期待。

关于teacher forcing

这个点之前被忽略了。简而言之,对于自回归的生成任务,比如训练样本为:

X = ( x 1 , x 2 , x 3 , . . . , x n ) X = (x_1, x_2, x_3, ...,x_n) X=(x1,x2,x3,...,xn)

f θ f_\theta fθ是模型,常规的RNN自回归训练流程相当于:

x ^ 1 = x 1 x ^ 2 = f θ ( x ^ 1 ) x ^ 3 = f θ ( x ^ 1 , x ^ 2 ) x ^ 4 = f θ ( x ^ 1 , x ^ 2 , x ^ 3 ) . . . x ^ n = f θ ( x ^ 1 , x ^ 2 , x ^ 3 , . . . , x ^ n − 1 ) \begin{aligned} \hat x_1 &= x_1\\ \hat x_2 &= f_\theta(\hat x_1)\\ \hat x_3 &= f_\theta(\hat x_1, \hat x_2)\\ \hat x_4 &= f_\theta(\hat x_1, \hat x_2, \hat x_3)\\ & ...\\ \hat x_n &= f_\theta(\hat x_1, \hat x_2, \hat x_3, ..., \hat x_{n -1}) \end{aligned} x^1x^2x^3x^4x^n=x1=fθ(x^1)=fθ(x^1,x^2)=fθ(x^1,x^2,x^3)...=fθ(x^1,x^2,x^3,...,x^n1)

这样的问题是因为每一步用的都是预测出来的token(即 x ^ i \hat x_i x^i)进行下一步预测,很容易使得偏差大,所以一般会改为

x ^ 1 = x 1 x ^ 2 = f θ ( x 1 ) x ^ 3 = f θ ( x 1 , x 2 ) x ^ 4 = f θ ( x 1 , x 2 , x 3 ) . . . x ^ n = f θ ( x 1 , x 2 , x 3 , . . . , x n − 1 ) \begin{aligned} \hat x_1 &= x_1\\ \hat x_2 &= f_\theta(x_1)\\ \hat x_3 &= f_\theta(x_1, x_2)\\ \hat x_4 &= f_\theta(x_1, x_2, x_3)\\ & ...\\ \hat x_n &= f_\theta(x_1, x_2, x_3, ...,x_{n -1}) \end{aligned} x^1x^2x^3x^4x^n=x1=fθ(x1)=fθ(x1,x2)=fθ(x1,x2,x3)...=fθ(x1,x2,x3,...,xn1)

这样的好处是让模型更好的学习数据固有的模式,能够更好的收敛与控制模型的输出,但缺少泛化性能。


20231130~20231201

  • 国定三个食堂的砂锅全一个味道,怀念六七年前盛环的肥牛砂锅,好吃不贵,可惜只吃了不到两年就连人带锅搬到隔壁。
  • 昨天下午嘉伟给他们带了7组1200米间歇,宋某也去练了,3组跑到330配速,4组350左右,慢的组大概是为了照顾女生,他们几个女生确实也很长时间不上强度了,明天就要比赛属于是临时抱佛脚,去年他们花了两三周系统训练的,今年纯赶鸭子上架。
  • 大降温,昨晚6000米,4’09"配速,心率162bpm,很是舒适,最大摄氧量重回60,很舒适的天气,周末准备带宋某上长距离。

BGE模型的效果卓著,非常好,建议使用。

可使用FlipEmbedding或SentenceBert使用

from FlagEmbedding import FlagModel
sentences_1 = ["样例数据-1", "样例数据-2"]
sentences_2 = ["样例数据-3", "样例数据-4"]
model = FlagModel('BAAI/bge-large-zh-v1.5', query_instruction_for_retrieval="为这个句子生成表示以用于检索相关文章:",use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation
embeddings_1 = model.encode(sentences_1)
embeddings_2 = model.encode(sentences_2)
similarity = embeddings_1 @ embeddings_2.T
print(similarity)# for s2p(short query to long passage) retrieval task, suggest to use encode_queries() which will automatically add the instruction to each query
# corpus in retrieval task can still use encode() or encode_corpus(), since they don't need instruction
queries = ['query_1', 'query_2']
passages = ["样例文档-1", "样例文档-2"]
q_embeddings = model.encode_queries(queries)
p_embeddings = model.encode(passages)
scores = q_embeddings @ p_embeddings.Tfrom sentence_transformers import SentenceTransformer
sentences_1 = ["样例数据-1", "样例数据-2"]
sentences_2 = ["样例数据-3", "样例数据-4"]
model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
embeddings_1 = model.encode(sentences_1, normalize_embeddings=True)
embeddings_2 = model.encode(sentences_2, normalize_embeddings=True)
similarity = embeddings_1 @ embeddings_2.T
print(similarity)

20231202

  • 太阳打西边出来,宋镇均居然在这么冷的天,六点起床出去跑了16km,均配4’16",一反常态。吓得我一机灵,七点醒来就没敢再睡,赶紧起床去学校吃早饭干活。
  • 为了两周后的高百全国总决赛,下午我按计划跑了一组15km(我本来是准备带宋镇均跑的),数据非常满意,用时1小时02分40秒,均配4’11",平均心率166bpm,最大心率177bpm,从手表数据来看,配速和心率都极其稳定,甚至在10km以后配速一度上升(因为10km处有个不错的小伙子能跟得住我,我就提了一点给他上些强度),最后1000米冲到3’50",心率和配速都没有顶到极限,跑到最后依然很轻松。
  • 现在我的水平绝对要比21年12月的巅峰期的配速要高到5秒左右,完全有自信能在明年上半年把半马破开1小时30分,当然我更想能把首马跑到3小时15分。
  • 市运会Day1,嘉伟和崔洲宸不出意外1500米(乙组)被血虐,前八全部达标二级(4’15"),崔洲宸4’45"跑了倒数第二(给小伙子来点打击也是好的,他为人处事太高调,需要来些挫败),嘉伟4’39"倒数第四,他俩为了能跑5000米,被迫报了乙组(因为甲组没有5000米),不过两人都算是PB,嘉伟也要比去年市运会快1秒。女生那边黄嘉懿拿到了800米第七(2’46"),卢星雨2’54"再次错失前八,但也很强,她去年3’01",跑赢自己就好,这成绩体测已经远远超过体测满分(3’16"),然而我现在1000米体测估计差满分(3’15")5秒左右,我自己800米最快也就勉强能开2’40"。

2023.acl-long.70,这篇很好,难得见到一篇比较靠谱的。

在开放领域的对话生成任务中,大多数训练语料集都是1-to-1映射,但是实际对话场景中更多出现的N-to-N的映射。

  • 1-to-1映射:即指模型生成与对话上下文中指定的某一语句对应,且回答语句是唯一的。对于早期的1-to-1对话生成任务,可以直接套用机器阅读理解模型的架构。

    举个例子,对于给定的对话样本 X = { x 0 , x 1 , . . . , x T − 1 } , y = x T X=\{x_0,x_1,...,x_{T-1}\},y=x_T X={x0,x1,...,xT1},y=xT,一种简单的思路是转化为机器阅读理解任务处理,即 C = { x 0 , x 1 , . . . , x T − 2 } , Q = x T − 1 , A = x T C=\{x_0,x_1,...,x_{T-2}\},Q=x_{T-1},A=x_T C={x0,x1,...,xT2},Q=xT1,A=xT,其中 C C C表示上下文, Q Q Q表示问题, A A A表示回答。

  • N-to-N映射:即指模型既可以生成多样化的回答,且回答可以与多条上下文语句关联(或者也可以理解为与不同的上下文语句关联,即可以选择对上下文中某一句话做出回答,这同时印证回答的多样化)。

    一些直觉性的解决思路,比如在回答语句的解码过程中引入扰动或松弛来获得多样化的生成结果,然而这样往往是行不通的,作者指出

    Discretely replacing each turn with semantic similarity breaks fragile context coherence

    即如果只是将生成的多样化的回答语句进行离散地拼接,往往不能得到合乎逻辑的对话结果,这正如Figure1(a)所示(Figure1(b)其实是说如果我用一种合理的方法进行对话路径采样,可以得到合乎逻辑的对话样本用于数据增强)。

目前的研究对于多轮的1-to-N以及单轮的N-to-N(这个似乎难以理解,其实确实就是个噱头,单轮怎么会有N-to-N呢,其实论文提到的相关工作是对1-to-1做数据增强的工作),而针对多轮的N-to-N对话生成缺少研究(你说是就是吧)。


20231203

  • 市运会Day2,嘉伟5000米17’02",成功PB,虽然没有拿到名次(前二甚至套了嘉伟一圈多,前八全部跑进16分30秒,但也只有前二是体育生,其他都是文化生),排名11/17,崔洲宸18’34"排名16/17,小家伙又拿了个倒数第二(甚至嘉伟都套了他一圈),两天两个倒二对他打击肯定不小,但他还年轻,未来是属于他的。
  • 男子4×400米(谢震宇,范贯一,徐瀚韬,刘星宇)拿下冠军,力克隔壁复旦,3’39"05,只比复旦快了不到0.5秒,看视频真的是特别精彩的纠缠。
  • 有点百感交集,早上后来跟AK聊了会儿,说到崔洲宸时,AK说不理解他朋友圈每天发四五条,还那么幼稚的文辞,我说他都05年的了,应当理解他的一些作为,AK说我们这一辈真的是老了,AK其实也就比我大一岁,但是女生的生命力却顽强很多,卢星雨(比我小一岁)和李婷玉(同岁)依然奋战在第一线,多想自己也能有一天能这样拼搏在更高的赛场上。但是我可能也很难有更高的提升了。
  • 几张拍得不错的图(嘉伟5000米途中跑 + 冲刺时的痛苦面具,李婷玉跳远,卢星雨1500米(其实是丑照哈哈,全是痛苦面具笑死),还有队里四朵金花的合照,以及全队合照)。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


20231204~20231206

  • 前两天听说队里周振凯在追李婷玉,市运会时有人就发现不对劲了,都觉得lty多了一个小尾巴。zzk是新生,lty比我还大半年,level差的不是一点点,其实就是一厢情愿,zzk偷偷把wx头像改成和lty能配对的,lty得知后连夜把头像给换了。搞不懂这些新生的脑回路…
  • 周一晚陪胡鑫宇跑了10km(前天下班后觉得自己身体特别轻,非常轻松,前面是4’50"的配速闲聊,最后冲了一个12分整的3000米,不累),很久不陪胡哥跑步,毕竟是老乡,又是套间室友。跟胡哥聊了许多,说到明年上半年的比赛(一场全马,一场半马,从此毕业前不再备赛),再到对未来的期望。胡哥说他爸跟他讲不要找大学同学谈恋爱,因为你们在一起别人会看到,分手后别人更会看到(所以胡哥现在都是异地恋,我也觉得这样是好的,双方都应该有一些私人空间,工作生活经常在一起的谈恋爱太难,会腻的),大学同学以后多少都有交集,容易社死,很符合我们扬州人好面子。我跟他讲lty去年也是跟队里的本科生姐弟恋,谈了半年就分了,撕得特别惨,虽然我觉得男生应该大气一点,在pyq指名道姓的抹黑实在有失风度,但是能把男生搞得这么疯狂,lty确实也不是省油的灯,男女在一些事情上观念确实还是差挺多,求同存异不容易。
  • 周二晚新宇哥毕业请同门在海底捞吃饭,可惜下班太晚没有赶上。便装5000米慢摇,24分半,最近操场跑步的人比较少,跑完做了20个单杠提腿卷腹,试着拉引体,能上去一点点了,有一点点能拉起来的感觉。大家一个个都离开学校了,终有一天也将轮到我。
  • 今晚是20’05"的5000米+30×10组的箭步走(负重15kg),说实话,练完感觉跟没练一样,真的太轻松了,难以置信的轻松,如果时间充裕,我再重复一遍这个量都可以。在经历了夏训和秋季的以赛代练后,我终于看到了自己的水平有了显著的提升,约了宋镇均周六测万米,有信心这次彻底破开40分钟。

查看是否支持BF16:

import transformers 
transformers.utils.import_utils.is_torch_bf16_gpu_available()

BF16

  • Sign(符号位): 1 位,0表示整数;1表示负数
  • Exponent(指数位):8位,表示整数部分,偏置值是 127
  • Fraction(尾数位):7位,表示小数部分,也是隐含了首位的1,实际的尾数精度为8位

FP16

  • Sign(符号位): 1 位,0表示整数;1表示负数。
  • Exponent(指数位):5位,简单地来说就是表示整数部分,范围为00001(1)到11110(30),正常来说整数范围就是 ,但其实为了指数位能够表示负数,引入了一个偏置值,偏置值是一个固定的数,它被加到实际的指数上,在二进制16位浮点数中,偏置值是 15。这个偏置值确保了指数位可以表示从-14到+15的范围,而不是1到30,注:当指数位都为00000和11111时,它表示的是一种特殊情况,在IEEE 754标准中叫做非规范化情况,后面可以看到这种特殊情况怎么表示的。
  • Fraction(尾数位):10位,简单地来说就是表示小数部分,存储的尾数位数为10位,但其隐含了首位的1,实际的尾数精度为11位,这里的隐含位可能有点难以理解,简单通俗来说,假设尾数部分为1001000000,为默认在其前面加一个1,最后变成1.1001000000然后换成10进制就是:

FP32

  • Sign(符号位): 1 位,0表示整数;1表示负数
  • Exponent(指数位):8位,表示整数部分,偏置值是 127
  • Fraction(尾数位):23位,表示小数部分,也是隐含了首位的1,实际的尾数精度为24位

20231207~20231209

  • 下午按计划场地10000米测试,并没有能够如愿跑进40分钟,在7000米处跑崩,最后3000米是隔了90秒分3次跑完,最终用时是39分35秒,说实话有些懊丧,但人生之不如意十之八九,凡事都不可能如想象般那样顺利,并不是同样的努力都能得到相同的成果的。而且还有一个遗憾,就是今天天气太热,十二月居然能有20℃,并不适合出成绩。
  • 这次是有不少人来捧场(我终于也算是有点号召力了),除了约好一起跑的宋镇均,还有卢星雨、AK(感冒初愈,就能3’50"以内跑20多圈)、嘉伟、小崔(发烧刚好)、叶赵志(已经是跑不动的模样了),周俊呈,王总(活的王总,不容易)在观赛助威。宋某带得很稳,前5000米用时19分48秒,平均配速3’57",这已经打破了我两年前的5000米的PB(这两年都没能测出5000米的真实水平),此时并没有感觉特别吃力,但是过了6000米心肺压力骤升,我明显觉得心脏已经支撑不了当前的配速,示意需要适当减速缓一下,到7000米用时28分整,均配已经掉到了4’00"的临界值,但心肺情况没能好转,实时配速已经掉出4’10",我深感绝望,越来越跟不住的宋某的节奏,完全失去了坚持下去的意志。然而宋某却越战越勇,拉爆我之后以3分45秒的配速跑完了最后3000米,甚至跑完万米之后又跟了AK十几圈(3’50"配速),他真的天赋太好了,只是懒,不然绝不是现在这个水平。
  • 虽然这次挑战失败,但至少证明了我基本适应4分整的配速,并且能够一点点地跨过这道大坎,想要彻底破开4分配,仍需中距离冲刺提升心肺耐受,腿脚并没有负担,以前跑崩有时候是因为短暂长胖致使大腿不能耐受,但这次跑完腿脚是完全没有感觉的(近期体重稳定在70~71kg),我能感觉到途中跑上半身前倾得非常稳定,而且戴了新买的墨镜,非常拉风。
  • 今天有点觉得lxy表现不太寻常,亲近了许多,以前她都是嚯嚯学弟。而且剪了短发,认识两年多,但交集很少,偶尔碰到能跟她摇几圈聊聊天,事实上现在冬天下班也碰不到。队里都知道她一直单身,但过于优秀,难以企及,虽然在男女生堆里都吃得开,但其实行事风格跟lty完全不同,lty是我见过同龄人里最成熟的女性了,段位太高,大一新生想追她实在离谱。但lxy不一样,我感觉她就是性格吃得开,但行事依然是学生风格,如果真的有大一新生追她我觉得也挺正常… 其实单身有啥不好呢,多个朋友比多个npy好。

使用newaxis(numpy没有broadcast函数,一般用newaxis实现张量的传播)

a = np.array([[1,2,3], [4,5,6]])
a_norm = norm(a, axis=1)
a = a / a_norm[:, np.newaxis]

关键词抽取:

# 看起来Gensim的关键词总结能力并没有很好import gensim
for cluster in clusters:gensim_kw = gensim.summarization.keywords(cluster, words=10, split=True, scores=True)print(gensim_kw)print('-' * 64)
import jieba.analyse
#准备语料
corpus = "《知否知否应是绿肥红瘦》是由东阳正午阳光影视有限公司出品,侯鸿亮担任制片人,张开宙执导,曾璐、吴桐编剧,赵丽颖、冯绍峰领衔主演,朱一龙、施诗、张佳宁、曹翠芬、刘钧、刘琳、高露、王仁君、李依晓、王鹤润、张晓谦、李洪涛主演,王一楠、陈瑾特别出演的古代社会家庭题材电视剧"#textrank
keywords_textrank = jieba.analyse.textrank(corpus)
print(keywords_textrank)
>>> ['有限公司', '出品', '社会', '家庭', '制片人', '担任', '影视', '题材', '电视剧', '知否', '东阳', '出演', '执导']#tf-idf
keywords_tfidf = jieba.analyse.extract_tags(corpus)
print(keywords_tfidf)
>>> ['知否', '领衔主演', '刘钧', '刘琳', '侯鸿亮', '张晓谦', '王一楠', '张佳宁', '李依晓', '冯绍峰', '王鹤润', '施诗', '陈瑾', '赵丽颖', '吴桐', '朱一龙', '曹翠芬', '王仁君', '曾璐', '高露']
%%html
<style id=hide>div.input{display:none;}</style>
<button type="button" onclick="var myStyle = document.getElementById('hide').sheet;myStyle.insertRule('div.input{display:inherit !important;}', 0);">Show inputs</button>

kmeans.score(X)的结果是距离的相反数,即绝对值越大,越不匹配。


20231210~20231211

  • 周日去小姨家老鸭汤、清蒸鱼、糖醋虾彻底补满血,我现在每周就指着周末能吃点儿好的活着了。晚上卫衣西裤补了5000米慢跑,降雨湿闷,难受得很,很难想象12月的上海会有这种类梅雨天气。嘉伟和AK晚上六点在操场21.1km的拉练,用时1:20:45,平均配速3’49",令人咋舌。AK自从柴古唐斯越野赛回来之后,已经一个多月没有规律性训练,而且前天感冒刚好,竟然不需要恢复期就能达到这么高的训练水平,即便如今不再巅峰,一哥地位也无法撼动。
  • 周一冬雨渐深,有一点点要感冒的前兆。晚上下班寒风凛冽,干了个均配4’13"的10km节奏跑(平均心率162bpm),跑得极稳,不管是心率还是配速,最后1000米用时跑进4分钟,非常满意的高质量训练。
  • 今年还剩三个周末,万米跑进40分钟,一定会做到的。去年没有PB,今年至少要留下一个PB,这是我2023最后的疯狂。

在这里插入图片描述

确定KMeans模型距离质心最近的样本点:

def check_if_sample_label_match_cluster_center():for i in range(emb.shape[0]):sample_i = emb[i, :]distances_i = norm(sample_i[np.newaxis, :] - model.cluster_centers_, axis=1) # 计算距离index = np.argmin(distances_i)label = model.labels_[i]# print(i, index, label)assert index == label, f"{index}, {label}"# 相反地,去检查每个质心距离它最近的那个样本作为名称
def check_which_sample_is_the_nearest_to_cluster_center():cluster_names = []for i in range(model.cluster_centers_.shape[0]):cluster_i = model.cluster_centers_[i, :]distances_i = norm(cluster_i[np.newaxis, :] - emb, axis=1) # 计算距离index = np.argmin(distances_i) # 0~9719中的而某个数print(f"第{i}类的名称: {samples[index]}")print('-' * 64)print(f"""第{i}类的样本:
{' - '.join(clusters[i].splitlines())}""")print("#" * 64)cluster_names.append(samples[index])return cluster_names

20231212~20231214

  • 周二组会开到八点半才走,讲了两个多小时,大家对方法上的创新似乎并不太感冒,我觉得这是很危险的事情,之前2~5年,许多创新还是集中在模型架构上,给我印象深刻的比如text-to-SQL的IRNet,当时看觉得很惊艳,现在较于大模型的代码生成能力就是依托答辩。
  • 周三晚按计划跑黑马课表(12组400米变速跑,每组400米快+400米慢,中间不休息,A组快圈80-82秒,慢圈92-95秒,后面BCDE组依次加3~5秒),最终快圈1’25",慢圈前面还能顶到1’40",后半程掉到2分开外(总体均配4’19")。本来AK、嘉伟、宋某和我是前天就约好一起跑,昨天还说不见不散,然后今天是嘉伟先说要跑休(他必是去约妹子了,啥原因也不说,除了女人,我想不到有什么事情会阻止嘉伟跑步)、然后AK也犹豫不决,觉得昨天没休息好(其实我下班也觉得特别累,但是我中午炫了三碗饭,装备也带了,不跑实在说不过去),而且晚上要赶个公司汇报的稿子。最后只有我和宋某,中途周俊呈来跟了我三组就吃不消,我却觉得越来越有力气,根本不觉得累,跑完12组后舒畅无比,一扫颓势,甚至还想再来两组。
  • 身体不适,估计是躲不过感冒,真的很无奈,想吃点好的。虽然昨天下班就有些不适,但是跑起来并没有觉得累,今天这种疲劳感增加了,晚上九点半回学校,还是跑了10圈,4’48"的配速,喘得不行,累到极限,回宿舍就洗澡睡了。(宋某今天补了12×400米间歇,间歇2分半,非常高质量,1’09~1’14",高质量,没有人比他更懂间歇)
    在这里插入图片描述
  • 如今大家似乎已经接受了这些主流的几个基座,认为只要有算力就能解决一切,Gemini给我带来无比的震撼,仅一年,从chatgpt到gemini,一个拥有听觉视觉和阅读能力的模型,这意味着文本、图像和语音可以被映射到统一的语义空间,这是真实存在的吗?学界之前觉得图像和文本的语义统一都是极其困难(如果需要统一语义,则必须要有充分多的图像文本的平行数据集,虽然vqa系列已经有成亿的图像文本对,但这相较于文本和图像单独的数据规模根本不值一提,而且图像文本语义根本就不是1-to-1的存在),更遑论语音语义的表征。如果Gemini是真的,那么我觉得世间一切的规律都可以被用潜在的数学公式(黑盒模型)表达出来,就像用物理学解释物体的运转规律一样。我还是倾向于gemini是造假的。

关于python加载JSON字符串的小问题

比如字符串是:

import jsonjson_string = """{"name": "sadsad\\asdasd"}"""
data = json.loads(json_string)

就会报错:

json.decoder.JSONDecodeError: Invalid \escape: line 1 column 17 (char 16)

就是两个反斜杠是不行的,但是如果事先转义:

import jsonjson_string = r"""{"name": "sadsad\\asdasd"}"""
data = json.loads(json_string)

又是不报错的。

实际上如果是把{"name": "sadsad\\asdasd"}直接复制到外部文件d:/1.json去读:

data = json.load(open("d:/1.json", 'r'))

又是可以的。

所以现在还是建议直接用ast来load,更加灵活一些:

json_string = """{"name": "sadsad\\asdasd"}"""
import ast
data = ast.literal_eval(json_string)

这样是可行的。


(TBD)

这篇关于【更新】囚生CYのMemo(20231118~)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/494192

相关文章

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

hdu1689(线段树成段更新)

两种操作:1、set区间[a,b]上数字为v;2、查询[ 1 , n ]上的sum 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdl

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

GIS图形库更新2024.8.4-9.9

更多精彩内容请访问 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信:digital_twin123 Cesium 本期发布了1.121 版本。重大新闻,Cesium被Bentley收购。 ✨ 功能和改进 默认启用 MSAA,采样 4 次。若要关闭 MSAA,则可以设置scene.msaaSamples = 1。但是通过比较,发现并没有多大改善。

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法   消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法 [转载]原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“

云原生之高性能web服务器学习(持续更新中)

高性能web服务器 1 Web服务器的基础介绍1.1 Web服务介绍1.1.1 Apache介绍1.1.2 Nginx-高性能的 Web 服务端 2 Nginx架构与安装2.1 Nginx概述2.1.1 Nginx 功能介绍2.1.2 基础特性2.1.3 Web 服务相关的功能 2.2 Nginx 架构和进程2.2.1 架构2.2.2 Ngnix进程结构 2.3 Nginx 模块介绍2.4