python-NLP:2词性标注与命名实体识别

文章目录

  • 词性标注
  • 命名实体识别
    • 时间命名实体(规则方法)
    • CRF 命名实体识别方法


词性标注

  词性是词汇基本的语法属性,通常也称为词类。词性标注是在给定句子中判定每个词的语法范畴,确定其词性并加以标注的过程。例如,表示人、地点、事物以及其他抽象概念的名称即为名词,表示动作或状态变化的词为动词,描述或修饰名词属性、状态的词为形容词。如给定一个句子:“这儿是个非常漂亮的公园”,对其的标注结果应如下:“这儿/代词 是/动词 个/量词 非常/副词 漂亮/形容词 的/结构助词 公园 /名词”。
  在中文中,一个词的词性很多时候都不是固定的,一般表现为同音同形的词在不同场景下,其表示的语法属性截然不同,这就为词性标注带来很大的困难;但是另外一方面,从整体上看,大多数词语,尤其是实词,一般只有一到两个词性,且其中一个词性的使用频次远远大于另一个,即使每次都将高频词性作为词性选择进行标注,也能实现80%以上的准确率。如此,若我们对常用词的词性能够进行很好地识别,那么就能够覆盖绝大多数场景,满足基本的准确度要求。
  词性标注最简单的方法是从语料库中统计每个词所对应的高频词性,将其作为默认词性,但这样显然还有提升空间。目前较为主流的方法是如同分词一样,将句子的词性标注作为一个序列标注问题来解决,那么分词中常用的手段,如隐含马尔可夫模型、条件随机场模型等皆可在词性标注任务中使用。本节将继续介绍如何使用Jieba分词来完成词性标注任务。

标记词性标记词性
ag形语素a形容词
ad副形词an名形词
b区别词c连词
dg副语素d副词
e叹词f方位词
g语素h前接成分
i成语j简称省语
k后接成分I习用语
m数词ng名语素
n名词nr人名
ns地名nt机构团体
nz其他专名o拟声词
p介词q量词
r代词s处所词
tg时语素t时间词
u助词vg动语素
v动词vd副动词
vn名动词w标点符号
x非语素字y语气词
z状态词
import jieba.posseg as psg
sent="中文分词是文本处理不可或缺的一步!"
seg_list=psg.cut(sent)
print(" ".join(['{0}/{1}'.format(w,t) for w,t in seg_list]))

结果

中文/nz 分词/n 是/v 文本处理/n 不可或缺/l 的/uj 一步/m !/x

format用法

print(“我来自{},我今年{}岁了”.format(“东北”,15))
我来自东北,我今年15岁了
print(“我叫{1},来自{2},今年{0}岁”.format(15,“小王”,“天津”))
我叫小王,来自天津,今年15岁
print(“我来自{0},我今年{1}岁了,我来自{0}”.format(“东北”,‘15’))## 我来自东北,我今年15岁了,我来自东北
print(“我来自{place},我今年{age}岁了”.format(place=“东北”,age=15))
我来自东北,我今年15岁了

