Python 跨csv文件中的所有行组合应用字符串匹配逻辑

Python 跨csv文件中的所有行组合应用字符串匹配逻辑,python,arrays,string,pandas,csv,Python,Arrays,String,Pandas,Csv,我正在尝试使用python进行字符串匹配。我有.csv数据,如: 项目标识»项目名称 101»番茄 102»番茄 103»西红柿 104»番茄 (>s代表选项卡\t字符。) 我希望输出类似于: Item_ID»Item_ID1»相似性 101»102»92 101»103»73 101»104»100 102»101»92 102»103»85 102»104»92 104»101»100 104»102»92 104»103»73 Item\u Name可以相同,但ID不同,相似性应基于I

我正在尝试使用python进行字符串匹配。我有.csv数据,如:

项目标识»项目名称
101»番茄
102»番茄
103»西红柿
104»番茄
>
s代表选项卡
\t
字符。)

我希望输出类似于:

Item_ID»Item_ID1»相似性
101»102»92
101»103»73
101»104»100
102»101»92
102»103»85
102»104»92
104»101»100
104»102»92
104»103»73

Item\u Name
可以相同,但ID不同,相似性应基于
Item\u Name
,但应使用每个
Item\u ID
进行计算。你能帮我看一下python代码吗?

你可以把输入读入
目录的
列表中,就像我的例子一样

然后,您可以使用
itertools.combinations(data,2)
获得所有对

import itertools
import random

def get_similarity(obj1, obj2):
    # your own get_similarity function using obj1['name'], obj2['id'], etc
    # here I'm just returning random number
    return random.randint(1, 100)

data = [
    {'id': 101, 'name': 'tomato'},
    {'id': 102, 'name': 'tomatos'},
    {'id': 103, 'name': 'tomatoes'},
    {'id': 104, 'name': 'tomato'},
]

print('Item_ID1', '\t', 'Item_ID2', '\t', 'Similarity')
for obj1, obj2 in itertools.combinations(data, 2):
    similarity = get_similarity(obj1, obj2)
    print(obj1['id'], '\t', obj2['id'], '\t', similarity)
这个输出

Item_ID1     Item_ID2    Similarity
101      102     89
101      103     83
101      104     75
102      103     9
102      104     3
103      104     86
在示例输出中,重复同一对两次(例如,(101,104)和(104,101)

如果有意这样做,只需按交换对象的顺序将同一对打印两次:

for obj1, obj2 in itertools.combinations(data, 2):
    similarity = get_similarity(obj1, obj2)
    print(obj1['id'], '\t', obj2['id'], '\t', similarity)
    print(obj2['id'], '\t', obj1['id'], '\t', similarity)

下面是我如何通过
pandas
实现您的逻辑

import pandas as pd
from difflib import SequenceMatcher
from io import StringIO
from itertools import combinations

mystr = StringIO("""Item_ID Item_Name
101 tomato
102 tomatos
103 tomatoes
104 tomato""")

# replace mystr with 'input.csv'
d = pd.read_csv(mystr, delim_whitespace=True).set_index('Item_ID')['Item_Name'].to_dict()

# create dictionary of results
d_out = {idx: [i, j, SequenceMatcher(None, d[i], d[j]).ratio()] \
              for idx, (i, j) in enumerate(combinations(d, 2))}

# create dataframe from dictionary
res = pd.DataFrame.from_dict(d_out, orient='index')

# rename columns
res.columns = ['Item_ID', 'Item_ID1', 'Similarity']

# output to csv
res.to_csv('result.csv', index=False)
结果:

   Item_ID  Item_ID1  Similarity
0      101       102    0.923077
1      101       103    0.857143
2      101       104    1.000000
3      102       103    0.933333
4      102       104    0.923077
5      103       104    0.857143

这只是一个例子。很抱歉没有提到这一点。相似性应该基于Item_name到Item_name的值。例如:“西红柿”(101)可以与字符串“西红柿”(102)相似92%好的,但是我们应该如何计算92%的值。如果我们不能计算值,我们就不能创建包含该值的列。请将所需的输出更新为我们可以通过一些可复制逻辑进行实际计算的输出。有点像这样:下面我的解决方案使用了
difflib.SequenceMatcher
。希望有帮助。谢谢,在.CSV文件上也可以这样做吗?另外,它是在创建随机整数还是在使用任何算法计算字符串相似度?@RishabOberoi是的!您可以通过创建一个列表,为CSV每行构建一个包含字段“id”和“name”的
dict
,并在读取CSV文件时将
dict
推到列表中。如果你开始学习Python,我认为这将是一个很好的练习。我只是使用了随机整数,但是你应该用你的相似性计算逻辑来替换它。好的,谢谢你的帮助Eric。我将尝试你建议的这个解决方案。是的,但是我如何在“Item_ID”列中添加104行呢?我也想要相同的行。替换
combin的两个实例带有排列的排列
。应该可以。