Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 阵列的简单递归剽窃检测器_Python_List - Fatal编程技术网

Python 阵列的简单递归剽窃检测器

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

我在考虑一个非常简单的剽窃检测器。为了简单起见,假设在beigning中有两个列表,每个列表都有一些字符串元素,例如:

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没有问题;)