命名实体识别

  与自动分词、词性标注一样,命名实体识别也是自然语言处理的一个基础任务,是信息抽取、信息检索、机器翻译、问答系统等多种自然语言处理技术必不可少的组成部分。其目的是识别语料中人名、地名、组织机构名等命名实体。由于这些命名实体数量不断增加,通常不可能在词典中穷尽列出,且其构成方法具有各自的规律性,因此,通常把对这些词的识别在词汇形态处理(如汉语切分)任务中独立处理,称为命名实体识别(Named Entities Recognition,NER)。NER研究的命名实体一般分为3大类(实体类、时间类和数字类)和7小类(人名、地名、组织机构名、时间、日期、货币和百分比)。由于数量、时间、日期、货币等实体识别通常可以采用模式匹配的方式获得较好的识别效果,相比之下人名、地名、机构名较复杂,因此近年来的研究主要以这几种实体为主。
  命名实体识别当前并不是一个大热的研究课题,因为学术界部分认为这是一个已经解决了的问题,但是也有学者认为这个问题还没有得到很好地解决,原因主要有:命名实体识别只是在有限的文本类型(主要是新闻语料)和实体类别(主要是人名、地名)中取得了效果;与其他信息检索领域相比,实体命名评测语料较小,容易产生过拟合;命名实体识别更侧重高召回率,但在信息检索领域,高准确率更重要;通用的识别多种类型的命名实体的系统性很差。
  同时,中文的命名实体识别与英文的相比,挑战更大,目前未解决的难题更多。命名实体识别效果的评判主要看实体的边界是否划分正确以及实体的类型是否标注正确。在英文中,命名实体一般具有较为明显的形式标志(如英文实体中的每个词的首字母要大写),因此其实体边界识别相对容易很多,主要重点是在对实体类型的确定。而在汉语中,相较于实体类别标注子任务,实体边界的识别更加困难。

时间命名实体(规则方法)


