C2W1.Assignment.Autocorrect.Part2

理论课:C2W1.Auto-correct

文章目录

  • 3. Combining the edits
    • 3.1 Exercise 8.Edit one letter
    • 3.2 Exercise 9.Edit two letters
    • 3.3 Exercise 10.suggest spelling suggestions
  • 4. Minimum Edit Distance
    • 4.1 Dynamic Programming
    • Exercise 11
    • Test All-in-one
  • 5. Backtrace (Optional)

理论课: C2W1.Auto-correct

Part1在这里

3. Combining the edits

有了上面的四种操作,下面就是要实现单个和两个字母的编辑函数:edit_one_letter()edit_two_letters()

3.1 Exercise 8.Edit one letter

完成edit_one_letter,对给定单词完成一个编辑距离的修改,由于switch不是常规操作,函数对是否需要添加switch操作设置了参数"allow_switches"。

# UNIT TEST COMMENT: Candidate for Table Driven Tests
# UNQ_C8 GRADED FUNCTION: edit_one_letter
def edit_one_letter(word, allow_switches = True):"""Input:word: the string/word for which we will generate all possible wordsthat are one edit away.Output:edit_one_set: a set of words with one possible edit. Please return a set. and not a list."""edit_one_set = set()### START CODE HERE ###edit_one_set.update(delete_letter(word))if allow_switches:edit_one_set.update(switch_letter(word))edit_one_set.update(replace_letter(word))edit_one_set.update(insert_letter(word))### END CODE HERE #### return this as a set and not a listreturn set(edit_one_set)

测试:

tmp_word = "at"
tmp_edit_one_set = edit_one_letter(tmp_word)
# turn this into a list to sort it, in order to view it
tmp_edit_one_l = sorted(list(tmp_edit_one_set))print(f"input word {tmp_word} \nedit_one_l \n{tmp_edit_one_l}\n")
print(f"The type of the returned object should be a set {type(tmp_edit_one_set)}")
print(f"Number of outputs from edit_one_letter('at') is {len(edit_one_letter('at'))}")

结果:
input word at
edit_one_l
[‘a’, ‘aa’, ‘aat’, ‘ab’, ‘abt’, ‘ac’, ‘act’, ‘ad’, ‘adt’, ‘ae’, ‘aet’, ‘af’, ‘aft’, ‘ag’, ‘agt’, ‘ah’, ‘aht’, ‘ai’, ‘ait’, ‘aj’, ‘ajt’, ‘ak’, ‘akt’, ‘al’, ‘alt’, ‘am’, ‘amt’, ‘an’, ‘ant’, ‘ao’, ‘aot’, ‘ap’, ‘apt’, ‘aq’, ‘aqt’, ‘ar’, ‘art’, ‘as’, ‘ast’, ‘ata’, ‘atb’, ‘atc’, ‘atd’, ‘ate’, ‘atf’, ‘atg’, ‘ath’, ‘ati’, ‘atj’, ‘atk’, ‘atl’, ‘atm’, ‘atn’, ‘ato’, ‘atp’, ‘atq’, ‘atr’, ‘ats’, ‘att’, ‘atu’, ‘atv’, ‘atw’, ‘atx’, ‘aty’, ‘atz’, ‘au’, ‘aut’, ‘av’, ‘avt’, ‘aw’, ‘awt’, ‘ax’, ‘axt’, ‘ay’, ‘ayt’, ‘az’, ‘azt’, ‘bat’, ‘bt’, ‘cat’, ‘ct’, ‘dat’, ‘dt’, ‘eat’, ‘et’, ‘fat’, ‘ft’, ‘gat’, ‘gt’, ‘hat’, ‘ht’, ‘iat’, ‘it’, ‘jat’, ‘jt’, ‘kat’, ‘kt’, ‘lat’, ‘lt’, ‘mat’, ‘mt’, ‘nat’, ‘nt’, ‘oat’, ‘ot’, ‘pat’, ‘pt’, ‘qat’, ‘qt’, ‘rat’, ‘rt’, ‘sat’, ‘st’, ‘t’, ‘ta’, ‘tat’, ‘tt’, ‘uat’, ‘ut’, ‘vat’, ‘vt’, ‘wat’, ‘wt’, ‘xat’, ‘xt’, ‘yat’, ‘yt’, ‘zat’, ‘zt’]

The type of the returned object should be a set <class ‘set’>
Number of outputs from edit_one_letter(‘at’) is 129

