神经网络解析字符串数据?


28

因此,我才刚刚开始学习神经网络如何操作以识别模式并对输入进行分类,并且我已经看到了人工神经网络如何解析图像数据并对图像进行分类(使用convnetjs进行演示),以及其中的关键将对图像进行降采样,每个像素将一个输入神经元刺激到网络中。

但是,我是否想用字符串输入来解决问题?我得到的用例是用户观看过的电影的“推荐引擎”。电影有很多字符串数据(标题,情节,标签),我可以想象将文本“缩减采样”到描述该电影的几个关键词,但是即使我解析出描述该电影的前五个词,认为我需要每个英语单词都需要输入神经元才能比较一组电影吗?我可以将输入神经元限制为仅用于集合中的单词,但是随后它可以通过添加新电影(用户以新词观看新电影)来成长/学习吗?我见过的大多数库都不允许在训练系统后添加新的神经元?

是否存在将字符串/单词/字符数据映射到神经网络输入的标准方法?还是神经网络真的不是像这样解析字符串数据的正确工具(哪种是更好的字符串数据模式匹配工具?)?

Answers:


19

使用神经网络对自然语言数据进行预测可能是一项艰巨的任务,但是已经有了尝试和真实的方法来使之成为可能。

在自然语言处理(NLP)字段中,通常使用词袋模型来表示文本。换句话说,您有一个长度为n的向量,其中n是词汇量中的单词数,每个单词对应于该向量中的一个元素。为了将文本转换为数字数据,您只需对每个单词的出现次数进行计数,然后将该值放置在与单词对应的向量的索引处即可。Wikipedia在描述此转换过程方面做得非常出色。 由于向量的长度是固定的,因此难以处理未映射到索引的新单词,但是有多种方法可以缓解此问题(查找功能哈希)。

这种表示方法有很多缺点-它不会保留相邻单词之间的关系,并且会导致矢量非常稀疏。查看n-gram有助于解决保留单词关系的问题,但是现在让我们关注第二个问题,稀疏性。

直接处理这些稀疏向量很困难(许多线性代数库在处理稀疏输入方面做得很差),因此下一步通常是降维。为此,我们可以参考主题建模领域:潜在狄利克雷分配(LDA)和潜在语义分析(LSA)之类的技术通过将文档表示为主题的组合,将这些稀疏向量压缩为密集向量。您可以确定所用主题的数量,并在此过程中确定由LDA或LSA产生的输出向量的大小。这种降维处理可极大地减小输入矢量的大小,同时尝试丢失最少的信息量。

最后,在完成所有这些转换之后,您可以将主题建模过程的输出输入到神经网络的输入中。


1
如果您还有其他问题,请告诉我,我们将尽力提供更多详细信息。
麦迪逊

谢谢,这给了我很好的条件,可以继续探索!
午夜

顺便说一句,我可以涉及“特征散列”,因为这似乎与Bloom过滤器非常相似,而Bloom过滤器是我在使用加密货币代码时所熟悉的。我想知道使用散列函数将输入功能与多个索引位置(bloom-filter-style)相关联是否比使用第二个散列函数设置索引的符号更有效……
MidnightLightning

6

@Emre和@Madison的答案都可以很好地解决当前的问题。问题是将字符串表示为特征向量以输入到NN之一。

首先,问题取决于您要处理的字符串的大小。在这种情况下,包含可能标记的长字符串(通常是单词)通常称为文档。有单独的方法来处理单个标记/单词。

有多种表示文档的方法。他们中许多人做出袋的词假设。最简单的类型将文档表示为单词计数或术语频率(tf)的向量。为了消除文档长度的影响,通常人们倾向于根据术语显示的文档数量(tf-idf)进行归一化。

另一种方法是主题建模,它可以学习数据的潜在低维表示。 LDALSI / LSA是典型的选择,但重要的是要记住这是不受监督的。对于您正在使用NN进行的任何有监督的学习,学习到的表示形式不一定是理想的。如果您要进行主题建模,则还可以尝试监督主题模型

对于单个单词,可以使用word2vec,它利用NN将单词嵌入到任意大小的空间中。在该学习空间中,两个单词向量之间的相似性倾向于对应于语义相似性。

最近开创性的方法是段落向量,它首先学习类似于word2vec的单词模型,然后基于该表示形式学习单词集(任何大小的文档)的分布式表示形式。这已经在许多应用中显示了最新的结果。

在NLP中使用NN时,人们经常使用不同的体系结构,例如递归神经网络(例如长期短期记忆网络)。在某些情况下,人们甚至在文本上使用了卷积神经网络


我认为word2Vec确实是该问题的最准确答案。关于如何训练和使用一个非常不错的Kaggle教程:kaggle.com/c/word2vec-nlp-tutorial/details/part-2-word-vectors
jagartner,2015年

谢谢,我忘记了word2vec链接,我将添加一个(除了您在此处列出的
那个

3

这不是关于神经网络本身的问题,而是关于在机器学习中表示文本数据的问题。您可以将影片,演员和主题表示为类别变量。情节更加复杂。您可能想要一个主题模型,但是在您掌握所有内容之前,我将其保留。恰恰是您提到的文本“下采样”。

看一下教程,学习如何为神经网络编码分类变量。还有祝你好运!


值得一提的是,这并不是所有机器学习都明确存在的问题,而仅仅是生成特征向量时的问题,而特征向量在机器学习中并不普遍存在。
Slater Victoroff 2014年

哪种机器学习不使用功能?
Emre 2014年

随机森林是一个很好的例子,对于它来说,获得您在神经网络中看到的那种特征向量不是问题。许多无监督方法也适用于原始单词而不是特征向量。注意:我并不是说有些方法不使用功能,只是有些方法不依赖严格的结构化向量。
Slater Victoroff 2014年

我不知道您所说的“严格结构化”是什么意思。
Emre 2014年

严格结构化的是unint8的1d向量,而不是包含字典,权重矩阵和一系列字符串的列表
Slater Victoroff 2014年

0

我已经尝试了以下2种方法来对带有文本的神经网络进行试用。后者工作得很好,但有局限性。

  1. 使用word2vect或NLTK /自定义单词标记创建词汇表,并为每个单词分配索引。该索引将单词表示为数字。

    挑战:

    • 必须使用特征缩放对索引进行“规范化”。
    • 如果神经网络的输出甚至有微小的变化,那么输出可能是意外单词的索引(例如,如果预期输出是250;但是NN输出249或251,那么它可能是数字上下文的近似输出;但是它们是不同单词的索引)。在这里可以利用递归神经网络生成输出索引。
    • 如果将新单词添加到词汇表中,则应重新缩放标记索引。用先前缩放的值训练的模型可能会变得无效,必须重新训练。
  2. 使用身份矩阵,例如对于“ n”个单词,使用“ nx n”或(n-1 x n-1)矩阵,其中每一行和每一列代表一个单词。在相交单元格中放置“ 1”,在其他地方放置“ 0”。(参考

    挑战:

    • 每个输入和输出值都是“ nx 1”向量。对于大词汇量,其计算量较大且速度较慢。
    • 如果将新单词添加到词汇表中,则应重新计算单位矩阵(即单词向量)。使用先前计算的向量训练的模型可能会变得无效,必须重新训练。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.