计算某对字符串的相似比

2024-10-03 23:24:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv,第一行作为标题,如下所示:

player,career
a,"arsenal, arsenal fc, arsnal fc, barcelona, chelsea"
b,"barcelona, barcelona fc, arsenal, liverpool, liverpol"
c,"newcastle fc, stoke city"
d,"chelsea, everton"

纵队生涯是足球运动员生涯中一组有序的队伍。如果同一支球队出现不止一次,那是因为球员在那里度过了不止一个赛季。例如,球员D在切尔西,然后转会到埃弗顿。球员A在去巴塞罗那之前在阿森纳待了三个赛季。你知道吗

我想确定一个球员何时转会到一个新球队(这是一个挑战,因为球队的名字没有标准化)。为了做到这一点,我计算了字符串之间的相似性比率(我正在使用difflib.SequenceMatcher). 我的基本思想是回顾过去,将焦点团队与过去的团队进行比较。我还展望并比较了焦点团队和未来团队。你知道吗

例如,对于播放器A和元素'arsnal fc'(集合中的第三个)我计算成对(2,1)和(2,0)的相似比,得到最大值和最小值(向后相似性)。然后我计算成对(2,3)和(2,4)的比率,得到最大值和最小值(正向相似性)。你知道吗

下面我展示了一个脚本,该脚本创建了一个字典,其中包含向后相似比的最大值(我可以调整dictpre_max函数,以便获得所需的其他度量值)。你知道吗

import pandas as pd
from functools import partial
import difflib
import re
from itertools import *
from decimal import Decimal

def split_it(x):
    return re.findall('\w+', x)

def apply_sm(c1, c2): 
    return round(difflib.SequenceMatcher(None, c1, c2).ratio(),4)

def dictpre_max(x):

    dictpre = {}

    career = x.split(',')

    for index,team in enumerate(career):
        if index == 0:
            a = index
        else:
            for preorder in range(0,index+1):
                if preorder != index:
                    dictpre[index,preorder] = apply_sm(career[index],career[preorder])

    dictpremax = {}

    for index,team in enumerate(career):
        total = []

        for preorder in range(0,index+1):
            if preorder != index:
                a = [dictpre[(index,preorder)]]
                total = total + a

        if len(total)>0:

            dictpremax[index]=max(total)

    return dictpremax

filenameinput = 'careers.csv'
df = pd.read_csv(filenameinput)

df['maxpre'] = df['career'].apply(dictpre_max)

print(df)

我想知道是否有一个更干净的方式(或更Python)实现这一点。我仍然不能用相同的函数计算所有的度量,因为我得到了一个错误

(ValueError: too many values to unpack)

当我尝试一次将值赋给多个df列时。不过,我想先看看是否有更简洁的方法来编写dictpre_max函数。你知道吗


Tags: csvinimportdfforindexif团队