【学术小白的学习之路】基于情感词典的中文句子情感分析(代码词典获取在结尾)
【学术小白的学习之路】基于情感词典的情感分析
- 1.基础函数
- 1.1 判断情感词的否定词数量
- 1.2 导入情感词典
- 1.3 切分句子
- 1.3.1为什么划分
- 1.3.2 划分代码
- 1.4 完整代码
- 2.导入词典
- 3.中文情感分析算法思路
- 4.1情感词获取思路
- 4.2 计算情感分值
- 4.3 得分的归一化处理
- 4.实证
- 5.总结
本文的情感分析逻辑大致如下,没有进行专门的分词工作,进行了分句子工作,识别出需要的词,计算出情感倾向。

1.基础函数
1.1 判断情感词的否定词数量
在情感分析代码中,我们需要写一个函数来主要作用是判断情感词前面是否存在奇数个否定词。这对于情感分析的逻辑非常重要,因为否定词的数量会影响最终的情感得分。
def is_odd(self, num):if num % 2 == 0:return 'even'else:return 'odd'
具体用途在判断否定影响:
在分析情感词时,代码会检查该情感词前面出现的否定词数量。如果否定词的数量是奇数,则表示这个情感词的情感倾向应该反转。例如,“不是好” 表示负面情感,因为有一个否定词 “不”。
通过使用 is_odd 函数,代码能够更准确地反映文本中的情感。例如,在处理类似于 “我不喜欢这个产品” 的句子时,函数帮助正确地识别出该句子传达的是负面情感。
1.2 导入情感词典
我们需要写一个函数从指定的文件中加载词典数据,并将其存储为一个集合,以便后续的情感分析使用。
这个函数在情感分析中起着关键角色,负责加载和管理各种情感词典。通过这个函数,可以简化代码、提高效率,并确保情感分析的准确性和灵活性。因此,它是实现情感分析系统不可或缺的组成部分。
def load_dict(self, file): """Load dictionary"""with open(file, encoding='utf-8', errors='ignore') as fp:lines = fp.readlines()lines = [l.strip() for l in lines]print("Load data from file (%s) finished !" % file)dictionary = [word.strip() for word in lines]return set(dictionary)
作用与重要性就可以实现统一管理词典
1集中加载:通过 load_dict 函数,所有的情感词典(如正面词、负面词、否定词等)都可以通过简单的函数调用进行加载,避免了重复代码。
2便于维护:如果需要更新词典,只需修改文件内容即可,而不必更改代码逻辑。
1.3 切分句子
1.3.1为什么划分
在情感分析中,一个句子可能包含多个分句,而这些分句所传达的情感可能截然不同。一个切分函数在这种情况下显得尤其重要,需要将复杂句子拆分为独立的子句,从而确保对每个分句的情感进行准确分析。
例如:
- 虽然这个产品性能很好,但它的价格却很高,我觉得不太划算。"
分割之后:
- [‘虽然这个产品性能很好’, ‘但它的价格却很高’, ‘我觉得不太划算’]
情感分析的应用
- 逐句情感评估:
第一句:“虽然这个产品性能很好”表达了正面情感。
第二句:“但它的价格却很高”引入了负面情感,暗示价格是一个问题。
第三句:“我觉得不太划算”进一步强调了负面情感。 - 情感冲突识别:
通过分句,情感分析可以清楚地识别出文本中的情感冲突。第一句的正面情感和后两句的负面情感形成对比,表明用户对产品的综合评价并不完全积极。 - 综合情感得分:
通过分析每个分句的情感,分析系统可以计算出整体情感得分,可能得出一个中性或略偏负面的结论。这种方法比简单分析整个句子要准确得多,因为它考虑了句子内部的复杂情感变化。
1.3.2 划分代码
我们可以借助正则表达式。使用正则表达式将输入的长文本分割成多个短句,能够识别多种标点符号(如句号、问号、感叹号等)作为分隔符。
同时需要去除空字符串,这样确保返回的结果中不包含空字符串,返回有效的子句列表。
def sentence_split_regex(self, sentence):"""Segmentation of sentence"""if sentence is not None:sentence = re.sub(r"–+|—+", "-", sentence)sub_sentence = re.split(r"[。,,!!??;;\s…~~]+|\.{2,}|…+| +|_n|_t", sentence)sub_sentence = [s for s in sub_sentence if s != '']if sub_sentence != []:return sub_sentenceelse:return [sentence]return []
1.4 完整代码
import reclass ToolGeneral():"""Tool function"""def is_odd(self,num):if num % 2 == 0:return 'even'else:return 'odd' def load_dict(self,file): """Load dictionary"""with open(file,encoding='utf-8',errors='ignore') as fp:lines = fp.readlines()lines = [l.strip() for l in lines]print("Load data from file (%s) finished !"%file)dictionary = [word.strip() for word in lines]return set(dictionary)def sentence_split_regex(self,sentence):"""Segmentation of sentence"""if sentence is not None:sentence = re.sub(r"–+|—+", "-", sentence)sub_sentence = re.split(r"[。,,!!??;;\s…~~]+|\.{2,}|…+| +|_n|_t", sentence)sub_sentence = [s for s in sub_sentence if s != '']if sub_sentence != []:return sub_sentenceelse:return [sentence]return []if __name__ == "__main__": #tool = ToolGeneral() #s = '我今天你现在在干嘛。昨天上午,还有现在'ls = tool.sentence_split_regex(s)print(ls)
结果:

2.导入词典
-
环境准备
首先,确保你已经导入必要的库,并且定义了 ToolGeneral 类。你还需要确保字典文件的路径正确。 -
Hyperparams 类的定义
接下来,我们定义一个名为 Hyperparams 的类,其中包含多个静态属性,这些属性用于加载不同的情感字典和副词字典。 -
加载情感字典
在 Hyperparams 类中,我们通过调用 load_dict 方法来加载情感字典。这些字典通常用于情感分析,分别表示否定词、正面词和负面词。
import ostool = ToolGeneral()
pwd = os.getcwd()class Hyperparams:'''Hyper parameters'''# Load sentiment dictionarydeny_word = tool.load_dict(os.path.join(pwd,'dict','not.txt'))posdict = tool.load_dict(os.path.join(pwd,'dict','positive.txt'))negdict = tool.load_dict(os.path.join(pwd,'dict', 'negative.txt'))pos_neg_dict = posdict|negdict# Load adverb dictionarymostdict = tool.load_dict(os.path.join(pwd,'dict','most.txt'))verydict = tool.load_dict(os.path.join(pwd,'dict','very.txt'))moredict = tool.load_dict(os.path.join(pwd,'dict','more.txt'))ishdict = tool.load_dict(os.path.join(pwd,'dict','ish.txt'))insufficientlydict = tool.load_dict(os.path.join(pwd,'dict','insufficiently.txt'))overdict = tool.load_dict(os.path.join(pwd,'dict','over.txt'))inversedict = tool.load_dict(os.path.join(pwd,'dict','inverse.txt'))
导入成功就会现实finish

这些词典包含了否定词

积极情感词,和消极情感词


为了保障这个精准度,那还需要程度词

以及包含了其他各种可能影响的词