3.2 Exercise 9.Edit two letters

根据edit_one_letter函数完成edit_two_letters

# UNIT TEST COMMENT: Candidate for Table Driven Tests
# UNQ_C9 GRADED FUNCTION: edit_two_letters
def edit_two_letters(word, allow_switches = True):'''Input:word: the input string/word Output:edit_two_set: a set of strings with all possible two edits'''edit_two_set = set()### START CODE HERE ###edit_one = edit_one_letter(word,allow_switches)for w in edit_one:edit_two_set.update(edit_one_letter(w,allow_switches))### END CODE HERE #### return this as a set instead of a listreturn set(edit_two_set)

测试:

tmp_edit_two_set = edit_two_letters("a")
tmp_edit_two_l = sorted(list(tmp_edit_two_set))
print(f"Number of strings with edit distance of two: {len(tmp_edit_two_l)}")
print(f"First 10 strings {tmp_edit_two_l[:10]}")
print(f"Last 10 strings {tmp_edit_two_l[-10:]}")
print(f"The data type of the returned object should be a set {type(tmp_edit_two_set)}")
print(f"Number of strings that are 2 edit distances from 'at' is {len(edit_two_letters('at'))}")

3.3 Exercise 10.suggest spelling suggestions

实现get_corrections函数,它返回一个由 0 到 n 个可能的建议元组组成的列表,其形式为 (word, probability_of_word)。
大概步骤如下:
步骤1:使用前面完成的编辑功能,为提供的单词生成建议,生成建议需要遵循如下原则:具体编辑次数较少的词比编辑次数较多的词更有可能产生。具体为:

  • 如果词汇表中有该词,则优先建议使用该词。
  • 否则,如果词汇表中有来自edit_one_letter的建议,则优先使用这些建议。
  • 否则,如果词汇表中有来自edit_two_letters的建议,则优先使用这些建议。
  • 否则,建议使用输入的单词。

这里为了更高效的判断以上原则,使用了Python中的Short circuit技巧,具体看代码:

# example of logical operation on lists or sets
print( [] and ["a","b"] )
print( [] or ["a","b"] )
#example of Short circuit behavior
val1 =  ["Most","Likely"] or ["Less","so"] or ["least","of","all"]  # selects first, does not evalute remainder
print(val1)
val2 =  [] or [] or ["least","of","all"] # continues evaluation until there is a non-empty list
print(val2)

结果:
[]
[‘a’, ‘b’]
[‘Most’, ‘Likely’]
[‘least’, ‘of’, ‘all’]

在Python中,and 和 or 运算符不仅用于布尔逻辑,还可以用于非布尔值,包括列表(lists)。以下是Short circuit技巧的总结:

print( [] and ["a","b"] )

这里,空列表 [] 被视为 False,而非空列表 [“a”,“b”] 被视为 True。
and 运算符在遇到第一个 False 值时会停止计算,因此这个表达式的结果为 []。

print( [] or ["a","b"] )

or 运算符在遇到第一个 True 值时会停止计算。
由于 [“a”,“b”] 是 True,表达式的结果为 [“a”,“b”]。

val1 = ["Most","Likely"] or ["Less","so"] or ["least","of","all"]

这是一个连续的 or 运算,or 运算符从左到右计算,直到遇到第一个非空(True)值。
val1 将被赋值为 [“Most”,“Likely”],因为这是第一个非空列表。

val2 = [] or [] or ["least","of","all"]

这里连续使用 or 运算符,但前两个操作数都是空列表(False)。
or 运算符会继续计算,直到遇到最后一个非空列表 [“least”,“of”,“all”]。

总的来说:

  • and 运算符在遇到第一个 False 值时会停止计算,并返回该值。
  • or 运算符在遇到第一个 True 值时会停止计算,并返回该值。
  • 这种计算行为被称为“短路”(short-circuiting),因为它避免了对表达式其余部分的不必要计算。

步骤2:创建一个best_words字典,其中key是一个建议,value是该词在词汇表中出现的概率。如果词汇表中没有该词,则将其概率定为 0。+
步骤3:选择前 n 个最佳建议。当然,建议结果可能少于 n 个。

