Python对商品属性进行二次分类并输出多层嵌套字典

题目有点长,感觉好像也解释的不太清楚,但是大概意思就是,我们在逛一个网站的时候,譬如天猫,你会看到有“女装”、“男鞋”、“手机”等等分类,点击进去又会有相应的品牌,女装下面会有“”、“伊芙丽”等品牌,男鞋下面会有“nike”、“”等分类,如果一个用户在搜索nike,那么相应的标签应该会带上“男鞋”,通俗的说是会在输入框下面弹出“在男鞋下面搜索nike”,那么我写这篇文章就是要预测我们在输入一个品牌的时候,相对应的一级分类的概率是多少 。
【Python对商品属性进行二次分类并输出多层嵌套字典】然并卵,我并没有天猫的相关数据,只有我公司的数据,但是这个数据肯定不能外泄,编数据又很麻烦,所以就不讲怎么用机器学习的算法去计算这个概率了,不过这也不难,待我有时间写个爬虫把数据弄下来再写,嘿嘿 。
总之,做完后的预测数据应该是酱紫的:

Python对商品属性进行二次分类并输出多层嵌套字典

文章插图
这个表怎么看呢,第一行是一级分类的类别,第一列是二级分类的类别 。以第三行为例,我们可以看到“”这个品牌被分类为“女装/内衣”的概率是0.,“女鞋/男鞋/箱包”的概率是0.,“化妆品/个人护理”的概率是0. 。所以如果你在天猫的搜索框里搜索“”,下面最可能弹出来的是“在女装/内衣中搜索” 。
但是这个表有个缺陷,就是0值太多,而且没有排序,看起来很乱,所以我们用中的字典进行排序 。
废话不多说,上代码:
#coding:utf-8import numpy as npimport pandas as pdfrom odo import odofrom odo import convertimport jsonfrom operator import itemgetterimport collectionsfrom collections import OrderedDictimport sysreload(sys)sys.setdefaultencoding('utf8')#加载数据集result = pd.read_table('tmalltest.txt',header =None)listall = odo(result,list)result1 = pd.read_table('tmalltest.txt')result2 = result1.drop('class',axis = 1)listvalue = http://www.kingceram.com/post/odo(result2,list)count = len(range(result.shape[1]))id = result.iloc[0,1:16]listvalueout = [result.iloc[y,0] for y in range(1,result.shape[0])] outid=tuple(out)d = [dict(zip(id,tuple(listvalue[i]))) for i in range(0,len(listvalue))]#将字典的键值对反转func = lambda b:dict([(x,y) for y,x in b.items()])dd = [func(d[i]) for i in range(len(d)) ]#删除字典中key为0的键值对delete = [dd[i].pop(0.0) for i in range(len(d))]#将字典反转回来ddvalue = [func(dd[i]) for i in range(len(d))]#两个列表合成dictdictall = dict(zip(out,ddvalue))#使输出到控制台的时候显示的是中文print json.dumps(dictall).decode("unicode-escape")#将字典中的值取出来,放到一个新列表中lista = []for k in dictall.keys():sorted_d =sorted(dictall[k].iteritems(),key = itemgetter(1),reverse = True)print sorted_dlista.append(sorted_d)#只选取预测值排前三的类别listb = [lista[i][0:3] for i in range(len(lista))]listc = [json.dumps(listb[i]).decode("unicode-escape") for i in range(len(listb))]#二级分类排序,可以用OrderedDict有序字典排序dictorder = [OrderedDict(lista[i]) for i in range(0,len(lista))] print json.dumps(dictorder).decode("unicode-escape")#将排序号的列表重新组合成字典dictall_sort= dict(zip(dictall.keys(),listc))#写个函数使输出嵌套字典更美观def pretty_dict(obj, indent=' '):def _pretty(obj, indent):for i, tup in enumerate(obj.items()):k, v = tup#如果是字符串则拼上""if isinstance(k, basestring): k = '"%s"'% kif isinstance(v, basestring): v = '"%s"'% v#如果是字典则递归if isinstance(v, dict):v = ''.join(_pretty(v, indent + ' '* len(str(k) + ': {')))#计算下一层的indent#case,根据(k,v)对在哪个位置确定拼接什么if i == 0:#开头,拼左花括号if len(obj) == 1:yield '{%s: %s}'% (k, v)else:yield '{%s: %s,\n'% (k, v)elif i == len(obj) - 1:#结尾,拼右花括号yield '%s%s: %s}'% (indent, k, v)else:#中间yield '%s%s: %s,\n'% (indent, k, v)print ''.join(_pretty(obj, indent))#输出原始未排序的字典,美化后print pretty_dict(dictall)#输出排序后的字典,美化前print json.dumps(dictall_sort).decode("unicode-escape")#输出排序后的字典,美化后print pretty_dict(dictall_sort)