3.中文情感分析算法思路
设计了一个情感分析的类 SentimentAnalysis,其主要功能是分析文本的情感倾向,返回正面和负面情感的分值。以下是逐步解析其实现思路的详细说明。
代码如下:
import os
import sys
import jieba
import numpy as nptool = ToolGeneral()
# jieba.load_userdict(os.path.join(os.path.dirname('./dict', 'dict','jieba_sentiment.txt'))
# dict_file = os.path.join(os.path.dirname(os.path.abspath('')), 'dict', 'jieba_sentiment.txt')class SentimentAnalysis():"""Sentiment Analysis with some dictionarys""" def sentiment_score_list(self,dataset):seg_sentence = tool.sentence_split_regex(dataset)count1,count2 = [],[]for sentence in seg_sentence: words = jieba.lcut(sentence, cut_all=False)i = 0 a = 0 for word in words:"""poscount 积极词的第一次分值;poscount2 积极反转后的分值;poscount3 积极词的最后分值(包括叹号的分值) """poscount,negcount,poscount2,negcount2,poscount3,negcount3 = 0,0,0,0,0,0 # if word in Hyperparams.posdict : if word in ['好','真','实在'] and words[min(i+1,len(words)-1)] in Hyperparams.pos_neg_dict and words[min(i+1,len(words)-1)] != word:continueelse:poscount +=1c = 0for w in words[a:i]: # 扫描情感词前的程度词if w in Hyperparams.mostdict:poscount *= 4elif w in Hyperparams.verydict:poscount *= 3 elif w in Hyperparams.moredict:poscount *= 2 elif w in Hyperparams.ishdict:poscount *= 0.5elif w in Hyperparams.insufficientlydict:poscount *= -0.3 elif w in Hyperparams.overdict:poscount *= -0.5 elif w in Hyperparams.inversedict: c+= 1else:poscount *= 1if tool.is_odd(c) == 'odd': # 扫描情感词前的否定词数poscount *= -1.0poscount2 += poscountposcount = 0poscount3 = poscount + poscount2 + poscount3poscount2 = 0else:poscount3 = poscount + poscount2 + poscount3poscount = 0a = i+1elif word in Hyperparams.negdict: # 消极情感的分析,与上面一致 if word in ['好','真','实在'] and words[min(i+1,len(words)-1)] in Hyperparams.pos_neg_dict and words[min(i+1,len(words)-1)] != word:continueelse:negcount += 1d = 0for w in words[a:i]: if w in Hyperparams.mostdict:negcount *= 4elif w in Hyperparams.verydict:negcount *= 3elif w in Hyperparams.moredict:negcount *= 2elif w in Hyperparams.ishdict:negcount *= 0.5elif w in Hyperparams.insufficientlydict:negcount *= -0.3elif w in Hyperparams.overdict:negcount *= -0.5elif w in Hyperparams.inversedict:d += 1else:negcount *= 1if tool.is_odd(d) == 'odd':negcount *= -1.0negcount2 += negcountnegcount = 0negcount3 = negcount + negcount2 + negcount3negcount2 = 0else:negcount3 = negcount + negcount2 + negcount3negcount = 0a = i + 1 i += 1pos_count = poscount3neg_count = negcount3count1.append([pos_count,neg_count]) if words[-1] in ['!','!']:# 扫描感叹号前的情感词,发现后权值*2count1 = [[j*2 for j in c] for c in count1]for w_im in ['但是','但']:if w_im in words : # 扫描但是后面的情感词,发现后权值*5ind = words.index(w_im)count1_head = count1[:ind]count1_tail = count1[ind:] count1_tail_new = [[j*5 for j in c] for c in count1_tail]count1 = []count1.extend(count1_head)count1.extend(count1_tail_new)break if words[-1] in ['?','?']:# 扫描是否有问好,发现后为负面count1 = [[0,2]]count2.append(count1)count1=[]return count2def sentiment_score(self,s):senti_score_list = self.sentiment_score_list(s)if senti_score_list != []:negatives=[]positives=[]for review in senti_score_list:score_array = np.array(review)AvgPos = np.sum(score_array[:,0])AvgNeg = np.sum(score_array[:,1]) negatives.append(AvgNeg)positives.append(AvgPos) pos_score = np.mean(positives) neg_score = np.mean(negatives)if pos_score >=0 and neg_score<=0:pos_score = pos_scoreneg_score = abs(neg_score)elif pos_score >=0 and neg_score>=0:pos_score = pos_scoreneg_score = neg_score else:pos_score,neg_score=0,0return pos_score,neg_scoredef normalization_score(self,sent):score1,score0 = self.sentiment_score(sent)if score1 > 4 and score0 > 4:if score1 >= score0:_score1 = 1_score0 = score0/score1 elif score1 < score0:_score0 = 1_score1 = score1/score0 else :if score1 >= 4 :_score1 = 1elif score1 < 4 :_score1 = score1/4if score0 >= 4 :_score0 = 1elif score0 < 4 :_score0 = score0/4 return _score1,_score0
4.1情感词获取思路
- 情感分值列表计算
def sentiment_score_list(self, dataset):
该方法接收一个数据集(文本)并返回每个句子的情感分值列表。
2句子切分,用上面定义的方法进行切分句子
其中,seg_sentence = tool.sentence_split_regex(dataset)。使用 sentence_split_regex 方法将输入文本分割成独立句子。
count1, count2 = [], [] count1 用于存储每个句子的情感分值,count2 用于存储所有句子的情感分值。
3 使用下面的算法遍历每个句子
for sentence in seg_sentence:words = jieba.lcut(sentence, cut_all=False)
对每个句子进行分词,得到词汇列表。
4 情感词分析
for word in words:poscount, negcount, poscount2, negcount2, poscount3, negcount3 = 0, 0, 0, 0, 0, 0```
初始化情感计数器:正面和负面情感的计数器以及它们的临时值。5 正面情感词处理
```python
if word in Hyperparams.posdict:
检查当前词是否在正面词典中。
如果是,遍历其之前的词,分析程度词的影响并调整 poscount。
5.1 程度词影响
if w in Hyperparams.mostdict:poscount *= 4 # 加强
根据程度词(如 “非常”、“极其” 等)调整正面情感的分值。
5.2 否定词处理
if tool.is_odd(c) == 'odd':poscount *= -1.0
检查是否存在奇数个否定词,如果存在,反转正面情感的得分。
6 负面情感词处理
elif word in Hyperparams.negdict:
与正面情感处理类似,检查当前词是否在负面词典中,并进行相应分析。
7 特殊情况处理
检查句子末尾的感叹号和问号,影响情感得分。
if words[-1] in ['!','!']:count1 = [[j*2 for j in c] for c in count1]
如果句子以感叹号结尾,将情感分值加倍。
4.2 计算情感分值
sentiment_score 这段代码通过计算输入文本中每个句子的情感得分,最终得出整体的正面和负面分值。它有效地整合了多句子的情感分析结果,考虑了分值的符号和特殊情况,确保了返回的情感得分具有合理性和准确性。这种方法适用于对评论或长文本进行情感倾向的评估。
def sentiment_score(self, s):
该方法计算输入文本的整体情感得分。
1 获取情感分值列表
senti_score_list = self.sentiment_score_list(s)
调用 sentiment_score_list 方法获取每个句子的情感分值。
2 计算平均分值
AvgPos = np.sum(score_array[:,0])
AvgNeg = np.sum(score_array[:,1])
计算所有句子正面和负面情感的平均分值。
4.3 得分的归一化处理
为了对情感分值进行合理的归一化处理,以便在不同情感强度的情况下保持分值的可比性和一致性。通过这种方式,分析结果可以更清晰地反映出文本的情感倾向,同时在高分和低分情况下采取不同的归一化策略,以适应不同的情感表达强度。这样的设计使得情感分析结果在实际应用中更具实用性和可解释性
def normalization_score(self, sent):
- 高分情况下的处理
if score1 >= score0:_score1 = 1_score0 = score0 / score1
elif score1 < score0:_score0 = 1_score1 = score1 / score0
该方法对情感得分进行归一化处理,返回标准化后的正面和负面分值。
根据正面和负面分值的大小关系进行归一化,使得分值在一定范围内更加平衡和可比较。
归一化逻辑:
如果正面得分大于或等于负面得分,设置正面得分 _score1 为 1,并将负面得分 _score0 归一化为其相对于正面得分的比例。
反之,如果负面得分更高,设置负面得分 _score0 为 1,并将正面得分 _score1 归一化为其相对于负面得分的比例。
else:if score1 >= 4:_score1 = 1elif score1 < 4:_score1 = score1 / 4if score0 >= 4:_score0 = 1elif score0 < 4:_score0 = score0 / 4
处理低分情况:
如果正面得分大于或等于 4,则将其归一化为 1。
如果正面得分小于 4,则将其归一化为其与 4 的比例。
对负面得分采用相同的逻辑。
这部分设计意图在于确保即使在情感表达较弱的情况下,分值也能在一个合理的范围内进行比较和理解。
4.实证
#计算完一条评论所有分句的情感值([正面分值, 负面分值]),用数组(list) 记录起来。
sa = SentimentAnalysis()
text = '虽然这个产品性能很好,但它的价格却很高,我觉得不太划算'
print(sa.normalization_score(text))
(0.25, 0.08333333333333333)
这样就可以得到正面和负面的情感得分,判断出来情感倾向
5.总结
本次代码通过分词、情感词典分析、程度词和否定词处理等步骤,构建了一个完整的情感分析流程。它能够从输入的文本中提取情感信息,并计算出正面和负面的情感得分,最终提供一个归一化的情感评分。通过这种方式,情感分析能够有效地捕捉文本中的情感表达,支持情感理解和决策。
代码词典获取链接,点赞关注,失效留言,或私信,提取码1111
相关文章:
【学术小白的学习之路】基于情感词典的中文句子情感分析(代码词典获取在结尾)
【学术小白的学习之路】基于情感词典的情感分析 1.基础函数1.1 判断情感词的否定词数量1.2 导入情感词典1.3 切分句子1.3.1为什么划分1.3.2 划分代码 1.4 完整代码 2.导入词典3.中文情感分析算法思路4.1情感词获取思路4.2 计算情感分值4.3 得分的归一化处理 4.实证5.总结 本文的…...
Linux 中 grep、sed、awk 命令
1. awk:强大的文本分析工具 awk,全称“Awk语言”,是一种专门用于处理文本文件的语言。它不仅能够根据关键字匹配某一行,还能进行复杂的文本分析和处理。awk的语法简洁明了,功能强大,是文本处理领域的佼佼者…...
一起考高项啊--现代化基础设施(工业互联网)
1、工业互联网的内涵和外延 工业互联网不是互联网在工作的简单应用,是具有更为丰富的内涵和外延。 它既是工业数字化、网络化、智能化转型的基础设施,也是互联网、大数据、人工智能与实体经济深度融合的应用模式,同时也是一种新业态、新产业…...
python学opencv|读取图像(二十)使用cv2.circle()绘制圆形进阶
【1】引言 前序已经掌握了使用cv2.circle()绘制圆形的基本操作,相关链接为: python学opencv|读取图像(二十)使用cv2.circle()绘制圆形-CSDN博客 由于圆形本身绘制起来比较简单,因此可以自由操作的空间也就大&#x…...
期权懂|如何减小个股期权交易中的风险?
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 如何减小个股期权交易中的风险? 一、选择合适的期权合约 (1)选择活跃的期权合约:投资者应优先选择交易活跃的期权合约。交易活跃的…...
ubuntu20.04 wget下载--段错误 (核心已转储)
用wget下载时总是在快下载完成时遇到段错误 untu2004-9.1.0_1.0-1_am 99%[> ] 1.63G 3.11MB/s 剩余 1s s段错误 (核心已转储)有以下两种解决方法: 1.手动下载 wget后面就是要下载的资源的链接,直接复制到浏览器中下载即可 如:…...
怎么样保持mysql和redis数据一致性
保持 MySQL 和 Redis 数据的一致性是一个常见的挑战,因为 MySQL 是传统的关系型数据库,而 Redis 是内存数据库,通常用于缓存和高性能存储。这两者的数据更新方式不同,特别是当 Redis 用作缓存时,可能会存在缓存和数据库之间的数据不一致问题。为了保持数据一致性,通常可以…...
剑指Offer|LCR 013. 二维区域和检索 - 矩阵不可变
LCR 013. 二维区域和检索 - 矩阵不可变 给定一个二维矩阵 matrix,以下类型的多个请求: 计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2) 。 实现 NumMatrix 类: NumMatrix(…...
aosp15 - Activity生命周期切换
本文探查的是,从App冷启动后到MainActivity生命周期切换的系统实现。 调试步骤 在com.android.server.wm.RootWindowContainer#attachApplication 方法下断点,为了attach目标进程在com.android.server.wm.ActivityTaskSupervisor#realStartActivityLock…...
vxe-table 虚拟滚动的动态响应
虚拟滚动主要是在有限范围内渲染想要显示的数据,主要体现在懒加载数据和动态渲染上。如何提高虚拟滚动的操作性呢?请看本章解析 1.什么是虚拟滚动?代码如何实现? VXE-Table提供了一种名为“虚拟滚动”的功能,该功能可…...
quasar dev 命令卡住很久
别以为这是一个瞬间的截图,其实停留在这里很久很久。 折腾挺久,无论npm run dev:proxy还是 quasar dev,都是一样的情况。 最终解决办法: 有语法问题,通过 quasar build 命令暴露出来错误所在的行数。...
黑盒RCE测试 异或测试
前言 了解了漏洞的原理之后就需要知道 他在哪能出现 并且被利用 这个还是很重要的 异或测试 使用异或(XOR)运算进行加密解密的原理_异或加密-CSDN博客 异或测试是在 白盒内执行的 一个例题看一下 输入什么都是会报错 这种情况就需要使用 异或计…...
kotlin中泛型中in和out的区别
概念含义 in关键字(逆变) 在Kotlin泛型中,in关键字主要用于定义逆变(Contravariance)。它表示一个泛型类型参数可以是指定类型或者它的超类型。简单来说,就是对于类型A和B,如果A是B的子类型&…...
c# iis 解决跨域问题
该错误是一个典型的跨域问题,说明从 http://www.fuc.com 发起的请求被目标服务器(https://aip.baidubce.com)拒绝,原因是目标服务器未返回正确的 AccessControlAllowOrigin 响应头。 解决方法 1. 了解问题的本质 CORS(…...
MySQL版本对应的mysql-connector-java版本下载地址
MySQL版本mysql-connector-java版本mysql-connector-java下载地址MySQL安装版下载地址MySQL免安装版下载地址5.1.x5.1.xmysql-connector-java 5.1.xMySQL Installer 5.1.xMySQL Community Server 5.1.x5.5.x5.1.x, 5.5.x mysql-connector-java 5.1.x, mysql-connector-java 5.5…...
【读书笔记】《论语别裁》爱与罪
一、内容摘要 《论语别裁》第01章讨论了孔子关于孝悌的思想,以及其在中国文化中的重要性和复杂性。文中引用了有子的观点,强调孝弟是为人之本。然而,随着历史的发展,孔子的思想也被误解或被用作维护专制统治的工具。通过司马迁的…...
uniApp上传文件踩坑日记
最近在做移动端app,开始接触uniapp。想着直接用PC端的前后端API去做文件上传,但是uniapp的底层把请求拆成了普通请求和文件上传请求,所以不能用一个axios去做所有请求的处理,拆成uni.request和uni.uploadFile去分别处理两种情况。…...
Webhook 是什么?详解其工作原理
在现代技术中,一切都相互连接,每个应用程序通过许多服务的组合和协调实现无缝工作。这种协调是通过 webhooks 实现的。 Webhooks 是基于 HTTP 的回调函数,其中一个服务使用 API 立即通知另一个服务发生的事件。这就是简单的版本。从技术上讲…...
log4j2漏洞复现(CVE-2021-44228)
靶场环境 步骤一:设置出战规则 步骤二:开启靶场 cd vulhub cd log4j cd CVE-2021-44228 docker-compose up -d docker ps 访问端口 靶机开启 步骤三:外带注入 获得dnslog 靶机访问dnslog 得到dnslog的二级域名信息 步骤四:构造…...
tcpdump抓包分析
使用tcpdump进行抓包分析是一个常见的网络诊断和分析任务。以下是如何使用tcpdump进行抓包和分析的一些基本步骤和技巧: 1. 基本抓包 首先,你需要确定要抓取数据包的网络接口。可以使用ifconfig或ip addr命令查看网络接口。然后,使用以下命…...
IM系统核心不是聊天?深入剖析SpringBoot+Netty项目中关系链与群组模块的设计陷阱
IM系统核心不是聊天?深入剖析SpringBootNetty项目中关系链与群组模块的设计陷阱 当大多数人谈论即时通讯系统时,首先想到的是消息收发功能。然而,真正让微信、QQ等产品形成护城河的,并非简单的消息传输能力,而是其背后…...
Claude中转安全测评出炉:快快云安全Claude中转跻身行业第一梯队
2026年4月,国内AI安全与模型接入服务专项测评发布最新结果,本次测评覆盖传输加密、隐私合规、稳定性、抗攻击、接口兼容五大核心维度,对国内外主流Claude中转服务进行全面检验,快快云安全(快快网络旗下安全品牌&#x…...
Ansible AWX实战:5分钟搞定Web界面管理你的Playbook
Ansible AWX实战:5分钟极速部署与高效运维指南 当Ansible遇上AWX,运维效率将迎来质的飞跃。想象一下,原本需要在命令行反复敲击的Playbook,现在只需在浏览器中轻点几下就能完成编排、执行和监控——这正是AWX赋予运维团队的超能力…...
FREE!ship Plus终极指南:免费开源船舶设计软件完整教程
FREE!ship Plus终极指南:免费开源船舶设计软件完整教程 【免费下载链接】freeship-plus-in-lazarus FreeShip Plus in Lazarus 项目地址: https://gitcode.com/gh_mirrors/fr/freeship-plus-in-lazarus 想要设计专业的船舶模型却苦于高昂的软件费用ÿ…...
【42】软考软件设计师——设计模式代码实战|单例/工厂/策略/观察者 真实业务案例精讲
摘要:本文是《软件设计师50讲通关|从零基础到工程师职称》专栏第42篇,属于模块五:算法与代码实战强化第四篇,聚焦软考上午选择题与下午代码填空题四大高频设计模式:单例模式(双重检查锁)、工厂模式、策略模式、观察者模式。全文超4800字,搭配Mermaid类图/时序图清晰展…...
从注册到调用:手把手玩转SiliconFlow与DeepSeek-R1模型
1. 硅基流动平台注册指南 第一次接触SiliconFlow(硅基流动)时,我也被它简洁的界面和强大的模型支持所吸引。这个平台最大的优势在于它集成了包括DeepSeek-R1在内的多个热门开源模型,而且调用方式与OpenAI API高度兼容,…...
使用Alpine配置WSL ssh门户追
1. 哑铃图是什么? 哑铃图(Dumbbell Plot),有时也称为DNA图或杠铃图,是一种用于比较两个相关数据点的可视化图表。 它源于人们对更有效数据比较方式的持续探索。 在传统的时间序列比较中,我们通常使用两条折…...
从原理到实战:在虚拟环境中重现永恒之蓝对Win7的攻防
1. 永恒之蓝漏洞的前世今生 2017年那场席卷全球的网络风暴,至今仍让很多IT从业者心有余悸。当时一个名为"永恒之蓝"的漏洞利用工具被公开,随即引发了WannaCry勒索病毒的全球大爆发。医院系统瘫痪、企业数据被锁、政府机构停摆...这些场景都源于…...
Hive视图实战:从创建到删除,一个完整的学生信息视图案例(附避坑点)
Hive视图实战:从创建到删除,一个完整的学生信息视图案例(附避坑点) 在数据分析的日常工作中,我们常常需要处理结构复杂的数据表。想象一下这样的场景:你手头有一张包含学生详细信息的大表,每次查…...
别再手写Verilog了!用Simulink HDL Coder快速搭建FPGA原型(附避坑指南)
从算法模型到硬件实现:Simulink HDL Coder高效FPGA开发实战 在数字信号处理和通信系统开发领域,FPGA因其并行计算能力和可重构特性成为算法加速的理想平台。然而,传统手写Verilog/VHDL的开发模式存在几个显著痛点:开发周期长&…...