# UNIT TEST COMMENT: Candidate for Table Driven Tests
# UNQ_C10 GRADED FUNCTION: get_corrections
def get_corrections(word, probs, vocab, n=2, verbose = False):'''Input: word: a user entered string to check for suggestionsprobs: a dictionary that maps each word to its probability in the corpusvocab: a set containing all the vocabularyn: number of possible word corrections you want returned in the dictionaryOutput: n_best: a list of tuples with the most probable n corrected words and their probabilities.'''suggestions = []n_best = []### START CODE HERE ###entered_word=word#Step 1: create suggestions as described above    suggestions = list((word in vocab) or edit_one_letter(word).intersection(vocab) or edit_two_letters(word).intersection(vocab) or word)#Step 2: determine probability of suggestionsbest_words = {}for word in suggestions:if word not in vocab:best_words[word]=0continuebest_words[word]=probs.get(word,0)#Step 3: Get all your best words and return the most probable top n_suggested words as n_bestn_best= sorted(best_words.items(), key=lambda x: x[1], reverse=True)[:n]### END CODE HERE ###if verbose: print("entered word = ", entered_word, "\nsuggestions = ", suggestions)return n_best

测试:

# Test your implementation - feel free to try other words in my word
my_word = 'dys' 
tmp_corrections = get_corrections(my_word, probs, vocab, 2, verbose=True) # keep verbose=True
for i, word_prob in enumerate(tmp_corrections):print(f"word {i}: {word_prob[0]}, probability {word_prob[1]:.6f}")# CODE REVIEW COMMENT: using "tmp_corrections" insteads of "cors". "cors" is not defined
print(f"data type of corrections {type(tmp_corrections)}")

结果:
entered word = dys
suggestions = [‘dye’, ‘days’]
word 0: days, probability 0.000410
word 1: dye, probability 0.000019
data type of corrections <class ‘list’>

4. Minimum Edit Distance

虽然已经基本实现了自动更正,但是还有一些没有解决的问题,例如:
如何评估两个字符串之间的相似性?例如:“waht”和 "what”
如何有效地找到从单词 “waht”到单词 “what”的最短路径?
这一节将利用动态编程,找出一个字符串转换成另一个字符串所需的最少编辑次数。

4.1 Dynamic Programming

动态编程将问题分解为多个子问题,这些子问题可以组合起来形成最终解决方案。在这里,给定一个字符串源[0…i]和一个字符串目标[0…j],我们将计算所有子串[i, j]的组合,并计算它们的编辑距离。为了高效地完成这项工作,可使用一个表格来保存之前计算过的子串,并使用这些子串来计算更大的子串。
初始化一个矩阵,并对矩阵中的每个元素进行如下更新:
Initialization D [ 0 , 0 ] = 0 D [ i , 0 ] = D [ i − 1 , 0 ] + d e l _ c o s t ( s o u r c e [ i ] ) D [ 0 , j ] = D [ 0 , j − 1 ] + i n s _ c o s t ( t a r g e t [ j ] ) (4) \text{Initialization}\\ \begin{aligned} D[0,0] &= 0 \\ D[i,0] &= D[i-1,0] + del\_cost(source[i]) \\ D[0,j] &= D[0,j-1] + ins\_cost(target[j]) \\ \end{aligned}\tag{4} InitializationD[0,0]D[i,0]D[0,j]=0=D[i1,0]+del_cost(source[i])=D[0,j1]+ins_cost(target[j])(4)

