python规范化大数

时间:2017-04-08 18:58:24

标签: python machine-learning normalization

我正在开发一个聊天机器人程序来练习一般的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

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

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

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

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

或者是神经网络是必要的一种还是那种情况?

1 个答案:

答案 0 :(得分:0)

而不是使用CSV文件存储数据,而是使用JSON呢?

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

loaded_sentence = json.loads(result)

然后当您需要使用数据时:

print(original_sentence == loaded_sentence)

要表明您获得了相同的数据:

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

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

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class TestMain {

    public static void main(String[] args) {

        List<String> manual = new LinkedList<String>();
        List<String> automatic = new LinkedList<String>();
        List<String> location = new LinkedList<String>();
        int[] rels = new int[8];

        //cars with relations
        rels[0] = 1;
        manual.add("Queen");
        rels[1] = 1;
        manual.add("Purple");
        rels[2] = 1;
        manual.add("Hendrix");
        rels[3] = 1;
        automatic.add("Wicked");
        rels[4] = 0;
        automatic.add("Zeppelin");
        rels[5] = 0;
        automatic.add("Floyd");
        rels[6] = 1;
        automatic.add("Ramones");
        rels[7] = 2;
        automatic.add("Nirvana");

        //key-0
        location.add("CBD");
        //key-1
        location.add("Penrith");
        //key-2
        location.add("Ceremorne");
        //key-3
        location.add("Sutherland");

        //here is the value that you have from your input args[] for example
        String desiredLocation = "CBD";

        int index = getLocationIndex(location, desiredLocation);
        //if desired location not found we will print nothing
        if(index==-1)return;

        List mergedCars = new LinkedList<String>();
        mergedCars.addAll(manual);
        mergedCars.addAll(automatic);

        for (int i = 0; i < rels.length; i++) {
            if(index == rels[i])
            {
                System.out.println(mergedCars.get(i));
            }
        }

    }

    private static int getLocationIndex(List<String> location, String desiredLocation) {
        int counter=0;
        for (Iterator iterator = location.iterator(); iterator.hasNext();) {
            String temp = (String) iterator.next();
            if(temp.equals(desiredLocation))
            {
                return counter;
            }
            counter++;
        }
        return -1;
    }
}

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