import re
from datetime import datetime,timedelta #timedelta时间差
from dateutil.parser import parse
import jieba.posseg as psgUTIL_CN_NUM = {'零': 0, '一': 1, '二': 2, '两': 2, '三': 3, '四': 4, '五': 5, '六': 6, '七': 7, '八': 8, '九': 9,'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
}
UTIL_CN_UTIL = {'十': 10, '百': 100, '千': 1000, '万': 10000}def check_time_valid(word):"""对拼接字符串近一步处理,以进行有效性判断:param word: time_res中的每一项(每一项切割出来的时间):return: 清洗后的句子"""# match()匹配成功返回对象,否则返回None,# match是全匹配,即从头到尾,而$是匹配最后,从match源码来看,如果str是存在非数字的情况会直接返回None# 这里的意思就是清洗掉长度小于等于6的纯数字(小于等于6的意思是指非准确日期,比如2020)m = re.match('\d+$', word)if m:# 当正则表达式匹配成功时,判断句子的长度是否小于等于6,如果小于等于6,则返回Noneif len(word) <= 6:return None# 将"号"和"日"替换为"日",个人理解,这里是号和日后面莫名其妙跟了一串数字的情况word_1 = re.sub('[号|日]\d+$', '日', word)if word_1 != word:# 如果清洗出来的句子与原句子不同,则递归调用return check_time_valid(word_1)else:# 如果清洗出来的句子与原句子相同,则返回任意一个句子return word_1def cn2dig(src):"""除了年份之外的其余时间的解析:param src: 除了年份的其余时间(从列表的头到倒数第二个字,即假设有"月"这个字,则清洗掉"月"):return rsl: 返回相应的除了年份的其余时间的阿拉伯数字"""if src == "":# 如果src为空,那么直接返回None,又进行一次清洗return Nonem = re.match("\d+", src)if m:# 如果m是数字则直接返回该数字return int(m.group(0))rsl = 0unit = 1for item in src[:: -1]:# 从后向前遍历srcif item in UTIL_CN_UTIL.keys():# 如果item在UTIL_CN_UTIL中,则unit为这个字转换过来的阿拉伯数字# 即假设src为"三十",那么第一个item为"十",对应的unit为10unit = UTIL_CN_UTIL[item]elif item in UTIL_CN_NUM.keys():# 如果item不在UTIL_CN_UTIL而在UTIL_CN_NUM中,则转换为相应的阿拉伯数字并且与unit相乘# 就假设刚刚那个"三十",第二个字为"三",对应的num为3,rsl就为30num = UTIL_CN_NUM[item]rsl += num * unitelse:# 如果都不在,那么就不是数字,就直接返回Nonereturn Noneif rsl < unit:# 如果出现"十五"这种情况,那么是先执行上面的elif,即rsl = 5,再执行if,即unit = 10,# 这时候rsl < unit,那么执行相加操作rsl += unitreturn rsldef year2dig(year):"""解析年份这个维度,主要是将中文或者阿拉伯数字统一转换为阿拉伯数字的年份:param year: 传入的年份(从列表的头到倒数第二个字,即假设有"年"这个字,则清洗掉"年"):return: 所表达的年份的阿拉伯数字或者None"""res = ''for item in year:# 循环遍历这个年份的每一个字符if item in UTIL_CN_NUM.keys():# 如果这个字在UTIL_CN_NUM中,则转换为相应的阿拉伯数字res = res + str(UTIL_CN_NUM[item])else:# 否则直接相加# 这里已经是经历了多方面清洗后的结果了,基本到这里不会在item中出现异常的字符res = res + itemm = re.match("\d+", res)if m:# 当m开头为数字时,执行下面操作,否则返回Noneif len(m.group(0)) == 2:# 这里是假设输入的话为"我要住到21年..."之类的,那么year就只有2个字符,即这里m == 21,# 那么就通过当前年份除100的整数部分再乘100最后加上这个数字获得最终年份# 即int(2020 / 100) * 100 + int("21")return int(datetime.today().year / 100) * 100 + int(m.group(0))else:# 否则直接返回该年份return int(m.group(0))else:return Nonedef parse_datetime(msg):""":param msg: ['2024年07月23日下午三点']示例  '我要从26号下午4点住到11月2号'示例:return:"""if msg is None or len(msg) == 0:return Nonetry:dt = parse(msg, fuzzy=True) #时间格式转换 为2024-07-23 00:00:00 2024-11-02 00:00:00return dt.strftime('%Y-%m-%d %H:%M:%S')except Exception as e:m = re.match(r"([0-9零一二两三四五六七八九十]+年)?([0-9一二两三四五六七八九十]+月)?([0-9一二两三四五六七八九十]+[号日])?([上中下午晚早]+)?([0-9零一二两三四五六七八九十百]+[点:\.时])?([0-9零一二三四五六七八九十百]+分?)?([0-9零一二三四五六七八九十百]+秒)?",msg)if m.group(0) is not None:res = {"year": m.group(1),"month": m.group(2),"day": m.group(3),"hour": m.group(5) if m.group(5) is not None else '00',"minute": m.group(6) if m.group(6) is not None else '00',"second": m.group(7) if m.group(7) is not None else '00',}params = {}for name in res:if res[name] is not None and len(res[name]) != 0:tmp = Noneif name == 'year':tmp = year2dig(res[name][:-1])else:tmp = cn2dig(res[name][:-1])if tmp is not None:params[name] = int(tmp)target_date = datetime.today().replace(**params)is_pm = m.group(4)if is_pm is not None:if is_pm == u'下午' or is_pm == u'晚上' or is_pm =='中午':hour = target_date.time().hourif hour < 12:target_date = target_date.replace(hour=hour + 12)return target_date.strftime('%Y-%m-%d %H:%M:%S')else:return Nonedef time_extract(text):"""思路:通过jieba分词将带有时间信息的词进行切分,记录连续时间信息的词。使用了词性标注,提取"m(数字)"和"t(时间)"词性的词。规则约束:对句子进行解析,提取其中所有能表示日期时间的词,并进行上下文拼接:param text: 每一个请求文本:return: 解析出来后最终的句子"""time_res = []word = ''key_date = {'今天': 0, '明天': 1, '后天': 2}for k, v in psg.cut(text):# k: 词语, v: 词性if k in key_date:# 当k存在于key_date中时if word != '':# 如果word不为空时, 列表中添加相应的词语time_res.append(word)# 获取系统当前时间,并且获取句子中时间的跨度(0, 1, 2),通过当前时间 + 时间跨度获得几天后的时间word = (datetime.today() + timedelta(days=key_date.get(k, 0))) \.strftime('%Y {0} %m {1} %d {2} ').format('年', '月', '日')elif word != '':# 如果k不存在于key_date时,word不为空if v in ['m', 't']:# 当词性为数字或时间时,添加至word中word = word + kelse:# 当词性不为数字或时间时,将word放入time_res,同时清空wordtime_res.append(word)word = ''elif v in ['m', 't']:# 当k不存在于key_date中,且word为空时,如果词性是数字或时间时,word为该词语word = kif word != '':# word中可能存放的值:#   1. 通过词性标注后获得的时间跨度后的时间#   2. 非key_date中的时间或数字# 即只有k不存在于key_date,word不为空,词性不为数字或时间时,word才为空,进入不了这个if语句time_res.append(word)# 如果返回的结果是None,则直接清洗,否则放入集合中result = list(filter(lambda x: x is not None, [check_time_valid(w) for w in time_res]))final_res = [parse_datetime(w) for w in result]return [x for x in final_res if x is not None]text1 = '我要住到明天下午三点'
print(text1, time_extract(text1), sep=':')text2 = '预定28号的房间'
print(text2, time_extract(text2), sep=':')text3 = '我要从26号下午4点住到11月2号'
print(text3, time_extract(text3), sep=':')text4 = '我要预订今天到30的房间'
print(text4, time_extract(text4), sep=':')

