【问题标题】:python: Building a matrix with weights - using scikit-learnpython:使用权重构建矩阵 - 使用 scikit-learn
【发布时间】:2015-05-04 18:15:10
【问题描述】:

我有大量文件,每个文件代表一个项目,文件包含标签及其权重,反映这些标签与项目的相关性。 例如

file -> 0001.txt has
skiing-0.789
snow-0.65
winter-0.56

file -> 0002.txt has
drama-0.89
comedy-0.678
action-0.12

我想建立一个如下矩阵:

     skiing, snow, winter, drama, comedy, action
0001  0.789, 0.65, 0.56, 0, 0, 0
0002  0, 0, 0, 0.89, 0.678, 0.12

我通过阅读所有文件并生成以下字典来做到这一点:

{0001:[(skiing,0.789),(snow,0.65),(winter,0.56)], 0002:[(drama, 0.89),(comedy, 0.678),(action,0.12)]

如何从上面构建矩阵。我使用TfidfVectorizer() 进行了一些研究,我可以通过将项目列表传递给它来获得计数,但我想要带有权重的矩阵。

【问题讨论】:

    标签: python matrix pandas machine-learning scipy


    【解决方案1】:

    不需要外部库,例如scikit-learn,因为 Python 通过字典方法轻松提供了所需的功能。在幕后,任何外部库都将遵循类似的算法,将在下一段中描述。

    首先,您需要生成分布在这些不同文件中的所有标头的列表。然后,将内部结构切换为dict 是一个更简洁的想法,这样当特定文件中不存在标头时,您可以轻松检索填充值0

    u = {'0001': [('skiing',0.789),('snow',0.65),('winter',0.56)],
         '0002': [('drama', 0.89),('comedy', 0.678),('action',0.12)]}
    
    headers = []
    for key, labelweights in u.items():
        u[key] = dict(labelweights)
        headers.extend(u[key].keys())
    
    print('user, {}'.format(', '.join(headers)))
    for k in u:
        print('{}, {}'.format(k, ', '.join(str(u[k].get(header,0)) for header in headers)))
    

    如果您的最终目标是将数组数组(二维矩阵)呈现给scikit-learn 中的某个其他函数,您需要将最后一个print 函数更改为matrix.append() 形式。我会把这个相当简单的挑战留给你。

    请注意,Python 的 csv DictWriter class 提供了一个非常相似的功能,用于写入 csv 文件(或任何具有 write 方法的对象),您可以像这样使用它:

    headers = ['user']    
    data = []
    for key, labelweights in u.items():
        tmp = dict(labelweights)
        headers.extend(tmp.keys())
        tmp['user'] = key    
        data.append(tmp)
    
    with open(outputfile, 'w') as fh:
        dw = csv.DictWriter(fh, headers, restval='0', delimiter=',')
        dw.writeheader()
        dw.writerows(data)
    

    如果文件中有重复的标题,那么您需要删除重复的标题,例如在编写/打印代码块之前调用headers = list(set(headers))

    【讨论】:

    • join(str(u[k].get(header,0)) 看起来这里是个问题。它抱怨说 unhashable type: list
    • 您似乎在不同的上下文中使用那一小段代码,因为我提供的代码示例有效。不过,我需要查看周围的上下文才能了解更多信息:您更改了这些小代码 sn-ps 的哪些部分?
    • 另外:您对我帖子的编辑没有“修复错误”:some_dict.items() 不是错误。在 Python3.x 中,items() 的作用类似于 Python2.x 中的 iteritems(),并且不应再使用 iteritems。在 Python2.x 和 Python3.x 中,我更喜欢更简单的符号 items()。其余的只是基于偏好。因此,我已将帖子恢复为原始状态。
    • @Null-Hypothesis 您是否已经找到错误“unhashable type: list”的根本原因?如果没有,请提供一些上下文,因为代码 - 正如它所发布的那样 - 可以正常工作而不会产生错误。
    猜你喜欢
    • 2016-05-12
    • 2014-07-28
    • 2013-04-12
    • 2018-01-15
    • 2017-07-10
    • 2020-10-31
    • 2019-05-29
    • 2015-08-04
    • 2020-03-28
    相关资源
    最近更新 更多