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

数据挖掘 神经网络
2021-09-21 21:52:05

所以,我刚刚开始学习神经网络如何识别模式和对输入进行分类,我已经看到了人工神经网络如何解析图像数据和对图像进行分类(使用 convnetjs 演示),以及那里的关键是对图像进行下采样,每个像素刺激一个输入神经元进入网络。

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

是否有标准方法将字符串/单词/字符数据映射到神经网络的输入?或者神经网络真的不适合解析这样的字符串数据(在字符串数据中进行模式匹配的更好工具是什么)?

4个回答

使用神经网络对自然语言数据进行预测可能是一项棘手的任务,但有一些经过验证的真正方法可以使之成为可能。

在自然语言处理 (NLP) 领域,文本通常使用词袋模型来表示。换句话说,您有一个长度为n的向量,其中n是词汇表中的单词数,每个单词对应于向量中的一个元素。为了将文本转换为数字数据,您只需计算每个单词的出现次数,并将该值放在与该单词对应的向量的索引处。维基百科很好地描述了这个转换过程。 因为向量的长度是固定的,所以很难处理不映射到索引的新词,但是有一些方法可以帮助缓解这个问题(查找特征散列)。

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

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

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

@Emre 和 @Madison May 的回答都很好地说明了手头的问题。问题是将您的字符串表示为输入到 NN 的特征向量之一。

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

有多种方式来表示文档。他们中的许多人做出了词袋假设。最简单的类型将文档表示为单词计数或词频 (tf) 的向量。为了消除文档长度的影响,通常人们更喜欢通过一个术语出现的文档数量、文档频率 ( tf-idf ) 来进行归一化。

另一种方法是主题建模,它学习数据的潜在低维表示。 LDALSI/LSA是典型的选择,但重要的是要记住这是无监督的。学习到的表示不一定适合您使用 NN 进行的任何监督学习。如果你想做主题建模,你也可以试试有监督的主题模型

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

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

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

这不是关于神经网络本身的问题,而是关于在机器学习中表示文本数据的问题。您可以将电影、演员和主题表示为分类变量。剧情比较复杂;您可能需要一个主题模型,但我会在您掌握了窍门之前将其保留。它正是您提到的文本“下采样”。

查看教程,了解如何为神经网络编码分类变量。还有祝你好运!

我已经尝试了以下 2 种方法来对带有文本的神经网络进行试验 n 测试。后一种效果相当好,但有局限性。

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

    挑战:

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

    挑战:

    • 每个输入和输出值都是“nx 1”向量。对于大型词汇表,其计算量大且速度较慢。
    • 如果新词被添加到词汇表中,则应该重新计算单位矩阵(即词向量)。使用先前计算的向量训练的模型可能会变得无效,必须重新训练。