这在某种程度上是一个分层的问题,我一直在绞尽脑汁试图找出如何最好地解决问题的方法。
数据集具有将各种产品描述分类的品牌(较高级别)和子品牌(较低级别)。我已将其加载到熊猫数据框中以尝试对其进行操作。
这是数据集的一个子集:
Brand Sub_Brand Product_Description 7-Up NaN 7-Up Original Can 327ml 7-Up Diet Diet 7-Up Bottle 327ml 7-Up Diet Diet 7-Up Can 327ml 7-Up NaN 7-Up Lemon Lemon Peach 327ml 7-Up NaN 7-Up Lemon Lemon Grapefruit 327ml 7-Up NaN 7-Up Lemon Lemon Original 327ml
在此示例中,Diet已经填充在“子品牌”字段中,因为它表示与那些产品相关联的子品牌,但是对于其他产品(例如“柠檬柠檬”产品),我们缺少值。我要完成的工作是找出一种方法将“柠檬柠檬”冲洗掉,并将其放置在子品牌中,因为它是一个子字符串,可以在多种产品中不断出现。
当您自己查看时很容易识别,我希望找到能将其清除的代码。
values = pd.DataFrame()
for index, row in df['Product_Description'].iteritems():
query = row.split()
values = values.append(query)
flush = pd.DataFrame(values.groupby(0).size())
flush = flush.sort_values(by=[0],ascending=False)
flush['word'] = flush.index
flush = flush.reset_index(drop=True)
flush.columns = ['count', 'word']
flush = flush[~flush['word'].str.lower().isin(df['Brand'].str.lower())]
这可以帮助我清除“柠檬”作为最重复的单词,并且可以将其插入列中,以作为该单词在Product_Description列中作为子字符串出现的位置的建议。但是,不是想要的结果就是“柠檬柠檬”。
我还考虑过使用Fuzzywuzzy并迭代生产说明以与所有其他行进行token_sort_ratio匹配,以查看哪些说明始终具有较高的百分比匹配计数
例如,结果为:
fuzz.token_set_ratio("7UP LEMON LEMON ORIGINAL", "7UP LEMON LEMON WHITE PEACH")
67
我正在考虑使用> 60的任何东西将它们存储在列表中,并使用以下函数来获取最长的公共子字符串
def longestSubstringFinder(string1, string2):
answer = ""
len1, len2 = len(string1), len(string2)
for i in range(len1):
match = ""
for j in range(len2):
if (i + j < len1 and string1[i + j] == string2[j]):
match += string2[j]
else:
if (len(match) > len(answer)): answer = match
match = ""
return answer
如果我通过了
test = longestSubstringFinder("7UP LEMON LEMON CUCUMBER MINT", "7UP LEMON LEMON WHITE PEACH").strip()
'7UP LEMON LEMON'
我可以继续删除该品牌,因为这两个记录的数据框中已经存在该品牌,并且最终我得到了很好的子品牌建议“柠檬柠檬”
我敢肯定有更好的方法,我希望能朝正确的方向指出,我可以将它们放在一起并遍历340,000行以上的整个数据集
任何帮助将不胜感激