利用Python处理数据(搜索函数)

2025-10-23 23:56:47

1、明确概念:

编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。

我们根据编辑距离来对数据进行处理,匹配。

限制编辑距离的阈值来控制字符串的相似度。

利用Python处理数据(搜索函数)

2、编辑距离的算法:

以下是对编辑距离的介绍:

使用动态编程思想,构造一个矩阵,初始化是第一列和第一行的数值等于其行索引和列索引,其余数值均按照下述方法填充。

利用Python处理数据(搜索函数)

3、原始数据:将原始数据作为索引从另一份数据中即数据库中调取,按照原始数据中的某一列作为索引,由于数据来源不同,可能存在拼写错误、缩写等不同,切不知道差异程度。故采用本函数处理。

利用Python处理数据(搜索函数)

4、数据库:调取数据的存储文件。

为原始数据提供数据的源。

利用Python处理数据(搜索函数)

5、源代码:

import numpy as np

import pandas as pd

from pandas import DataFrame

T=5

#return_minimun_value

def minimun(one ,two ,three):

    min=((one if one<two else two) if (one if one<two else two)<three else three) 

    return min

#calculate_similarity

def similarity(str_1,str_2):

    d=np.zeros((len(str_1)+1,len(str_2)+1))

    for i in range(len(str_1)+1):

        d[i][0]=i

    for j in range(len(str_2)+1):

        d[0][j]=j

    for i in range(1,len(str_1)+1):

        for j in range(1,len(str_2)+1):

            score=1

            if str_1[i-1]==str_2[j-1]:

                score=0

            d[i][j]=minimun(d[i-1][j]+1,d[i][j-1]+1,d[i-1][j-1]+score)  if minimun(d[i-1][j]+1,d[i][j-1]+1,d[i-1][j-1]+score)<T else 100         

    return d[len(str_1)][len(str_2)]

#indentify_how_similar

def identify(s1,s2):

    s1=s1.strip()

    s2=s2.strip()

    s1=s1.split(' ')

    s2=s2.split(' ')

    t=len(s1) if len(s1)<len(s2) else len(s2)

    score=0

    for i in range(t):

        if s1[i]!=s2[i]:

            score=100

            break

        score=score+similarity(s1[i],s2[i])

    return score

path1='C:\\Users\\jyjh\\Desktop\\chromosome_data.csv'

path2='C:\\Users\\jyjh\\Desktop\\xishaislands.csv'

cd=pd.read_csv(path1,index_col=0)

xs=pd.read_csv(path2)

cd=DataFrame(cd)

xs=DataFrame(xs)

cdlt=[]

xslt=[]

for i in cd['Latin_name']:

    cdlt.append(i)

for i in xs['latin_name']:

    xslt.append(i)

        

dic={}

for j in range(len(xs.index)):

    locc=0

    loc=0

    sms=[]

    for i in cdlt:

        sms.append(identify(i,xs['latin_name'].ix[j]))

    min=sms[0]

    for i in sms:

        if i<min:

            min=i

            locc=loc

        loc=loc+1

    dic.setdefault(xs['latin_name'].ix[j],locc)

col=['Gametophytic','Sporophytic','Paresd_n']

data=DataFrame(index=dic.keys(),columns=col)

all=[]

for i in dic.values():

    if i!=0:

        all.append(cd['Gametophytic'].ix[i])

    else:

        all.append(' ')

for i in arange(len(dic.keys())):

    data['Gametophytic'].ix[i]=all[i]

all=[]

for i in dic.values():

    if i!=0:

        all.append(cd['Sporophytic'].ix[i])

    else:

        all.append(' ')

for i in arange(len(dic.keys())):

    data['Sporophytic'].ix[i]=all[i]

all=[]

for i in dic.values():

    if i!=0:

        all.append(cd['Paresd_n'].ix[i])

    else:

        all.append(' ')

for i in arange(len(dic.keys())):

    data['Paresd_n'].ix[i]=all[i]

data.to_csv('data.csv')

6、结果:

输出data.csv文件

查看结果,并对阈值做一定修改以优化函数。

利用Python处理数据(搜索函数)

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