Per Cell Operations D [ i , j ] = m i n { D [ i − 1 , j ] + d e l _ c o s t D [ i , j − 1 ] + i n s _ c o s t D [ i − 1 , j − 1 ] + { r e p _ c o s t ; i f s r c [ i ] ≠ t a r [ j ] 0 ; i f s r c [ i ] = t a r [ j ] (5) \text{Per Cell Operations}\\ \begin{aligned} \\ D[i,j] =min \begin{cases} D[i-1,j] + del\_cost\\ D[i,j-1] + ins\_cost\\ D[i-1,j-1] + \left\{\begin{matrix} rep\_cost; & if src[i]\neq tar[j]\\ 0 ; & if src[i]=tar[j] \end{matrix}\right. \end{cases} \end{aligned}\tag{5} Per Cell OperationsD[i,j]=min D[i1,j]+del_costD[i,j1]+ins_costD[i1,j1]+{rep_cost;0;ifsrc[i]=tar[j]ifsrc[i]=tar[j](5)
根据以上公式,将play变成stay结果为:

#stay
#01234
p12345
l23456
a34545
y45654

主要操作为插入、删除和替换,没有用到交换操作。
下图为表格/矩阵的初始化(根据公式4),每个格子/元素代表从原字符串source[0:i]到目标字符串target[0:j]所需要的最小编辑代价/距离。第一列的初始化值是将原字符串"ERR"变成目标字符串""所需要的删除代价,如图所示:
"“→”"不要删除任何东西,代价为0
“E"→”"需要删除一个字母,代价为1

“EER"→”“需要删除三个字母,代价为3
第一行的初始化值是将原字符串”"变成目标字符串"NEAR"所需要的插入代价,如图所示:
""→"N"需要插入一个字母,代价为1

""→"NEAR"需要插入四个字母,代价为4

在这里插入图片描述
接下来根据公式5填充剩下的部分,需要注意的是,每个位置 D [ i , j ] D[i,j] D[i,j]要考虑三种情况,并取其中最小值(使用min_edit_distance()函数完成)
在这里插入图片描述
下图中给出了一个使用替换操作的编辑代价计算实例
在这里插入图片描述
仔细阅读右边绿色箭头对应的计算方法。图中的substitute/substitution跟之前提到的替换操作是一样的,只是说法不一样。

Exercise 11

# UNQ_C11 GRADED FUNCTION: min_edit_distance
def min_edit_distance(source, target, ins_cost = 1, del_cost = 1, rep_cost = 2):'''Input: source: a string corresponding to the string you are starting withtarget: a string corresponding to the string you want to end withins_cost: an integer setting the insert costdel_cost: an integer setting the delete costrep_cost: an integer setting the replace costOutput:D: a matrix of len(source)+1 by len(target)+1 containing minimum edit distancesmed: the minimum edit distance (med) required to convert the source string to the target'''# use deletion and insert cost as  1m = len(source) n = len(target) #initialize cost matrix with zeros and dimensions (m+1,n+1) D = np.zeros((m+1, n+1), dtype=int) ### START CODE HERE (Replace instances of 'None' with your code) #### Fill in column 0, from row 1 to row m, both inclusivefor row in range(1,m+1): # Replace None with the proper rangeD[row,0] = D[row-1,0] + del_cost# Fill in row 0, for all columns from 1 to n, both inclusivefor col in range(1,n+1): # Replace None with the proper rangeD[0,col] = D[0,col-1] + ins_cost# Loop through row 1 to row m, both inclusivefor row in range(1,m+1): # Loop through column 1 to column n, both inclusivefor col in range(1,n+1):# Intialize r_cost to the 'replace' cost that is passed into this functionr_cost = rep_cost# Check to see if source character at the previous row# matches the target character at the previous column, if source[row-1] == target[col-1]: # Replace None with a proper comparison# Update the replacement cost to 0 if source and target are the samer_cost = 0# Update the cost at row, col based on previous entries in the cost matrix# Refer to the equation calculate for D[i,j] (the minimum of three calculated costs)D[row,col] = min([D[row-1,col]+del_cost, D[row,col-1]+ins_cost, D[row-1,col-1]+r_cost])# Set the minimum edit distance with the cost found at row m, column n med = D[m,n]### END CODE HERE ###return D, med

测试:

# testing your implementation 
source =  'play'
target = 'stay'
matrix, min_edits = min_edit_distance(source, target)
print("minimum edits: ",min_edits, "\n")
idx = list('#' + source)
cols = list('#' + target)
df = pd.DataFrame(matrix, index=idx, columns= cols)
print(df)

结果:

minimum edits:  4#  s  t  a  y
#  0  1  2  3  4
p  1  2  3  4  5
l  2  3  4  5  6
a  3  4  5  4  5
y  4  5  6  5  4
# testing your implementation 
source =  'eer'
target = 'near'
matrix, min_edits = min_edit_distance(source, target)
print("minimum edits: ",min_edits, "\n")
idx = list(source)
idx.insert(0, '#')
cols = list(target)
cols.insert(0, '#')
df = pd.DataFrame(matrix, index=idx, columns= cols)
print(df)

结果:

minimum edits:  3 #  n  e  a  r
#  0  1  2  3  4
e  1  2  1  2  3
e  2  3  2  3  4
r  3  4  3  4  3

Test All-in-one

单个字母最小编辑距离结果:

source = "eer"
targets = edit_one_letter(source,allow_switches = False)  #disable switches since min_edit_distance does not include them
for t in targets:_, min_edits = min_edit_distance(source, t,1,1,1)  # set ins, del, sub costs all to oneif min_edits != 1: print(source, t, min_edits)

结果:
eer iir 2
eer bbr 2
eer zzr 2
eer qqr 2
eer ffr 2
eer jjr 2
eer ttr 2
eer vvr 2
eer ssr 2
eer llr 2
eer hhr 2
eer nnr 2
eer ddr 2
eer aar 2
eer oor 2
eer ppr 2
eer mmr 2
eer ccr 2
eer wwr 2
eer kkr 2
eer xxr 2
eer yyr 2
eer rrr 2
eer uur 2
eer ggr 2
两个字母最小编辑距离结果:

source = "eer"
targets = edit_two_letters(source,allow_switches = False) #disable switches since min_edit_distance does not include them
for t in targets:_, min_edits = min_edit_distance(source, t,1,1,1)  # set ins, del, sub costs all to oneif min_edits != 2 and min_edits != 1: print(source, t, min_edits)

结果:略,太长
eer zzrs 3
eer qppr 3
eer aary 3
eer nnkr 3
eer pprf 3
eer zxzr 3
eer qkqr 3
eer iio 3
eer llrg 3
eer ikir 3

5. Backtrace (Optional)

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

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

相关文章

javaScrip的学习(一)

目录 引言 一、java和JavaScript的联系 二、js中的弹出框 1.alert弹出框 2.confirm带确认取消的按钮弹框 3.prompt带有提示信息且带有输入框的弹框 4.输出到网页中 ​三、js引入方式 1. 放在script标签中 2.放在外部js文件中 四、执行顺序 五、书写规范 1. 语句结…

python爬虫基础——Webbot库介绍

本文档面向对自动化网页交互、数据抓取和网络自动化任务感兴趣的Python开发者。无论你是初学者还是有经验的开发者&#xff0c;Webbot库都能为你的自动化项目提供强大的支持。 Webbot库概述 Webbot是一个专为Python设计的库&#xff0c;用于简化网页自动化任务。它基于Seleniu…

Hi3751V560_SELinux

Hi3751V560_SELinux setenforce Enforcing setenforce Permissive(或“setenforce 0”) getenforce V560:demo本身的: [ 13.765161] type=1400 audit(1628821512.905:4): avc: denied { read } for pid=1926 comm="system_server" name="ifindex" d…

CCRC-DCO数据合规入表正式落地!全流程操作指南来啦!(业内专家总结)

数据合规已绝非大企业专属&#xff01; 随着《网络安全法》《数据安全法》《个人信息保护法》相继落地&#xff0c;只要企业涉及用户的各种信息&#xff0c;哪怕是中小企业也会面临数据合规的监管&#xff0c;从而产生相关的法律需求。 小到APP对个人信息数据的采集&#xff0c…

【深入C++】map和set的使用

文章目录 C 中的容器分类1. 顺序容器2. 关联容器3. 无序容器4. 容器适配器5. 字符串容器6. 特殊容器 set1.构造函数2.迭代器3.容量相关的成员函数4.修改器类的成员函数5.容器相关操作的成员函数 multiset1.equal_range map1.初始化相关的函数2.迭代器3.容量相关的成员函数4.访问…

AVL树的理解和实现[C++]

文章目录 AVL树AVL树的规则或原理 AVL树的实现1.节点的定义2.功能和接口等的实现默认构造函数&#xff0c;析构函数拷贝构造函数插入搜索打印函数检查是否为平衡树&#xff0c;检查平衡因子旋转 AVL树 AVL树&#xff0c;全称Adelson-Velsky和Landis树&#xff0c;是一种自平衡…

Java IO模型深入解析:BIO、NIO与AIO

Java IO模型深入解析&#xff1a;BIO、NIO与AIO 一. 前言 在Java编程中&#xff0c;IO&#xff08;Input/Output&#xff09;操作是不可或缺的一部分&#xff0c;它涉及到文件读写、网络通信等方面。Java提供了多种类和API来支持这些操作。本文将从IO的基础知识讲起&#xff…

智慧职校就业管理:开启校园招聘会新模式

在智慧职校的就业管理系统中&#xff0c;校园招聘会的出现&#xff0c;为学生们提供了一个展示自我、探寻职业道路的舞台&#xff0c;同时也为企业搭建了一座直面未来之星的桥梁。这一功能&#xff0c;凭借其独特的优势与前沿的技术&#xff0c;正在重新定义校园与职场之间的过…

【JVM基础06】——组成-直接内存详解

目录 1- 引言&#xff1a;直接内存概述1-1 直接内存是什么&#xff1f;直接内存的定义(What)1-2 为什么用直接内存&#xff1f;Java程序对直接内存的使用 (Why) 2- ⭐核心&#xff1a;详解直接内存(How)2-1 文件拷贝案例介绍对比常规 IO(BIO) 和 NIO常规 IO 的操作流程NIO 的操…

LeetCode 热题 HOT 100 (009/100)【宇宙最简单版】

【图论】No. 0207 课程表【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xff01…

小公司怎么申请企业邮箱?

小公司申请企业邮箱需要考虑哪些因素&#xff1f;小公司选择企业邮箱需考虑成本、功能、安全、支持等因素。小公司怎么申请企业邮箱呢&#xff1f;注册企业邮箱需填写企业信息、选择套餐并添加用户。 一、小公司申请企业邮箱考虑的因素 1、成本效益分析 预算规划&#xff1a…

Try ubuntu core (by quqi99)

作者&#xff1a;张华 发表于&#xff1a;2024-07-20 版权声明&#xff1a;可以任意转载&#xff0c;转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99) try ubuntu core on qemu #ovmf is to ensure compatibility with the re…

matlab--legend利用for循环添加图例

第一种方法 %% 第一种方法 R 1:4; THETA1 atand(R./1.8); legend_name {}; for i 1:4THETA atand(R(i)./1.8);intTheta floor(THETA);R_THERA 1.8 - (R(i)./tand(intTheta-10:intTheta10));R_THERA1 1.8 - (R(i)/tand(intTheta));plot(R_THERA);grid on;hold onlegend…

领夹麦克风哪个品牌好,电脑麦克风哪个品牌好,热门麦克风推荐

​在信息快速传播的时代&#xff0c;直播和视频创作成为了表达与交流的重要方式。对于追求卓越声音品质的创作者而言&#xff0c;一款性能卓越的无线麦克风宛如一把利剑。接下来&#xff0c;我要为大家介绍几款备受好评的无线麦克风&#xff0c;这些都是我在实际使用中体验良好…

SpringBoot大模型流式接口

话不多说&#xff0c;直接上货 import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSONObject; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.Re…

人工智能(AI)在办公场所的广泛应用

人工智能&#xff08;AI&#xff09;在办公场所的广泛应用正逐步改变着我们的工作方式和效率。随着技术的进步&#xff0c;越来越多的公司和组织开始采用各种AI技术来优化工作流程、提升生产力&#xff0c;并提供更好的用户体验。以下是人工智能在办公方面的一些主要作用和影响…

LeetCode 125.验证回文串 C++写法

LeetCode 125.验证回文串 C写法 思路&#x1f914;&#xff1a; 我们不对字符串进行删除&#xff0c;这样效率太低了&#xff0c;所以可以左右开工&#xff0c;下标begin和end遇到不是字母数字字符的就跳过&#xff0c;当两边都是字母就进行比对&#xff0c;一样就继续往后走&a…

PCL 批量处理点云文件

系列文章目录 文章目录 系列文章目录前言一、PCL是什么&#xff1f;二、配置PCL环境三、使用步骤1.引入库2.主函数 总结 前言 点云处理时往往会需要对多个点云进行处理&#xff0c;比如在预处理&#xff0c;保存点云时。下面提供一个简单的点云批量转换例子&#xff0c;PCD文件…

power bi 度量值相关函数

power bi 度量值相关函数 1. 度量值的好处2. 度量值上下文3. calculate() 函数4. 度量值存储方式 1. 度量值的好处 度量值不会增加一列&#xff0c;不会修改表格度量值自带筛选功能 2. 度量值上下文 新建行和新建度量值的区别 度量值是筛选上下文&#xff1a;度量值天生具有…

机器学习 | 阿里云安全恶意程序检测

目录 一、数据探索1.1 数据说明1.2 训练集数据探索1.2.1 数据特征类型1.2.2 数据分布1.2.3 缺失值1.2.4 异常值1.2.5 标签分布探索 1.3 测试集探索1.3.1 数据信息1.3.2 缺失值1.3.3 数据分布1.3.4 异常值 1.4 数据集联合分析1.4.1 file_id 分析1.4.2 API 分析 二、特征工程与基…