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

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

这个表怎么看呢,第一行是一级分类的类别,第一列是二级分类的类别。以第三行为例,我们可以看到“scofield”这个品牌被分类为“女装/内衣”的概率是0.87473829,“女鞋/男鞋/箱包”的概率是0.03394293,“化妆品/个人护理”的概率是0.21392374。所以如果你在天猫的搜索框里搜索“scofield”,下面最可能弹出来的是“在女装/内衣中搜索scofield”。
但是这个表有个缺陷,就是0值太多,而且没有排序,看起来很乱,所以我们用python中的字典进行排序。
废话不多说,上代码:

#coding:utf-8
import numpy as np
import pandas as pd
from odo import odo
from odo import convert
import json
from operator import itemgetter
import collections
from collections import OrderedDict
import sys  

reload(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 = odo(result2,list)
count = len(range(result.shape[1]))
id = result.iloc[0,1:16]
listvalue
out = [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))]
#两个列表合成dict
dictall = 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_d
    lista.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"'% k
            if 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)
    输出结果:
#输出原始未排序的字典,美化后
{
  "太平鸟": {
  "男装/户外运动/": 0.84782371
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值