如何使用文本作为神经网络的输入 - 回归问题?一篇文章将获得多少赞/掌声

人工智能 神经网络 机器学习 深度学习 自然语言处理 循环神经网络
2021-11-01 17:39:35

我正在尝试使用 NN 预测文章或帖子的点赞数。

我有一个大约 70,000 行和 2 列的数据框:“文本”(预测器 - 文本字符串)和“喜欢”(目标 - 连续 int 变量)。我一直在阅读 NLP 问题中采用的方法,但我对 NN 的输入应该是什么样子感到有些迷茫。

这是我到目前为止所做的:

  1. 文本清理:去除html标签、停用词、标点符号等...
  2. 小写文本列
  3. 代币化
  4. 词形还原
  5. 词干

我将结果分配给一个新列,所以现在我有“clean_text”列,上面应用了所有内容。但是,我不确定如何进行。

在大多数 NLP 问题中,我注意到人们使用词嵌入,但据我了解,这是尝试预测文本中的下一个词时使用的一种方法。学习词嵌入为在语法上彼此相似的词创建了向量,在我的例子中,我看不到如何使用它来推导每个词对目标变量的权重/影响。

另外,当我尝试使用 Gensim 库生成一个词嵌入模型时,它产生了超过 50k 的词,我认为这会使 onehot 编码变得过于困难甚至不可能。即使这样,我也必须对每一行进行一次热编码,然后为所有行创建一个具有相似长度的填充以提供给 NN 模型,但是我创建的新列“clean_text”中每一行的长度变化很大,所以它会导致非常大的 onehot 编码矩阵,这是一种冗余。

我接近这个完全错误吗?我该怎么办?

1个回答

我会分几个阶段回答。

我对 NN 的输入应该是什么样子感到有些迷茫。

您的选择归结为两个选项,每个选项都有自己的多种变体:

  1. 向量表示:您的输入是与您的词汇表大小相同的向量,其中元素表示输入示例中的标记。最基本的版本是词袋 (BOW) 编码,输入示例中出现的每个单词为 1,否则为 0。其他一些变体是(标准化)字数或TF-IDF价值观。使用这种表示填充将不是必需的,因为每个示例都将被编码为与词汇表大小相同的向量。但是,它存在各种问题:输入是高维且非常稀疏的,这使得学习变得困难(正如您所注意到的),它不编码词序,并且单个词表示几乎没有(TF-IDF)甚至没有( BOW,计数)语义信息。它还将您的 NN 架构限制为前馈网络,因为更“有趣”的架构(如 RNN、CNN 和转换器)假设类似矩阵的输入,如下所述。

  2. 矩阵表示:在这里,您的输入表示是一个矩阵,每一行都是输入示例中该索引处标记的向量(即嵌入)表示。如何将预训练嵌入实际导入模型取决于许多特定于实现的因素,但这个 stackoverflow 问题显示了如何将嵌入从 gensim 加载到 PyTorch。这里填充是必要的,因为输入示例将具有可变数量的标记。这个stackoverflow答案展示了如何在 PyTorch 中添加零填充。这种表示将明显优于向量表示,因为它是相对低维和非稀疏的,它保持词序,并且使用预训练的词嵌入意味着您的模型将可以访问语义信息。事实上,最后一点引出了你的下一个问题。

学习词嵌入为在语法上彼此相似的词创建了向量,在我的例子中,我看不到如何使用它来推导每个词对目标变量的权重/影响。

词嵌入基于分布式语义的假设,其核心原则经常被引用为“一个词的特征在于它所拥有的公司”。也就是说,一个词的含义它与其他词的关系。在 NLP 的上下文中,模型可以做出更好的决策,因为从一开始就对相似的词进行了类似的处理。

例如,假设有关毛茸茸的宠物的文章获得了很多赞(如果你问我,这完全有道理)。然而,这些文章中提到的毛茸茸的宠物会有所不同,包括“狗”、“猫”、“龙猫”、“贵宾犬”、“狗狗”、“好男孩”等词。处理这些的输入表示完全不同的提及(例如 BOW)将需要学习每个单词与喜欢的数量之间的个体相关性(这需要大量学习)。另一方面,训练有素的词嵌入将能够立即将这些提及组合在一起,并学习相似词和喜欢组之间的一般相关性。公平警告,这是对词嵌入为何起作用的非常不精确的描述,但我希望它能给您一些直观的理解。

最后,由于您正在进行回归,因此请确保相应地选择目标函数。均方误差将是我的第一次尝试。