我正在尝试使用python进行字符串匹配。我有.csv数据,如:
Item_ID»Item_Name
101»tomato
102»tomatos
103»tomatoes
104»tomato
(»
代表标签\t
字符。)
我希望输出如下:
Item_ID»Item_ID1»Similarity
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_Name
可以相同,但它具有不同的ID,相似性应基于Item_name
,但要与每个Item_ID
一起计算。你能帮我解决这个python代码吗?
答案 0 :(得分:1)
您可以在list
dict
中阅读输入内容,如我的示例所示。
然后,您可以使用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)
答案 1 :(得分:1)
以下是我如何通过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