Python 阵列的简单递归剽窃检测器
我在考虑一个非常简单的剽窃检测器。为了简单起见,假设在beigning中有两个列表,每个列表都有一些字符串元素,例如:Python 阵列的简单递归剽窃检测器,python,list,Python,List,我在考虑一个非常简单的剽窃检测器。为了简单起见,假设在beigning中有两个列表,每个列表都有一些字符串元素,例如: l1 = [ "I","like","big","yellow","bananas" ] l2 = [ "I","like","yellow","bananas" ] 用户还可以指定每个操作的“成本”,比如: DeletePrice = 10 #deleting word from one list InsertPrice = 1 #in
l1 = [ "I","like","big","yellow","bananas" ]
l2 = [ "I","like","yellow","bananas" ]
用户还可以指定每个操作的“成本”,比如:
DeletePrice = 10 #deleting word from one list
InsertPrice = 1 #insterting a word to one list
SubstitutePrice = 24 #substituing a word for another one
任务是匹配列表,组合价格必须尽可能低。有两种明显的方法可以匹配这些数组,一种是从第一个数组中删除单词“big”(需要花费10美元),或者在第二个数组中插入单词“big”(需要花费1美元)。因此,该算法的答案为1
我在想,一开始我们应该通过列表理解来找到不匹配的元素:
def Plagiarism( l1,l2,dPrice,iPrice,sPrice ):
not_matching_elements = [ [ x for x in l1 if x not in l2 ],[ x for x in l2 if x not in l1 ] ]
不匹配元素
名单会给我们
[[big],][]
可能会帮助我们继续前进。但是我想不出一个方法来进一步发展这个算法。谢谢。您所描述的与Levenshtein距离非常相似: 您只需要数组条目而不是字符 你可以简单地找到一个levenstein算法,并根据你的需要进行修改 此算法甚至可能适用于数组;) 编辑:这项工作:
def levenshtein(s1, s2):
insertionCost=1
deletionCost=1
substitutionCost=1
if len(s1) < len(s2):
return levenshtein(s2, s1)
# len(s1) >= len(s2)
if len(s2) == 0:
return min(deletionCost,insertionCost)*len(s1)
previous_row = range(len(s2) + 1)
for i, c1 in enumerate(s1):
current_row = [i + 1]
for j, c2 in enumerate(s2):
insertions = previous_row[j + 1] + insertionCost # j+1 instead of j since previous_row and current_row are one character longer
deletions = current_row[j] + deletionCost # than s2
substitutions = previous_row[j] + substitutionCost*(c1 != c2)
current_row.append(min(insertions, deletions, substitutions))
previous_row = current_row
return previous_row[-1]
#returns 2
print(levenshtein(['abc','def','ghi'],['abc','ghi','e']))
def levenshtein(s1,s2):
insertionCost=1
删除成本=1
替代成本=1
如果len(s1)=len(s2)
如果len(s2)==0:
返回最小值(删除成本、插入成本)*长度(s1)
上一行=范围(len(s2)+1)
对于i,枚举中的c1(s1):
当前_行=[i+1]
对于枚举(s2)中的j,c2:
insertions=上一行[j+1]+insertionCost#j+1而不是j,因为上一行和当前行长一个字符
删除=当前_行[j]+删除成本#小于s2
替换=上一行[j]+替换成本*(c1!=c2)
当前行追加(最小值(插入、删除、替换))
上一行=当前行
返回上一行[-1]
#返回2
打印(levenshtein(['abc','def','ghi'],['abc','ghi','e']))
您所描述的与Levenshtein距离非常相似:
您只需要数组条目而不是字符
你可以简单地找到一个levenstein算法,并根据你的需要进行修改
此算法甚至可能适用于数组;)
编辑:这项工作:
def levenshtein(s1, s2):
insertionCost=1
deletionCost=1
substitutionCost=1
if len(s1) < len(s2):
return levenshtein(s2, s1)
# len(s1) >= len(s2)
if len(s2) == 0:
return min(deletionCost,insertionCost)*len(s1)
previous_row = range(len(s2) + 1)
for i, c1 in enumerate(s1):
current_row = [i + 1]
for j, c2 in enumerate(s2):
insertions = previous_row[j + 1] + insertionCost # j+1 instead of j since previous_row and current_row are one character longer
deletions = current_row[j] + deletionCost # than s2
substitutions = previous_row[j] + substitutionCost*(c1 != c2)
current_row.append(min(insertions, deletions, substitutions))
previous_row = current_row
return previous_row[-1]
#returns 2
print(levenshtein(['abc','def','ghi'],['abc','ghi','e']))
def levenshtein(s1,s2):
insertionCost=1
删除成本=1
替代成本=1
如果len(s1)=len(s2)
如果len(s2)==0:
返回最小值(删除成本、插入成本)*长度(s1)
上一行=范围(len(s2)+1)
对于i,枚举中的c1(s1):
当前_行=[i+1]
对于枚举(s2)中的j,c2:
insertions=上一行[j+1]+insertionCost#j+1而不是j,因为上一行和当前行长一个字符
删除=当前_行[j]+删除成本#小于s2
替换=上一行[j]+替换成本*(c1!=c2)
当前行追加(最小值(插入、删除、替换))
上一行=当前行
返回上一行[-1]
#返回2
打印(levenshtein(['abc','def','ghi'],['abc','ghi','e']))
问题“请完成我的算法开发?”也是这样吗?如果您采取的第一步是找出差异,那么下一步不是要使用差异来计算成本吗?这个问题需要的帮助比我们所能提供的更多。我们喜欢帮助别人,但有时人们需要先帮助自己,比如阅读一本关于语言的书,在线文档,或者询问他们认识的人谁可以帮助他们。一旦你更好地理解了这个主题,我们邀请你编辑这个问题并重新打开它。更重要的是,你在发布之前在网上发现的剽窃算法有什么问题?您在选择和实施其中一个方面遇到了什么困难?您开发了什么替代方法?请查看此Python剽窃检查器:。此检查器使用ngrams@Jacobr365我不是要求你完成代码,我是在要求一些想法来帮助我完成它,因为我已经没有想法了。谢谢。问题“请完成我的算法开发?”也是如此。如果你采取的第一步是找出差异,那么下一步不是要用差异来计算成本吗?这个问题需要的帮助比我们能提供的更多。我们喜欢帮助别人,但有时人们需要先帮助自己,比如阅读一本关于语言的书,在线文档,或者询问他们认识的人谁可以帮助他们。一旦你更好地理解了这个主题,我们邀请你编辑这个问题并重新打开它。更重要的是,你在发布之前在网上发现的剽窃算法有什么问题?您在选择和实施其中一个方面遇到了什么困难?您开发了什么替代方法?请查看此Python剽窃检查器:。此检查器使用ngrams@Jacobr365我不是要求你完成代码,我是在要求一些想法来帮助我完成它,因为我已经没有想法了。谢谢。@thetask137没问题;)@任务K1337没有问题;)