CRF 命名实体识别方法

CRF原理

  CRF 本质是一个无向图,其中绿色点表示输入,红色点表示输出。点与点之间的边可以分成两类,一类是 x 与 y 之间的连线,表示其相关性;另一类是相邻时刻的 y之间的相关性。也就是说,在预测某时刻 y时,同时要考虑相邻的标签解决。当 CRF 模型收敛时,就会学到类似 P-B 和 T-I 作为相邻标签的概率非常低。
  对于 CRF,我们给出准确的数学语言描述:设 X 与 Y 是随机变量,P(Y|X) 是给定 X 时 Y 的条件概率分布,若随机变量 Y 构成的是一个马尔科夫随机场,则称条件概率分布 P(Y|X) 是条件随机场。

  本文模型训练数据集 。数据分为10个标签类别,分别为: 地址(address),书名(book),公司(company),游戏(game),政府(goverment),电影(movie),姓名(name),组织机构(organization),职位(position),景点(scene)。
CLUE Fine-Grain NER中文数据集

本文NER任务使用BIO三位标注法,即:

B-begin:代表实体开头
I-inside:代表实体内部
O-outside:代表不属于任何实体
其后面接实体类型,如 ‘B-name’,‘I-company’。

`

#coding:utf-8
import json
import sklearn_crfsuite #CRF
from sklearn import metrics
from itertools import chain# 将数据处理成CRF库输入格式
def data_process(path):# 读取每一条json数据放入列表中# 由于该json文件含多个数据,不能直接json.loads读取,需使用for循环逐条读取json_data = []with open(path, 'r', encoding='utf-8') as fp:for line in fp:json_data.append(json.loads(line))# json_data中每一条数据的格式为'''{'text': '浙商银行企业信贷部叶老桂博士则从另一个角度对五道门槛进行了解读。叶老桂认为,对目前国内商业银行而言,','label': {'name': {'叶老桂': [[9, 11]]}, 'company': {'浙商银行': [[0, 3]]}}}'''# 将json文件处理成如下格式'''[['浙', '商', '银', '行', '企', '业', '信', '贷', '部', '叶', '老', '桂', '博', '士', '则', '从', '另', '一', '个', '角', '度', '对', '五', '道', '门', '槛', '进', '行', '了', '解', '读', '。', '叶', '老', '桂', '认', '为', ',', '对', '目', '前', '国', '内', '商', '业', '银', '行', '而', '言', ','], ['B-company', 'I-company', 'I-company', 'I-company', 'O', 'O', 'O', 'O', 'O', 'B-name', 'I-name', 'I-name', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']]'''data = []# 遍历json_data中每组数据for i in range(len(json_data)):# 将标签全初始化为'O'label = ['O'] * len(json_data[i]['text'])# 遍历'label'中几组实体,如样例中'name'和'company'for n in json_data[i]['label']:# 遍历实体中几组文本,如样例中'name'下的'叶老桂'(有多组文本的情况,样例中只有一组)for key in json_data[i]['label'][n]:# 遍历文本中几组下标,如样例中[[9, 11]](有时某个文本在该段中出现两次,则会有两组下标)for n_list in range(len(json_data[i]['label'][n][key])):# 记录实体开始下标和结尾下标start = json_data[i]['label'][n][key][n_list][0]end = json_data[i]['label'][n][key][n_list][1]# 将开始下标标签设为'B-' + n,如'B-' + 'name'即'B-name'# 其余下标标签设为'I-' + nlabel[start] = 'B-' + nlabel[start + 1: end + 1] = ['I-' + n] * (end - start)# 对字符串进行字符级分割# 英文文本如'bag'分割成'b','a','g'三位字符,数字文本如'125'分割成'1','2','5'三位字符texts = []for t in json_data[i]['text']:texts.append(t)# 将文本和标签编成一个列表添加到返回数据中data.append([texts, label])return data# 判断字符是否是英文
def is_english(c):if ord(c.lower()) >= 97 and ord(c.lower()) <= 122:return Trueelse:return False# 将文本转换为特征字典
# sklearn-crfsuite输入数据支持多种格式,这里选择字典格式
# 单个CRF与BiLSTM+CRF不同,BiLSTM会自动生成输入序列中每个字符的发射概率,而单个CRF的发射概率则是通过学习将特征映射成发射概率
# sklearn-crfsuite的数据输入格式采用字典格式,类似于做特征工程,CRF将这些特征映射成发射概率
'''序列中的每一个字符处理成如下格式:{'bias': 1.0,'word': '商','word.isdigit()': False,'word.is_english()': False,'-1:word': '浙','-1:word.isdigit()': False,'-1:word.is_english()': False,'+1:word': '银','+1:word.isdigit()': False,'+1:word.is_english()': False}
'''
def word2features(sent, i):# 本代码采用大小为3的滑动窗口构造特征,特征有当前字符、字符是否为数字或英文等,当然可以增大窗口或增加其他特征# 特征长度可以不同word = sent[i][0]features = {'bias': 1.0,'word': word,'word.isdigit()': word.isdigit(),'word.is_english()': is_english(word),}if i > 0:word = sent[i - 1][0]features.update({'-1:word': word,'-1:word.isdigit()': word.isdigit(),'-1:word.is_english()': is_english(word),})else:# 若该字符为序列开头,则增加特征 BOS(begin of sentence)features['BOS'] = True# 该字的后一个字if i < len(sent) - 1:word = sent[i + 1][0]features.update({'+1:word': word,'+1:word.isdigit()': word.isdigit(),'+1:word.is_english()': is_english(word),})else:# 若该字符为序列结尾,则增加特征 EOS(end of sentence)features['EOS'] = Truereturn featuresdef sent2features(sent):return [word2features(sent, i) for i in range(len(sent))]def sent2labels(sent):return [label for label in sent]train = data_process('./data/cluener_public/train.json')
valid = data_process('./data/cluener_public/dev.json')
print('训练集长度:', len(train))
print('验证集长度:', len(valid))
X_train = [sent2features(s[0]) for s in train]
y_train = [sent2labels(s[1]) for s in train]
X_dev = [sent2features(s[0]) for s in valid]
y_dev = [sent2labels(s[1]) for s in valid]
print(X_train[0][1])# algorithm:lbfgs法求解该最优化问题,c1:L1正则系数,c2:L2正则系数,max_iterations:迭代次数,verbose:是否显示训练信息
crf_model = sklearn_crfsuite.CRF(algorithm='lbfgs', c1=0.1, c2=0.1, max_iterations=50,all_possible_transitions=True, verbose=True)
# 若sklearn版本大于等于0.24会报错:AttributeError: 'CRF' object has no attribute 'keep_tempfiles'
# 可降低版本 pip install -U 'scikit-learn<0.24'
# 或使用异常处理,不会影响训练效果
try:crf_model.fit(X_train, y_train)
except:passlabels = list(crf_model.classes_)
# 由于大部分标签都是'O',故不去关注'O'标签的预测
labels.remove("O")
y_pred = crf_model.predict(X_dev)y_dev = list(chain.from_iterable(y_dev))
y_pred = list(chain.from_iterable(y_pred))# 计算F1分数,average可选'micro','macro','weighted',处理多类别F1分数的不同计算方法
# 此metrics为sklearn_crfsuite.metrics,但必须引入from sklearn_crfsuite import metrics
# 也可使用sklearn.metrics.f1_score(y_dev, y_pred, average='weighted', labels=labels)),但要求y_dev和y_pred是一维列表
print('weighted F1 score:', metrics.f1_score(y_dev, y_pred,average='weighted', labels=labels))# 排好标签顺序输入,否则默认按标签出现顺序进行排列
sorted_labels = sorted(labels, key=lambda name: (name[1:], name[0]))
# 打印详细分数报告,包括precision(精确率),recall(召回率),f1-score(f1分数),support(个数),digits=3代表保留3位小数
print(metrics.classification_report(y_dev, y_pred, labels=sorted_labels, digits=3
))# 查看转移概率和发射概率
# print('CRF转移概率:', crf_model.transition_features_)
# print('CRF发射概率:', crf_model.state_features_)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/50978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python机器学习实战:分类算法之逻辑回归-泰坦尼克号乘客生还预测

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能&#xff0c;从而更快地掌握解决问题所需的能力。 目录 逻辑回归算法介绍 练习题 Python代码与分析 1、读入数据&#xff0c;观察数据情况 2、各属性与生还情况的关联 3、…

用Python做一个翻译软件,比上浏览器快100倍

简单的用Python来做一个翻译软件 开发环境 Python 3.10 Pycharm模块使用 requests -> pip install requests hashlib tkinter案例分为三部分: 1. 爬虫: 获取翻译接口, 请求获取翻译结果问题1: 接口抓包分析问题2: 请求需要写cookie问题3: 不同文本翻译, s加密参数2. 界面…

PDF解锁网站

https://smallpdf.com/cn/unlock-pdfhttps://smallpdf.com/cn/unlock-pdfhttps://www.freemypdf.comhttps://www.freemypdf.com

【python】python图书管理系统_普通用户+管理员菜单(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

[代码审计]记一次简单的java代码审计

如果觉得该文章有帮助的&#xff0c;麻烦师傅们可以搜索下微信公众号&#xff1a;良月安全。点个关注&#xff0c;感谢师傅们的支持。 免责声明 本博客所发布的所有内容&#xff0c;包括但不限于信息、工具、项目以及文章&#xff0c;均旨在提供学习与研究之用。所有工具安全…

FastAPI(七十六)实战开发《在线课程学习系统》接口开发-- 课程详情

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 这个接口用户可以不登录&#xff0c;因为我们的课程随意浏览 那么我们梳理下这里的逻辑 1.根据课程id判断课程是否存在 2.课程需要返回课程的详情 3…

C# Task.WaitAll 的用法

目录 简介 1.WaitAll(Task[], Int32, CancellationToken) 2.WaitAll(Task[]) 3.WaitAll(Task[], Int32) 4.WaitAll(Task[], CancellationToken) 5.WaitAll(Task[], TimeSpan) 结束 简介 Task.WaitAll 是 C# 中用于并行编程的一个的方法&#xff0c;它属于 System.Threa…

DjangoRF-5-用户管理-users接口

1、创建模型&#xff0c;user模型之前创建过了&#xff0c;继承了原有的模型类 2、序列化器 在 users/serializers.py 模块中添加&#xff1a; class UserSerializer(serializers.ModelSerializer):class Meta:model Userfields [id, username, password, mobile, email, is…

【简单讲解Perl语言】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

基于微信小程序+SpringBoot+Vue的核酸检测服务系统(带1w+文档)

基于微信小程序SpringBootVue的核酸检测服务系统(带1w文档) 基于微信小程序SpringBootVue的核酸检测服务系统(带1w文档) 在目前的情况下&#xff0c;可以引进一款医院核酸检测服务系统这样的现代化管理工具&#xff0c;这个工具就是解决上述问题的最好的解决方案。它不仅可以实…

20240727生活沉思------------关于报考软考高级架构师

软考高级架构师 软考高级架构师 缴费 主要是报的千峰 1880元。 相对来说还算可以吧。。。其他也没给我机会选择啊 备考 我现在开始备考&#xff0c;考试时间2024年11月。 今天是正式开始7.27号。 给大家看看接下来我的课程安排&#xff1a; 额&#xff0c;还是满满当当的…

日入800+小红书AI表情包项目拆解

一个高考结束之后&#xff0c;进入暑假&#xff0c;只要有手就能做的AI搞钱项目&#xff0c;不到2个月的时间在小某书上成功涨粉5w&#xff0c;通过发布广告&#xff0c;一条广告甚至还能赚到2000元&#xff1b; 只要有市场需求就可以制作这种表情包快速搞钱&#xff0c;上手非…

openmv 学习笔记(24电赛笔记)

模版匹配 模版匹配是一种计算机视觉技术&#xff0c;用于图像或者视频中查找特定的模版或者对象&#xff0c;查找模版可以是数字或者是物体&#xff0c;技术通过在目标图像中寻找与模版图像相似的区域来实现匹配。这种技术最早起源在 20世纪70年代 的图像处理领域。 使用模版匹…

网络编程总复习

TCP的创建&#xff1a; 服务器端 &#xff1a; 客户端&#xff1a;

【计算机网络】IP分片实验

一&#xff1a;实验目的 1&#xff1a;理解IP数据报分片的工作原理。 2&#xff1a;理解IP协议报文类型和格式。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a;RCMS-C服务器、网线、Windows 2019/2003操作系统的计算机等。 软件&#xff1a;记事本、WireShark、Chrom…

倒计时11天,生物发酵行业盛宴即将在沪召开!

随着生物科技领域的蓬勃发展&#xff0c;2024上海生物发酵展的召开已经进入倒计时阶段&#xff0c;距离这场生物发酵产业的年度盛事仅剩11天。作为行业内备受瞩目的展会&#xff0c;它不仅汇聚了全球顶尖的生物发酵技术、产品与服务&#xff0c;更是一个探讨行业趋势、促进合作…

c++语言学习注意事项

当学习C语言时&#xff0c;有几个重要的注意事项可以帮助初学者更有效地掌握这门强大的编程语言&#xff1a; 1. 理解基本概念和语法 C 是一门复杂且功能强大的编程语言&#xff0c;因此理解其基本概念和语法至关重要。初学者应该重点掌握以下几个方面&#xff1a; 基本语法和…

最小二乘法公式推导

微积分和线性代数碰撞的数学盛宴&#xff1a;最小二乘法公式推导&#xff01;_哔哩哔哩_bilibili 递归最小二乘法与参数辨识_哔哩哔哩_bilibili 笔记

护眼灯有没有护眼的效果?一文揭秘用护眼灯到底好不好

护眼灯有没有护眼的效果&#xff1f;在现在这个时代&#xff0c;无论是在学习还是办公&#xff0c;都很难离开一款好用的台灯&#xff0c;所以&#xff0c;为了避免会挑选到质量不好的台灯&#xff0c;我们应该要先避开一些网红小品牌&#xff0c;优先选择有专业技术支持的&…

数据库作业四

1. 修改 student 表中年龄&#xff08; sage &#xff09;字段属性&#xff0c;数据类型由 int 改变为 smallint &#xff1a; ALTER TABLE student MODIFY Sage SMALLINT; 2. 为 Course 表中 Cno 课程号字段设置索引&#xff0c;并查看索引&#xff1a; ALTER TABLE…