我在熊猫数据框ord_items
中有一个购买的商品名称作为字符串。这些项目可能是重复的,因为它们是购买的,并且不同的购买可能包含相同的项目。数据框的列中使用订单号来区分一个订单和另一个订单。
因为这些订单来自多个商店,并且商店可能以略有不同的名称出售相同的商品,所以我想为同一商品创建单个父代表示。我正在使用Levenshtein
包的商品名称字符串之间的Levenshtein距离来确定商品是否有效地相同。即同义词。两根弦之间的距离一个对我来说足够好。而且,我真的不在乎哪个字符串是我的父母,而是我的同义词,只需要可复制即可。
具有约38K个唯一商品名称,这在计算上非常昂贵。我考虑过使用joblib
对此进行并行化,但是我意识到我可能需要某种类型的递归。也就是说,在项目之中
ICECREAM
RICECREAM
RICEDREAM
RICEDCREAM
第一对之间的距离为1,第二对之间的距离为1,第三对之间的距离为1。但是,第一项和最后一项的距离为2。理想情况下,所有这些是同义词,指向一个父版本。
我尝试建立一个循环来替换值。但是它是如此之慢。我希望有一种替代方法可以利用向量化函数或其他更Python化的函数。
#make an array of unique items
items = ord_item_df.item_ds.unique()
#Let's only assess items where the length is 6 or greater
items = items[[len(i) > 5 for i in items]]
#we'll copy the ordered items in the original order-item dataframe into a new series that we can manipulate
items_to_fix = ord_item_df.item_ds
#Iterate through each items
for i in range(len(items)):
#iterate through all the items after that item
for j in range(i+1,len(items)):
#Calculate the distance; if 1 then they are synonyms
if Levenshtein.distance(items[i], items[j]) == 1:
#update the pandas series in place
items_to_fix.replace(to_replace=items[j], value=items[i],inplace=True,regex=False)