Keras / TensorFlow:如何将文本转换为输入?

时间:2017-07-05 15:50:31

标签: file-io tensorflow keras

过去几天我一直在阅读教程,但他们似乎都是从“我从这个预先准备好的数据集中获取数据,让我们走了”的步骤开始的。

我正在尝试做的是收集一组我已经标记化的电子邮件,并弄清楚如何将它们作为培训和评估数据加入模型。

电子邮件示例:

0 0 0 0 0 0 0 0 0 0 0 0 32192 6675 16943 1380 433 8767 2254 8869 8155

每个垃圾邮件都有一个电子邮件文件夹(每封电子邮件一个文件),而不是垃圾邮件:

/spam/
    93451.txt
    ...
/not-spam/
    112.txt
    ...

如何让Keras读取这些数据?

或者,如何生成CSV或其他要用于输入的格式?

2 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点,但是请按顺序尝试:

  1. 您需要为数据集中的所有单词创建字典,然后为每个单词分配一个标记。输入网络时,您可以将其转换为one-hot编码形式。
  2. 您可以将输入文本转换为预先训练的word embeddings model gloveword-2-vec,并获取embeddings向量。
  3. 您可以使用1中的one-hot向量并训练自己的embeddings

答案 1 :(得分:0)

正如我从您的任务说明中所理解的(如果我错了,请指导我),您需要将文本分类为垃圾邮件或非垃圾邮件类别。
基本上,如果你想创建通用文本数据分类输入解决方案,你的 数据输入阶段代码应包含3个步骤: 1.阅读文件夹列表("垃圾邮件","不是垃圾邮件"在您的情况下)并将每个文件夹迭代到文件列表。
最后你应该有:
a)包含(label_id -> label_name)的字典。
所以在你的情况下,你应该留在(0-> spam, 1->not_spam)。
b)一对(file_content,label)。
如您所知,这超出了keras和tensorflow的范围。这是典型的蟒蛇'码。
2.对于每个部分(file_content,label),您应该处理第一个元素,这通常是最有趣的部分。 在您的示例中,我可以看到0 0 0 0 0 0 0 0 0 0 0 0 32192 6675 16943 1380 433 8767 2254 8869 8155
因此,您已经拥有了单词的索引,但它们都是文本形式。您所需要的只是将字符串转换为具有300个项目的数组(消息中的单词)。
对于进一步的文本机器学习项目,我建议使用原始文本数据作为源,并使用tf.contrib.learn.preprocessing.VocabularyProcessor将其转换为单词索引。
3.将标签(类别)转换为one-hot向量。 所以在这一步结束时你有一对(word_indexes_as_array, label_as_one_hot)。 然后,您可以将这些数据用作培训的输入数据 当然,您可以将此元组分为两部分,将前80%的数据视为训练集,将20%的数据视为测试集(请不要关注80/20,数字只是样本)。
您可以查看text classification with keras示例。它们相当简单,可能对您有帮助,因为它们从data input step开始 另外,请查看data input step示例中的load_data_and_labels()方法。这与你的情况非常相似(正面/负面)。