【问题标题】:python normalizing large numberspython标准化大数
【发布时间】:2017-09-04 01:55:44
【问题描述】:

我正在开发一个聊天机器人程序来练习一般的 python 和一些 sklearn 机器学习算法。

现在我只是给聊天机器人随机句子并告诉它句子是否正确。每个单词都为其自身、其类型(语法)和语气(积极、消极、中性、粗俗等)分配了关键。

在给定的每个输入之后,句子被保存到一个 csv 文件中。 每个句子都有三个特征:key、key_type、key_mood 和一个标签:0(不正确)和 1(正确)。

起初,对于每个键,我都有一个每个单词对应键的列表。我认为这是一个好主意,因为它会跟踪单词的插入顺序。

不幸的是,当保存到 csv 时,列表被转换为包含列表的字符串,我不知道如何从字符串中提取列表(即使我知道如何,我也不知道你是否可以提供一个模型的列表数组,我的猜测可能不是)。

所以我想出了这个:我可以有一个代表这个数字列表的数字,而不是一个功能列表:

for word in self.words:
    for key in word.word_dict():
        sentence_dict[key] += int(float(word.word_dict()[key]))* 10 **(3*n)
    n+=1

例如,“你好吗”的“key”键是 8007006,8 是“How”的单词键,7 个“are”和 6 个“you”。 同样,这句话的“key_type”为12002001,“疑问词”为12,“动词”为2,“代词”为1

这很好用,模型实际上可以读取特征和 cross_validate。 不幸的是,由于这些键的制作方式,我最终在同一个数据集中得到了大量的数字和相当小的数字,我认为它会抛出模型。

我尝试使用 np.sigmoid 进行标准化,但这只是为我的大多数键输出 1(它们太大了)。

所以我的问题是:有没有办法以不破坏其目的的方式规范这些键?如果没有,您是否对如何将这些键提供给模型而不丢失添加单个单词键的顺序有更好的想法?

还是需要神经网络的一种或几种情况?

【问题讨论】:

    标签: python machine-learning normalization


    【解决方案1】:

    不使用 CSV 文件来存储数据,而是使用JSON 怎么样?

    JSON 在 Python 标准库中可用(请参阅 JSON)。将数据存储为 JSON 将保留字典和列表结构,并且非常易于使用。例如:

    import json
    original_sentence = {
        'key': ['a', 'b', 'c'],
    }
    result = json.dumps(original_sentence)  # '{"key": ["a", "b", "c"]}'
    

    那么当你需要使用数据时:

    loaded_sentence = json.loads(result)
    

    为了表明你得到了相同的数据:

    print(original_sentence == loaded_sentence)
    

    您可以将 JSON 一次一行写入输出文件,也可以将结果列成列表并将整个结果列表转储到单个 JSON 文件中。

    results = [sentence for sentence in sentences]
    with open('output.json', 'w') as fp:
        json.dump(results, fp)  # notice .dump not .dumps
    
    with open('output.json') as fp:
        results = json.load(fp)  # notice .load not .loads
    

    注意:如果您有更复杂的对象,那么您可能需要使这些对象可序列化,但如果您将它们存储在 CSV 中,这不太可能。

    【讨论】:

    • 谢谢,我会试试的。我转换为 CSV 的对象是一个 PD 数据框。这行得通吗?
    • 如果我没记错的话,PD 数据帧已经有.to_json.read_json 方法,所以你可以直接使用它们。
    • 我刚刚确认,pandas 数据帧确实有一个 .to_json 方法,但 read_json 是 pandas 的一部分,而不是专门的数据帧。所以要创建 json data = df.to_json() 并恢复它 pd.read_json(data)
    猜你喜欢
    • 2018-05-19
    • 2019-01-21
    • 1970-01-01
    • 2021-05-05
    • 2021-05-28
    • 2021-01-15
    • 1970-01-01
    • 2017-03-31
    • 2019-03-13
    相关资源
    最近更新 更多